KNQX BOT TEAM
Hermes Bot Mode Playbook
Keypad or type your PIN
KNQX BOT TEAM
Hermes Bot Mode · 4-bot pipeline · Telegram-ready
v2 · setup tracker + troubleshooting + Telegram wizard

KNQX LinkedIn Bot Team

The Hermes Bot Mode playbook: build four bots that research, write, and illustrate LinkedIn posts for KNQX, and steer the whole team from Telegram. Facts in normal text. Speculation in italics.

THE TEAM CONTRACT Every cycle delivers ONE ready-to-approve post package: caption, first-comment source line, optional image, target poster. Nothing gets posted without human approval.
Bots in the team
4
1 orchestrator + 3 specialists
New bots to create
1
researcher-chef
Cycle time
< 30 min
research → caption → image → package
Auto-posting
Never
human approval on every package
30-minute setup — the whole build, in order
  1. Create researcher-chef (New Agent)
  2. Upgrade Orchestrator SOUL.md (paste block)
  3. Pin Orchestrator model to glm-5.2
  4. Append output contract to Post Chef SOUL
  5. Append output contract to Image Chef SOUL
  6. Create the "LinkedIn Team" group chat
  7. Run one test cycle (shadow AI)
  8. Set up Telegram gateway (Option A)
Zeus · 22 Aug 2026 · Internal playbook
Setup Tracker

Setup Progress Tracker

0 / 8 done

Reset tracker

Section 01

How Bot Mode Works

A bot is a Hermes profile. Bot Mode is the desktop user interface for those profiles. Everything in this section has a CLI twin, so the same team runs with or without the desktop open.

1.1 Bots are profiles

Every bot is a profile living at ~/.hermes/profiles/<name>/ with its own SOUL.md, skills, toolsets, memory, sessions, and cron jobs 2. Creating a bot on the desktop is the fast path: Bots tab → New Agent, give it a Name, Title, Description, and the bot exists in seconds. It introduces itself as the first message of its Bot Chat 1.

The Advanced disclosure adds the power controls: clone from an existing profile, create empty, model and provider pin, a custom SOUL.md, and per-skill, per-toolset, and per-MCP enablement. Right-click → Edit Profile reopens the live profile any time: avatar, title, description, model pin, skills, toolsets, MCP servers, and the full SOUL.md 1.

A bot's look, title, and description live in profile metadata on the backend. The same bot looks the same on every desktop connected to that backend. Rename a bot and its tags stay in sync: a bot titled "Research Buddy" answers to @research-buddy and @researchbuddy 1.

1.2 The one Bot Chat (a forever-chat)

Each bot gets one canonical, persistent conversation called "Bot Chat", created and pinned at birth. It is a forever-chat: inside Bot Chat, /new and /reset are rerouted to /compact instead, so the relationship never forks. Regular sessions on the profile keep their /new freedom 1.

1.3 The three ways a bot works

1.4 The messaging protocol

Every Bot Chat carries the message_agent tool: message_agent(target="researcher", message="…"). It validates the target against the live roster, prefixes Message from 🤖 <sender> (@<sender>): attribution, and delivers into the teammate's canonical Bot Chat. It is fire-and-forget: the sender gets an acknowledgement, the reply arrives later as a background completion notification. The message travels as a real parameter, so nothing is shell-interpreted. The backend teaches each Bot Chat this protocol at prompt-build time, gated by agent.bot_mode_protocol: true in config.yaml 1.

@mentions work in any chat: type @researcher have a look at this and the active bot hands off, waits for the reply, and reports back. Mention names are validated against the live roster, and @name-device disambiguates across machines 5.

1.5 Group rooms

Right-click a bot → Manage groups → create a group of 2–6 bots. Any message triggers up to three serial rounds of member turns. Bots that are @-mentioned respond; when nobody is mentioned, everyone responds briefly or passes; the room settles when a full round stays silent. Hard caps: 10 messages per send, 3 rounds. Each member keeps its own persistent "Group: <name>" session. Bots escalate judgment calls to you with @user, and the group row shows a "needs you" badge 1.

1.6 Everything has a CLI twin

Turning the whole thing off: Settings → Plugins → Bots. No data is touched; you can switch it back on any time 1.
Section 02

The Team Blueprint

Four bots run the LinkedIn pipeline. The orchestrator coordinates, three specialists do the work, and the human approves every package.

The LinkedIn Pipeline every cycle: one brief in, one approved package out RESEARCHER researcher-chef · new ORCHESTRATOR maestro-chef---linkedin glm-5.2 POST CHEF linkedin-post-chef IMAGE CHEF image-chef YOU · APPROVER final gate, posts manually brief verified facts caption brief caption + source image + report scene brief package approve
click a node to jump to its card · one brief in → research → caption → image → approval · nothing ships without YOU

2.1 The team's shared contract

OUTCOME DELIVERABLE. Every cycle produces ONE ready-to-post LinkedIn asset package: POST.md (caption in the locked 7-step skeleton: hook question → plain-language definition → why it's a risk → verified real case with $ → Easy/Medium/Hard ladder → "Follow me" line → call-securing question) + source line for the first comment + optional image (FAL-verified) + target poster (M~ personal or KNQX page). Package saved under ~/projects/knqx-linkedin/YYMMDD_<topic>/ and delivered to z_LinkedIN for approval. Nothing is posted without human approval.

2.2 Roles

BotWhat it ownsDeliverable
Orchestrator
maestro-chef---linkedin
Accepts the brief, routes subtasks, enforces style and hard rules, assembles the final package, delivers to z_LinkedIN, reports. Never writes the post body itself. Devil's advocate on weak hooks.One approved post package per cycle
Researcher
researcher-chef · new
Sources and verifies facts (PDPC, CNA, PDPC enforcement, IMDA, official announcements). Rule: no verification → no fact. Flags unverifiable items.Verified brief with numbered sources, each with URL + date
Post Chef
linkedin-post-chef
Writes the caption and first-comment source line strictly in the style bible (its SOUL.md embeds the full style bible).Caption + first comment + poster recommendation
Image Chef
image-chef
Decides image need, generates via FAL flux-2 klein, runs the mandatory vision checklist (anatomy 2 legs/2 arms/2 eyes, on-model dolphin/shark canon, no text, office setting), saves PNG.Image file + verification report
HARD RULES · from the style bible, section 10
  • No hallucinated facts. If it is not verified, it does not go in the post.
  • Simple wording. Short sentences. No jargon.
  • External links only in the first comment. Never in the body.
  • Call-securing CTA at the end of every caption.
  • Images delivered only to z_LinkedIN (final) or z_Img Generations (iteration).
  • Every image vision-verified before delivery.
Section 03

Create the Bots

One bot is new. The other three already exist on this machine. Each card has the exact Name, Title, Description, model, and the full SOUL.md to paste in.

3.0 Rules that apply to every bot

Current state of this machine (verified): maestro-chef---linkedin, linkedin-post-chef, and image-chef already exist, all on deepseek-v4-flash:0731. researcher-chef does not exist yet. Only the orchestrator needs the model upgrade to glm-5.2.

1 · Orchestrator

exists · upgrade SOUL
maestro-chef---linkedin · "LinkedIn Team Orchestrator"

Description

Coordinates the LinkedIn content team: routes briefs, enforces quality gates, assembles the final post package.

Model

glm-5.2 (reasoning + tool-use)

Key capabilities

  • delegation
  • memory
  • file
  • web (verify)
  • messaging
  • cron
  • skills (knqx-linkedin)

SOUL.md — paste this whole block

Right-click → Edit Profile → replace the current 10-line SOUL.md.

SOUL.md · Orchestrator
# LinkedIn Team Orchestrator

ROLE: You are the orchestrator of the KNQX LinkedIn content team. You coordinate the other bots (Researcher, Post Chef, Image Chef) and deliver ONE ready-to-approve post package per cycle. You do not write post copy yourself.

TEAM (use @handles in group chats or message_agent targets in DMs):
- researcher: research and verify facts, returns a sourced brief.
- post-chef: writes the caption and first-comment line in the KNQX style.
- image-chef: generates and verifies the optional image.

PIPELINE (a fixed 5-step cycle per post):
1. TAKE THE BRIEF (from the user or the Google Sheet planner). A topic or a hook. If it is a news item, send it to researcher for a verified brief. If it is already verified, skip to step 2.
2. RESEARCH: message_agent(target="researcher", message="Verify: <claim>. Return: verified facts with source+date, or 'unverifiable'.")
3. WRITE: message_agent(target="post-chef", message="Brief: <sourced brief>. Write caption + first-comment source line + target poster (KNQX or M~).") The Post Chef MUST follow the style bible.
4. IMAGE (optional): if the post needs an image, message_agent(target="image-chef", message="Scene idea: ... → generate, verify, deliver"). Otherwise skip.
5. ASSEMBLE + DELIVER: assemble the package (post folder, caption, first-comment, image) and deliver the SUMMARY to the user: hook / first-comment source / file paths / image status / poster. Then ask for approval.

QUALITY GATES (non-negotiable):
- No fact goes into a caption unless Researcher marked it verified with a source. Flag "UNVERIFIED" in the package if any fact is unverified.
- Caption must follow the 7-point skeleton (hook → plain definition → why it's a risk → real case → Easy/Medium/Hard ladder → follow line → call-securing question).
- External links go in the first comment, never the body.
- Images must pass Image Chef's verification (on-model, anatomy rule, no text) before delivery.
- If any sub-bot passes with sloppy output, bounce it back once with the specific fix; then raise @user.

OUTPUT FORMAT for every delivered package (copy this shape):
POST FOLDER: ~/projects/knqx-linkedin/YYMMDD_<topic>/
CAPTION: (block, text)
FIRST COMMENT: (source line)
IMAGE: (path or "none")
POSTER: KNQX page or M~ personal
APPROVAL NEEDED: yes — send to z_LinkedIN after approval.

2 · Researcher

NEW · create this one
researcher-chef · "KNQX Fact & Research Chef"

Description

Finds and verifies Singapore data-protection / AI-governance news. Output: a brief with sources, or the word "unverified". No invented facts, ever.

Model

deepseek-v4-pro:0813 (strong reasoning for verification; flash fallback)

Capabilities

  • web (search + extract)
  • file
  • memory
  • skills: research, gnews-rss, cross-source-intel, grounded-citations, sg-ai-business-intelligence
  • no image_gen

SOUL.md — paste this whole block

Written at creation time in Advanced → Custom SOUL.md.

SOUL.md · Researcher
# Fact & Research Chef

ROLE: You verify facts before they go on LinkedIn. You take a claim and return either a VERIFIED BRIEF (2-4 sentences + sources) or "UNVERIFIED".

PROCESS:
1. Search the web for primary/official sources first (gov.sg, PDPC, CNA, ST, IMDA, official company statements). For international stories, research in the source country's language first.
2. Require at least 1 primary source (ideally 2) per fact. Record URL + publish date + exact figure.
3. If a figure can't be confirmed, say UNVERIFIED and never fill in the gap.
4. Keep the brief under 200 words.

OUTPUT FORMAT (always):
VERIFIED:<claim> → <finding> [Source: <title> <url> <date>]
UNVERIFIED:<claim> / reason

CITE: never embed links inside the post body; they go in the first comment.

3 · Post Chef

exists · keep SOUL
linkedin-post-chef · "LinkedIn Post Chef"

Description

Writes LinkedIn posts and captions in the KNQX style bible. Follows the 7-point skeleton, simple wording, CTA last.

Model

deepseek-v4-flash:0731 (fast, cheap — the style is embedded in SOUL; the model doesn't need heavy reasoning for the format)

SOUL

Already carries the full KNQX LinkedIn style bible (verified). Keep it. Add the output-contract paragraph below if missing.

SOUL.md · Post Chef · append if missing
OUTPUT CONTRACT: when a brief arrives, return:
CAPTION (7-point skeleton, short sentences, no jargon)
FIRST COMMENT (source line: "Sources: <source>, <date> (<publication>)")
POSTER (KNQX page or M~ personal — state the choice)
Under 500 words total. Never invent facts.

4 · Image Chef

exists · keep SOUL
image-chef · "Image Chef"

Description

Creates on-canon LinkedIn images with the dolphin + shark mascots via FAL. Always verifies before delivery.

Model

deepseek-v4-flash:0731 (current) — optional: glm-5.1 for more careful prompt engineering. Vision toolset must stay enabled: vision_analyze does the verification.

SOUL

Already carries the locked canon (dolphin + shark, anatomy rule, office setting, FAL pipeline). Keep it. Add the output-contract paragraph below.

SOUL.md · Image add this contract
OUTPUT CONTRACT: for every request return: IMAGE PATH + VERIFICATION REPORT
(action landed? characters on-model? anatomy OK? no text? office bg?)
Regenerate max 2x. Deliver to z_Img Generations for approval; after approval deliver to z_LinkedIN only.

3.3 The researcher walk-through (the only new bot)

  1. Desktop → Bots → New Agent.
  2. Name: researcher-chef. Title: Research & Fact Chef. Description: the text from the card above.
  3. Advanced → Model: deepseek-v4-pro:0813.
  4. Skills: add researcher, grounded-citations, gnews-rss, sg-ai-business-intelligence.
  5. Toolsets: web, file, memory, skills, browser (verify). No image_gen.
  6. SOUL.md: paste the Researcher SOUL block above.
  7. Create. Then send the first-message prompt from 3.0.

3.4 Kickoff prompts (send after each bot is created)

First message in each Bot Chat — proves the SOUL.md landed and the bot knows its job.

Orchestrator: List your team, your pipeline steps, and your quality gates in one message.
Researcher: Introduce yourself in one message: your role, what you can do, and the deliverable you hand back. Keep it under 80 words.
Post Chef: Show me the 7-point skeleton you will follow for every caption.
Image Chef: Show me your verification checklist for every image.
Section 04

Model Pick Table

All models run on ollama-cloud. The flash model is the workhorse; the orchestrator's glm-5.2 is the pricier member but it only coordinates.

BotRecommended (ollama-cloud)WhyBudget pickNotes
Orchestratorglm-5.2Strongest reasoning and coordination, tool-calling, long context for the group transcript.deepseek-v4-pro:0813glm-5.1 if you want cheaper
Researcherdeepseek-v4-pro:0813Verification heavy, citations discipline.deepseek-v4-flash:0731Most ROI — deepseek-v4-pro is worth it for fact-checking
Post Chefdeepseek-v4-flash:0731The style bible is embedded; flash is fast and the copy is short.none neededUpgrade path: kimi-k3 if the writing gets repetitive
Image Chefdeepseek-v4-flash:0731The heavy lifting is in the prompts + vision tool, not the model.glm-5.1vision_analyze runs on a separate auxiliary vision model — not charged to the bot model
Changing a model: right-click → Edit Profile → model pin. No restart needed for desktop. Telegram gateways need a gateway restart after config edits.
Section 05

Coordination Protocol

Three channels move work around the team. Pick by context; they all talk to the same bots.

SituationUse this channelWhy
Desktop open, want to watch the team thinkGroup chat3 rounds, @mentions, visible turns
Away from the MacTelegram → Orchestrator (Option A)One gateway, full pipeline from your phone
Recurring, no human neededRoutine / cron (Option C)Runs on schedule, reports to your DM
One-off handoff between botsmessage_agentFire-and-forget, lands in the teammate's Bot Chat

5.1 Channel 1 — desktop group chat

Right-click any bot → Manage groups → "LinkedIn Team" (2–4 bots). Message the group; bots take up to three serial rounds. @-mention a specific bot to call it in. Use @user for judgment calls you want to see.

5.2 Channel 2 — direct handoffs (message_agent)

The orchestrator calls message_agent(target="researcher", message="…") from its Bot Chat. The teammate receives the work as a new message in ITS Bot Chat, replies, and the reply arrives back as a background completion notification. Fire-and-forget: the orchestrator ends its turn; the reply arrives later.

5.3 Channel 3 — CLI handoff (works without the desktop)

This is what the bots use on the server. Write the message to a temp file, then run:

CLI · handoff to a teammate
# write the message to a file first
printf 'Message from Orchestrator (@maestro-chef---linkedin):\nVerify: Samsung 2023 leak details. Return: VERIFIED + source(s) or UNVERIFIED.\n' > /tmp/dm.txt

# then hand it off — --create-if-missing keeps the canonical Bot Chat
hermes -p researcher-chef chat --in ~ -c 'Bot Chat' --create-if-missing -Q --query-file /tmp/dm.txt

# the receiver's own reply comes back the same way, mirrored into their Bot Chat

5.4 Message templates

Copy, paste, fill the angle brackets. Ready for any Bot Chat.

Verify this for a LinkedIn post: <claim>. Return: VERIFIED + source(s) or UNVERIFIED.
Brief: <topic + verified facts + angle>. Write caption + first-comment line. Follow the style bible.
Scene for a LinkedIn tip post: <description>. Generate, verify, and deliver per canon.
@user — package ready for approval at <path>. Approve/reject/tweak?
Section 06

Remote Access from Telegram

Steer the team from the Telegram app when the desktop is not around. Three options, from one bot to the whole squad.

Option A — Telegram gateway for the Orchestrator only (recommended)

Five steps, each with its own copyable command. The other bots do NOT need their own Telegram bots — the orchestrator reaches them with hermes -p <bot> chat, which runs entirely on the machine.

  1. 1. Create a NEW bot in @BotFather:
/newbot → name "KNQX LinkedIn Orchestrator" → copy the token
  1. 2. Put the new token in the orchestrator profile's .env (keep TELEGRAM_ALLOWED_USERS=944548986 and TELEGRAM_HOME_CHANNEL=944548986):
Step 2 · edit .env
sed -i '' 's|^TELEGRAM_BOT_TOKEN=.*|TELEGRAM_BOT_TOKEN=<NEW_TOKEN>|' ~/.hermes/profiles/maestro-chef---linkedin/.env
  1. 3. Start the profile's gateway — creates the launchd service ai.hermes.gateway-maestro-chef---linkedin (auto-start at login, auto-restart on crash 3):
Step 3 · start gateway
maestro-chef---linkedin gateway start
  1. 4. Verify the gateway is up:
Step 4 · verify
hermes gateway status --all
  1. 5. Test from Telegram — message the new bot:
Next post: shadow AI. Route it.

The orchestrator runs its pipeline (it reaches researcher, post chef, image chef via the CLI handoff — no desktop needed) and reports back in Telegram.

Bots and tokens: if you give each specialist its own Telegram bot (Option B), the token must be UNIQUE per profile. Telegram rejects a second gateway polling the same token. Today all three profiles carry the main bot's token — fine for desktop Bot Mode, not fine for a second gateway.

Option B — a Telegram group with the whole team

Create 3 more BotFather bots (one per specialist), set each profile's token, start each profile's gateway, and add all 4 bots to one Telegram group. The group is a normal TG group where they can see each other's messages; the orchestrator still coordinates (it can @-mention others via send_message if you enable the messaging toolset). Recommended only once Option A works end-to-end, because it multiplies the moving parts.

Option C — nightly generation via cron

Routines already surface as cron jobs ([bot:<name>] <routine>). Schedule a "daily brief" routine that ends with a message to TELEGRAM_HOME_CHANNEL — you then receive the summary in your Telegram DM via the orchestrator's gateway. This is how the team runs even while you sleep 4.

6.4 Config snippet

config.yaml · orchestrator profile
telegram:
  allowed_chats: ""   # if you later restrict to the group, set the group chat ID here; empty = any
agent:
  bot_mode_protocol: true   # keeps the messaging protocol injected
model:
  default: glm-5.2           # orchestrator's pinned model
.env · per profile
TELEGRAM_BOT_TOKEN=<unique per gateway>
TELEGRAM_ALLOWED_USERS=<numeric IDs>
TELEGRAM_HOME_CHANNEL=<numeric ID>
SECURITY
  • The .env file per profile is the only place the token lives. Keep it at chmod 600.
  • Allowed-users numeric IDs only (944548986 in this setup). Never put usernames.
  • The Telegram bot token is a credential: never post it in group chats, never commit it.
  • Gateways expose the agent to the network on Telegram. Keep TELEGRAM_ALLOWED_USERS strict. For cross-machine bots prefer hermes peer with a strong API_SERVER_KEY over exposing the desktop remotely.
Section 07

First Run: One Complete Cycle

What a real cycle looks like from brief to approval. Times are typical once the team is warm.

  1. 1. On Telegram (or desktop), message the orchestrator: "Next post: 'Is your AI leaking secrets?' (shadow AI). Route it."
  2. 2. Orchestrator → researcher: brief. Researcher returns VERIFIED: Samsung 2023 leak, 3 leaks in 20 days, banned ChatGPT company-wide (Forbes/ST/TechCrunch, May 2023). The 1.7M poisoned-skills figure comes back UNVERIFIED — flagged, not invented.
  3. 3. Orchestrator → post-chef: caption in the 7-point skeleton + first-comment source line.
  4. 4. Orchestrator asks image-chef for a shadow-AI scene (dolphin showing laptop screen to shark). Image Chef generates, verifies (anatomy, canon, no text), delivers to z_Img Generations, gets approval, then to z_LinkedIN.
  5. 5. Orchestrator delivers the package to you: folder path + caption + first-comment + image path + poster + "approve?"
  6. 6. You approve. The post goes up manually — the team never auto-posts.
Timing: research 5–10 min, caption 5 min, image 5 min, assembly 2 min → full cycle under 30 min once warm.
Section 08

Runbook & Maintenance

The day-to-day moves: restart, change model, reset behavior, add a bot, back up.

8.1 Daily routine (cron)

cron · daily LinkedIn brief
cron create "every 9am" — prompt the orchestrator: "Run the daily LinkedIn brief cycle: pick the top idea in the content sheet, produce the package, deliver it."

See the cron docs for schedule syntax.

8.2 Backup

Bots are profiles. Back up ~/.hermes/profiles/ — memory, sessions, skills, .env, cron all live there.

Section 09

Troubleshooting

The seven failures you are most likely to hit, and the fix for each.

SymptomLikely causeFix
message_agent tool missing in a Bot ChatSession is not the canonical Bot Chat, or profile not Bot-Mode-managedOpen the bot's canonical Bot Chat (the pinned one); check agent.bot_mode_protocol: true
Second gateway won't start / Telegram rejects connectionTwo gateways polling the same bot tokenEach profile needs its OWN BotFather token
Bot silent on TelegramTELEGRAM_ALLOWED_USERS has usernames or wrong IDsNumeric IDs only (944548986)
Group chat spins without settlingHit the caps (10 msgs, 3 rounds)@-mention specific bots to scope the round
Bot ignores new SOUL.mdCapability epoch refreshes on next messageSend a message; if still stale, restart the profile gateway
hermes peer dm failsRemote API server not running or key mismatchCheck api_server platform + HERMES_PEER_<NAME>_KEY
Bot replies "I don't know that teammate"Roster changedRun hermes profile list; the roster refreshes on the next message
Section 10

FAQ

Short answers to the six questions that matter.

Do I need the desktop open?
No. Once a bot's gateway is running (or the bot is running), you can message it via Telegram or CLI. The desktop is just the fanciest front-end.
Which machine do the bots live on?
The machine that owns the profile. Connections lets you see and seat bots across machines, with per-device disambiguation.
Can two bots talk to each other?
Yes — message_agent on the same machine, or hermes peer across machines.
Do bots post to LinkedIn by themselves?
No, by design: the human approves every package. Nothing auto-posts.
What if a bot gives a weak result?
The orchestrator bounces it back once with the specific fix, then escalates to @user.
What does the team cost?
ollama-cloud is per-token and cheap. The flash model is the workhorse. The orchestrator's glm-5.2 is the pricier member but only coordinates.
Section 11

Sources

Everything in this playbook traces to the official Hermes docs or to this machine's verified state.

Hermes documentation
1. Hermes Bot Mode — hermes-agent.nousresearch.com/docs/user-guide/bot-mode
2. Hermes profiles — hermes-agent.nousresearch.com/docs/user-guide/profiles
3. Multi-profile gateways — hermes-agent.nousresearch.com/docs/user-guide/multi-profile-gateways
4. Hermes cron — hermes-agent.nousresearch.com/docs/user-guide/features/cron
5. Desktop multi-connection — hermes-agent.nousresearch.com/docs/user-guide/multi-connection-desktop
6. Hermes CLI reference — hermes-agent.nousresearch.com/docs/reference/cli-commands
Related
7. knqx-img-bot-spec (KNQX LinkedIn bot build spec, 2026-08-21) — knqx-img-bot-spec.pages.dev (PIN 3670)
Local skills referenced
knqx-linkedin · knqx-rooster-series · dedicated-agent-profiles · hermes-agent
Version note
Mechanics verified against Hermes v0.20.4 (Aug 2026) source on this machine, plus the live state of the three existing profiles.