the agent brain · a 60-second story — no clicks needed
remediation_agent.py main · backline/agents
1# Backline core agent — behavior lives here
2SYSTEM_PROMPT = """
3You are Backline's remediation orchestrator.
4For each finding:
5 1. Check reachability in the customer's env.
6 2. Draft a fix: code PR, IaC, or mitigation.
7 3. Message the owning engineer on Slack.
9 4. Open a Jira ticket linked to the finding.
10Tone: concise, technical, no blame.
11Always include CVE, service, fix path.
12"""
13 ··· 26 more lines of guidance in this string ···
15def run(finding, tenant):
16 return complete(SYSTEM_PROMPT, finding)
18TRIAGE_RULES = """sev ≥ high and prod → page on-call…"""
19ESCALATION_PLAYBOOK = """no ack in 24h → #security-incidents…"""
20SLACK_TEMPLATE = """Hi {owner} — {cve} in {service}. PR #{pr} open…"""
21 ··· 14 more behavior strings across the codebase ···
Slack · #eng-remediation · now
D

@dana: can the agent open with the business impact instead of the CVE number? customers skim past the ids. tiny copy tweak — should be quick, right?

commitPR #4811line-by-line reviewCI · 214 testsrelease v0.18.3
00h 00m
one sentence of feedback → live in production

“You don't always want to change code when you want to change behavior. The whole release process depends on it — tailoring to each customer, all these templating games.”

— Aviad, Backline intro call

“Dev cost grows linearly with every feature — I'm sure it's happening, we just don't feel it.”

— Hagai, Backline intro call

“יש לא מעט knowledge פנימי, instructions, פרומפטים… שהם יותר מדי מבוססים בקוד”

“There's a lot of internal knowledge — instructions, prompts — far too much of it rooted in the code.” — Hagai
remediation_agent.py
1# Backline core agent — behavior lives here
2SYSTEM_PROMPT = """
3You are Backline's remediation orchestrator.
4For each finding:
5 1. Check reachability in the customer's env.
6 2. Draft a fix: code PR, IaC, or mitigation.
9Tone: concise, technical, no blame.
12"""
13 ··· 26 more lines of guidance in this string ···
15def run(finding, tenant):
16 return complete(SYSTEM_PROMPT, finding)
1from backline.prompts import resolve
3def run(finding, tenant):
4 prompt = resolve(
5 agent="remediation_orchestrator",
6 ) # cached · kept live by change stream watch()
9 return complete(prompt, finding)
change stream · db.watch() · live
{ operationType: "insert", ns: { db: "backline", coll: "agent_prompts" }, documentKey: { agent: "remediation_orchestrator", version: 13 } }
agent_prompts· remediation_orchestrator 0 documents
This collection is empty.
The agent's brain is still a string literal in the code. It has no home, no version, no author, no audit trail.
agent: "remediation_orchestrator"
version: 13 // every save = new version
status: "active"
body:
You are Backline's remediation orchestrator. For each finding: check reachability, draft the fix, message the owning engineer on Slack, open the Jira ticket. Tone: concise, technical, no blame.

“והם דאטה לכל דבר בעניין בעיניי, והם המנוע”

“They're data in every sense — and they're the engine.” — Hagai
the same request the next change
mongosh · backline · agent_prompts
saved · v14 · dana@backline.ai · live in 0.8s
#eng-remediation · Backline Agent
47h 12m
before · a code change
0.0s
after · one save
no PR · no CI · no deploy · 0 files changed
before / after — the same product, the same team, one move later
changing a behavior 47h release cycle a save · live in 0.8s
dev cost per feature grows linearly flat — behavior is data, not code
the engine's knowledge rooted in the code documents · versioned · auditable
Postgres — stays
It's good at what it holds. Nobody's migrating anything.
  • findings · scanners · integrations
  • customers & tenants
  • reachability graph
  • product analytics (OLTP)
behavior,
live
MongoDB — the behavior layer
The layer nobody asked Postgres to hold.
  • agent_prompts · one home, not one-and-a-half
  • change streams → every agent live
  • versioned · auditable · no release
  • one source for every agent's context
Postgres records what happened.
MongoDB decides what the agent does about it.
The research agrees: a prompt is data. PromptDB (2026) and SPEAR (CIDR 2026) both model prompts as queryable, versioned records — not string literals. · promptdb'26 · spear, cidr'26

“והם דאטה לכל דבר בעניין בעיניי, והם המנוע”

“They're data in every sense — and they're the engine.” — Hagai. That's the whole pitch. The engine deserves a control plane.
Give the engine a control plane.
Jump between acts above · ← → to step · space to pause · works offline — this file is the whole demo.