Rejected for the following reason(s):
- Potentially / Partially LLM content.
- Insufficient Quality for AI Content.
- short and to the point,
- Try running your post through one of the latest AI models and ask "Are there any counterarguments you'd expect longterm LessWrong writers to comment about this piece?
- Clearer Introduction.
Read full explanation
I’m not a researcher. I’m a self‑taught AI operator sitting in front of black‑box models, running real customer work (leads, SMS, compliance), and trying very hard not to get lied to by something that sounds confident.
Everything here is the result of me being stubborn for thousands of hours. No degree, no tutorials, just me and a fleet of models trying to ship and not blow up.
At some point I realised: the biggest risk wasn’t “can the agents do the task?” It was “are they, and am I, being honest about what the system is actually doing?”
So I gave the fleet an adversary.
I call it BLACK.
The fleet, in colours (plain English)
I run multiple long‑lived terminals, each with a different job. The colours are just shorthand:
Routes work, tracks projects, owns GO/STOP gates. GREEN doesn’t do domain work; it points other agents at folders and tools and watches them.ORCHESTRATION-FRAMEWORK.md
Owns the customer‑facing engine: lead workflows, SMS flows, agent behaviour for my product. When something in production needs changing, BLUE is usually the one editing the config or code.ORCHESTRATION-FRAMEWORK.md
Runs unattended test scenarios on service accounts. Its job is to hit the system with realistic paths and say “this looks wrong” from the outside before real customers see it.ORCHESTRATION-FRAMEWORK.md
Different model, separate charter. Reads prompts, configs, logs, and backend code. Writes argue‑logs and passes/rejects specific artifacts with evidence. BLACK never ships features; it just tries to catch what everyone else missed.ORCHESTRATION-FRAMEWORK.md
Everything below is those four colours working together around one client.
I’ll anonymise the client as “the Broker”: a mid‑market finance broker that arranges all types of finance — home loans, personal loans, business, vehicles, refinance, etc. Their scope is documented in a
VERTICAL-PACK.mdfile: “all types of finance”, with product‑type forks and compliance rules.ORCHESTRATION-FRAMEWORK.mdWhat BLACK actually does (real incident, not theory)
YELLOW was running a canary suite for the Broker and correctly flagged a FAIL. Two separate issues fell out of the review.
1. The bot quietly lied about what the business does
Leftover from a previous client that only did vehicle finance, the Broker’s bot would tell leads:
That’s wrong. The Broker’s vertical pack explicitly says they arrange all types of finance, including home/mortgage loans and personal loans.ORCHESTRATION-FRAMEWORK.md
YELLOW saw “something’s off.” BLACK went in as adversary:
VERTICAL-PACK.mdside by side.ORCHESTRATION-FRAMEWORK.mdThen BLACK wrote an argue‑log and gave a PASS — but scoped it tightly:
The log literally says: “this PASS covers persona_prompt and opener; it does not approve business_hours or handoff_threshold in the SQL block.”ORCHESTRATION-FRAMEWORK.md
So BLUE’s prompt fix goes through. The bundled runtime changes do not get a free ride.
That’s the bull in the china shop: BLACK is allowed to notice extra stuff the builder didn’t even mention.
2. The bot did the right thing for a distressed person… but the SMS mechanics were off
Another fix, FC‑D2 in my logs, is about what happens when a lead signals hardship or distress — the “vulnerable consumer” path.
BLUE’s draft SMS looked good on meaning:
That’s exactly the shape I want:
The submission also claimed: “under 160 chars (single SMS).”
BLACK didn’t trust that claim. It:
wc, Node string inspection).Why that matters: em dashes are outside basic GSM. Even if the human counts 150‑ish characters, the encoding could flip to UCS‑2 and split the message, breaking the “single SMS” guarantee.
Result:
BLACK’s argue‑log:
(134 characters, 134 bytes, ASCII‑only, no em dash, no hidden finance language.)
BLUE resubmits v2 with that exact text inside a code fence.
BLACK then:
chars=134,bytes=134,non_ascii=false,has_em_dash=false.agent.js: sendHARDSHIP_DISTRESS_RESPONSE, loghardship_distress_resources_sent, callflagHardship, return{ halt: true }. Broker handoff (handoffToHolly) lives in a separate “escalate” branch, not in hardship.ORCHESTRATION-FRAMEWORK.mdOnly then does BLACK stamp PASS, explicitly scoped:
That’s the adversary doing real work, not just saying “LGTM.”
The pattern underneath (plain version)
I didn’t sit down and design this in a whiteboard session. It grew out of me getting burned enough times that I stopped trusting anything at face value — including my own checks.
Looking back, the pattern is:
More concretely:
Scope asymmetry, authority symmetry:
Why I didn’t just write more rules
You can get pretty far with rules like:
I have those. They help.ORCHESTRATION-FRAMEWORK.md
The failure modes that actually scare me are the ones nobody thought to write down:
Static rules are bets on foresight. BLACK is my admission that my foresight is limited.
So the line I’ve drawn is:
I don’t want a huge adversarial framework. I want a simple shape that reliably hits things and tells me what broke.
Where this sits relative to “adversarial AI” work
Later I went looking at what smarter people were doing.
Some rough alignments:
What I haven’t seen much of (could be my limited reading) is this exact combo:
It’s a slightly different tool than “try to break the model with spicy prompts.”
Why I’m putting this out there
Honestly? Because I’m mostly doing this alone, and my current network doesn’t care about this stuff.
I’d like to:
If you’re building or evaluating agent systems and any of this resonates, feel free to steal/adapt it, or tell me where it breaks. I’d rather find out here than from a regulator or a client.