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.
- Create researcher-chef (New Agent)
- Upgrade Orchestrator SOUL.md (paste block)
- Pin Orchestrator model to glm-5.2
- Append output contract to Post Chef SOUL
- Append output contract to Image Chef SOUL
- Create the "LinkedIn Team" group chat
- Run one test cycle (shadow AI)
- Set up Telegram gateway (Option A)
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
- You talk to it. Open its Bot Chat on the desktop, message it over its Telegram gateway, or hit it from the CLI.
- It receives handoffs. Other bots send it work via
message_agentor@mentions. - It runs routines. The Routines pane attaches recurring tasks; they are plain Hermes cron jobs namespaced
[bot:<name>] <routine>and they show up inhermes cron list. Runs land in the bot's own chat history 4.
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
- Chat with a bot:
hermes -p <bot> chat6. - Manage profiles:
hermes profile create,hermes profile list,hermes profile rename6. - Cross-machine DMs:
hermes peer add spark --url http://spark.lan:8377 --key <API_SERVER_KEY>, thenhermes peer dm spark/researcher < /tmp/dm.txtdelivers into the remote agent's canonical Bot Chat over its gateway's API server. Once a peer is registered,message_agentaccepts peer targets likespark/researcher5. - Connections: Settings → Connections lists the local runtime, remote gateways, SSH hosts, and Hermes Cloud. The roster shows bots from every source and handles stay unambiguous.
The Team Blueprint
Four bots run the LinkedIn pipeline. The orchestrator coordinates, three specialists do the work, and the human approves every package.
2.1 The team's shared contract
~/projects/knqx-linkedin/YYMMDD_<topic>/ and delivered to z_LinkedIN for approval. Nothing is posted without human approval.2.2 Roles
| Bot | What it owns | Deliverable |
|---|---|---|
| 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 |
- 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.
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
- Desktop: Bots tab → New Agent. Quick path: Name, Title, Description. Then right-click → Edit Profile → Advanced: pick the model pin, skills and toolsets, and write the custom SOUL.md.
- CLI:
hermes profile create <name>, write~/.hermes/profiles/<name>/SOUL.mdand config.yaml by hand, then<name> gateway startonly if the bot needs Telegram access. - After creation: open the Bot Chat and send: "Introduce yourself in one message: your role, what you can do, and the deliverable you hand back. Keep it under 80 words."
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 SOULDescription
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.
# 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 oneDescription
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.
# 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 SOULDescription
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.
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 SOULDescription
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.
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)
- Desktop → Bots → New Agent.
- Name:
researcher-chef. Title: Research & Fact Chef. Description: the text from the card above. - Advanced → Model:
deepseek-v4-pro:0813. - Skills: add
researcher,grounded-citations,gnews-rss,sg-ai-business-intelligence. - Toolsets: web, file, memory, skills, browser (verify). No image_gen.
- SOUL.md: paste the Researcher SOUL block above.
- 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.
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.
| Bot | Recommended (ollama-cloud) | Why | Budget pick | Notes |
|---|---|---|---|---|
| Orchestrator | glm-5.2 | Strongest reasoning and coordination, tool-calling, long context for the group transcript. | deepseek-v4-pro:0813 | glm-5.1 if you want cheaper |
| Researcher | deepseek-v4-pro:0813 | Verification heavy, citations discipline. | deepseek-v4-flash:0731 | Most ROI — deepseek-v4-pro is worth it for fact-checking |
| Post Chef | deepseek-v4-flash:0731 | The style bible is embedded; flash is fast and the copy is short. | none needed | Upgrade path: kimi-k3 if the writing gets repetitive |
| Image Chef | deepseek-v4-flash:0731 | The heavy lifting is in the prompts + vision tool, not the model. | glm-5.1 | vision_analyze runs on a separate auxiliary vision model — not charged to the bot model |
Coordination Protocol
Three channels move work around the team. Pick by context; they all talk to the same bots.
| Situation | Use this channel | Why |
|---|---|---|
| Desktop open, want to watch the team think | Group chat | 3 rounds, @mentions, visible turns |
| Away from the Mac | Telegram → Orchestrator (Option A) | One gateway, full pipeline from your phone |
| Recurring, no human needed | Routine / cron (Option C) | Runs on schedule, reports to your DM |
| One-off handoff between bots | message_agent | Fire-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:
# 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
- The file must open with
Message from [Name] ([@name]):so the receiver knows who is talking. - Run the handoff with
background=trueandnotify_on_complete=true— it is a background job.
5.4 Message templates
Copy, paste, fill the angle brackets. Ready for any Bot Chat.
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. Create a NEW bot in @BotFather:
- 2. Put the new token in the orchestrator profile's .env (keep
TELEGRAM_ALLOWED_USERS=944548986andTELEGRAM_HOME_CHANNEL=944548986):
sed -i '' 's|^TELEGRAM_BOT_TOKEN=.*|TELEGRAM_BOT_TOKEN=<NEW_TOKEN>|' ~/.hermes/profiles/maestro-chef---linkedin/.env
- 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):
maestro-chef---linkedin gateway start
- 4. Verify the gateway is up:
hermes gateway status --all
- 5. Test from Telegram — message the new bot:
The orchestrator runs its pipeline (it reaches researcher, post chef, image chef via the CLI handoff — no desktop needed) and reports back in Telegram.
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
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
TELEGRAM_BOT_TOKEN=<unique per gateway>
TELEGRAM_ALLOWED_USERS=<numeric IDs>
TELEGRAM_HOME_CHANNEL=<numeric ID>
- 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_USERSstrict. For cross-machine bots prefer hermes peer with a strongAPI_SERVER_KEYover exposing the desktop remotely.
First Run: One Complete Cycle
What a real cycle looks like from brief to approval. Times are typical once the team is warm.
- 1. On Telegram (or desktop), message the orchestrator: "Next post: 'Is your AI leaking secrets?' (shadow AI). Route it."
- 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. Orchestrator → post-chef: caption in the 7-point skeleton + first-comment source line.
- 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. Orchestrator delivers the package to you: folder path + caption + first-comment + image path + poster + "approve?"
- 6. You approve. The post goes up manually — the team never auto-posts.
Runbook & Maintenance
The day-to-day moves: restart, change model, reset behavior, add a bot, back up.
- Restart a bot: right-click the bot, or run
<bot> gateway restart. - Change a bot's model: right-click → Edit Profile → model pin (desktop), or edit config.yaml (CLI).
- Reset a bot's behavior: edit SOUL.md (Edit Profile) → the next message picks up the new text; capability refresh makes Bot Chat re-read it on the next turn.
- Add a new bot: follow the 3.3 recipe.
- If a bot is hidden: it stops toasting but keeps working — routines and mentions still land.
8.1 Daily routine (cron)
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.
Troubleshooting
The seven failures you are most likely to hit, and the fix for each.
| Symptom | Likely cause | Fix |
|---|---|---|
message_agent tool missing in a Bot Chat | Session is not the canonical Bot Chat, or profile not Bot-Mode-managed | Open the bot's canonical Bot Chat (the pinned one); check agent.bot_mode_protocol: true |
| Second gateway won't start / Telegram rejects connection | Two gateways polling the same bot token | Each profile needs its OWN BotFather token |
| Bot silent on Telegram | TELEGRAM_ALLOWED_USERS has usernames or wrong IDs | Numeric IDs only (944548986) |
| Group chat spins without settling | Hit the caps (10 msgs, 3 rounds) | @-mention specific bots to scope the round |
| Bot ignores new SOUL.md | Capability epoch refreshes on next message | Send a message; if still stale, restart the profile gateway |
hermes peer dm fails | Remote API server not running or key mismatch | Check api_server platform + HERMES_PEER_<NAME>_KEY |
| Bot replies "I don't know that teammate" | Roster changed | Run hermes profile list; the roster refreshes on the next message |
FAQ
Short answers to the six questions that matter.
Do I need the desktop open?
Which machine do the bots live on?
Can two bots talk to each other?
message_agent on the same machine, or hermes peer across machines.Do bots post to LinkedIn by themselves?
What if a bot gives a weak result?
@user.What does the team cost?
Sources
Everything in this playbook traces to the official Hermes docs or to this machine's verified state.
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.