Files
Skald-Circle/agents
Daniele 5765941758
Nightly Build / build (push) Successful in 8m6s
feat(prompt): tell the agent what its sandbox can run
The agent had no way to know its container ships ffmpeg, ripgrep or
tesseract, so it either declined work it could do or spent a round finding
out. This adds a command list to the system prompt as a **discovery hint** —
explicitly not an inventory.

Every decision follows from it being a hint:

- The allowlist (~35 entries, `container/commands.rs`) is the curation; a
  full PATH dump is 800 entries of coreutils noise. The probe exists so the
  list cannot *lie*, not so it can discover: `command -v` at login means we
  never announce something a container recreate threw away.
- The rendered prose says the list is partial and names `command -v`, so a
  tool outside the allowlist costs one check rather than a wrong conclusion.
  An empty probe renders as an explicit "could not be read", never as
  silence under a heading promising a list.
- Order is the allowlist's own, grouped by kind of work — the grouping is
  the curation, and the reader is a model, not a grep.
- Staleness is cheap both ways, so there is no invalidation machinery: a
  login-time snapshot on `UserContext`, non-fatal, refreshed at next login.

The gate is the tool, not the sentinel. Every AGENT.md carries
`common/sandbox.md` — the four system agents included — and the section is
emitted iff the turn's model is shown `execute_cmd`, derived from
`allow_tools` plus the security group's visibility filter for a root turn
and from `child_defs` for a sub-agent: always the same definitions the model
will see. `has_execute_cmd` therefore joins the PrefixCache key, since the
group is switchable mid-conversation and that switch already rewrites the
tool payload in the same provider cache.

The fragment holds only the heading and one stable sentence; every
conditional claim lives in the renderer, because prose promising
`sudo apt-get install` is not the renderer's to retract when the tool is
absent. `execute_cmd`'s own description loses `(python + node available)`:
its job is steering away from the shell, and a capability advertisement
diluted it.
2026-08-09 09:49:50 +01:00
..

Agents

Adding a new agent: the skills index is opt-in

An agent sees the installed skills only if its AGENT.md carries the <!-- SKILLS_LIST --> placeholder, normally through <!-- INCLUDE: common/skills.md -->. There is no meta.json flag: the sentinel is the switch, exactly as it is for <!-- MCP_LIST -->.

So a new agent starts without the index and stays without it until someone adds the line. That is the deliberate direction of the default: the opposite one — an agent inheriting the index by forgetfulness — is the worse failure, because the index is written in the imperative ("you MUST read its SKILL.md") and an unattended type: system agent has its approvals auto-denied and sometimes no tools at all.

common/skills.md is one line and deliberately holds no prose, unlike common/mcp.md. Every word — the imperative header, the list, the closing rules — is produced by the renderer, so that an instance with no skills installed gets an empty string instead of a header promising a list that isn't there. (That is not hypothetical: the MCP section keeps its prose in the fragment, and its empty state once had the model invent a discovery tool to fill the gap.) The fragment cannot explain itself in place either — resolve_includes copies any line that is not an upper-case sentinel straight into the prompt, so a comment there would be read by the model.

The rule of thumb: a chat or task agent gets the include, a system agent does not. Put the line as low as possible in the prompt (by convention right after common/mcp.md) — anything above it survives in the provider's cached prefix when a skill is added or removed. crates/skald-core/src/agents.rs has a test that holds every shipped agent to this.

Agent icons — style guide

Each agent in the agents/ directory can have an icon/avatar declared in the "icon" field of its meta.json. The backend serves the file via GET /api/agents/{id}/icon.

Visual style

Icons are generated with Vector Paintings LoRA via ComfyUI in a warm, family-friendly style:

  • Style: painterly vector — bold shapes fused with expressive brushstrokes
  • Technique: vivid colours, emotion, motion, warm lighting
  • Format: square (1024×1024), rendered as a character portrait
  • Background: warm, cozy, medium-bright (no dark/no neon)
  • Subject: a warm animal character representing the agent's role, with contextual elements (tools, symbols, objects)
  • Palette: terracotta, amber, warm gold, coral, soft teal — warm and inviting
  • Trigger word: VectorPaintDaal must be included at the start of the prompt

Prompt template

VectorPaintDaal. A warm friendly {ANIMAL} character with a gentle smile, wearing {CLOTHING/ACCESSORIES}. It holds {OBJECT} and around it float {SYMBOLS}. Warm golden light, cozy atmosphere. {DOMINANT_COLOURS} palette. Expressive bold brushstrokes, painterly vector style. Family-friendly illustration, portrait of a kind {ROLE}.

Per-agent reference

Chat agents — warm animals

Agent Animal Role Elements Palette
Main Assistant 🦊 Fox General assistant Glowing threads connecting a heart, star, house Terracotta, amber, gold
Project Coordinator 🦡 Badger Family coordinator Floating threads linking heart, star, house, smiling face; cozy kitchen table Terracotta, amber, gold, coral
Researcher 🐿️ Squirrel Curious researcher Glowing book, magnifying glass, compass, scrolls, stars Terracotta, amber, soft teal, coral
Generalist 🦫 Beaver Handy executor Glowing multitool, wrench, paintbrush, trowel, cooking pot Terracotta, orange, amber, timber
Code Explorer 🕵️ Meerkat Curious analyst Magnifying glass, data trails, sparkling code symbols Terracotta, amber, deep blue, gold
Software Architect 🏗️ Heron Thoughtful planner Floating blueprints, geometric shapes, building blocks Terracotta, soft teal, amber, pale gold
Software Engineer 🔧 Bear Focused builder Glowing wrench, gears, circuit board, hammer, sparks Terracotta, orange, amber, steel grey
Spec Writer 📝 Owl Wise scribe Glowing quill, scrolls, open books, words floating mid-air Deep indigo, burnished gold, amber, cream
Tech Lead 👑 Stag Confident strategist Holographic kanban board, task cards, sub-agent symbols Warm amber, deep teal, gold, coral
Business Analyst 💼 Magpie Thoughtful evaluator Glowing clipboard, floating documents, abacus, data points Deep indigo, gold, soft teal, amber
Companion 🦦 Otter Children's friend Glowing pencil, smiling sun, star, open book, paintbrush Soft coral, amber, gold, gentle teal

System agents — insect family

System agents (type: "system") are invisible background agents that maintain the platform. They use insect characters to visually distinguish them from chat-facing agents.

Agent Animal Role Elements Palette
Event triage 👁️ Spider 🕷️ Watchful guardian Sensor nodes, glowing web, radar arcs, notification symbols (bell, letter, calendar) Dark purple, amber, soft cyan, warm grey
Private Memory Lint 🧹 Firefly Private memory caretaker Glowing lantern, memory fragments, tiny notes, sparkles Warm gold, amber, soft teal, gentle green
Shared Memory Lint 🧹 Bee 🐝 Shared space caretaker Scroll with guidelines, honey dipper, honeycomb shapes, tiny documents Warm amber, gold, soft teal, honey

Adding a new agent icon

  1. Generate the image using the Vector Paintings prompt template above (include VectorPaintDaal at the start)
  2. Save it as agents/{agent_id}/icon.png
  3. Add "icon": "icon.png" to the agent's meta.json (if not already present)
  4. No code changes needed — the backend serves whatever file path is declared in the manifest