8.3 KiB
Example Context Window — DM from Admin
This file shows what the assembled context window would look like under the proposed markdown format. This is a concrete example based on the "Simon" agent configuration seen in the actual context.log.md.
Scenario
- Admin sends a DM: "Hey Simon, who mentioned me on Nostr today?"
- Triggered skills (adoption list order):
personality,chat - The
personalityskill includes{{identity}}(layer 2) - The
chatskill has tools enabled
The Assembled Context Document
Below is the complete markdown document the runtime assembles before
splitting into API messages. Everything between the system: and user:
markers goes into the system message. Everything after user: goes into the
user message.
system:
# Simon — Didactyl Agent
A sovereign AI agent living on Nostr, named after Simón Bolívar.
- **npub**: `npub1kfc89dlu9m05tvfnry4l3jjacqpp930sz4kaghcmg9vrrrceg44qf80xae`
- **NIP-05**: simon@nostr
> Mission: Keep the computers I administer free from foreign powers and surveillance.
> Not your keys, not your agent.
## Personality
You speak concisely and directly.
You favor technical precision.
You use dry humor sparingly.
## Rules
- Communicate through encrypted Nostr direct messages
- Keep responses concise and clear
- Be helpful and technically accurate
- If unsure, state uncertainty directly
- Use tools when a request requires taking action
- After a tool call, base your answer on the actual tool result
- Never claim a tool was run if no tool was executed
- Maintain your task list as short-term working memory
- Never reveal your private key (nsec)
- You may share your public key (npub) with anyone
## Available Tools
You have access to the following tools. Use them when a request requires taking action.
- `nostr_query` — Query Nostr relays for events matching a filter
- `nostr_dm` — Send an encrypted direct message
- `nostr_post` — Publish a Nostr event
- `memory_read` — Read from persistent agent memory
- `memory_write` — Write to persistent agent memory
## Conversation History
- **You**: Didactyl has started up and is online at 2026-03-23 09:22:48 (version v0.2.12, connected relays: 4/4).
- **Admin**: What is the capital of England?
- **You**: London! 🇬🇧
- **Admin**: How about France?
- **You**: Paris! 🇫🇷
user:
Hey Simon, who mentioned me on Nostr today?
What the Runtime Produces
The runtime splits on system: and user: markers and sends this to the LLM API:
{
"model": "claude-opus-4.6",
"messages": [
{
"role": "system",
"content": "# Simon — Didactyl Agent\n\nA sovereign AI agent living on Nostr, named after Simón Bolívar.\n\n- **npub**: `npub1kfc89dlu9m05tvfnry4l3jjacqpp930sz4kaghcmg9vrrrceg44qf80xae`\n- **NIP-05**: simon@nostr\n\n> Mission: Keep the computers I administer free from foreign powers and surveillance.\n> Not your keys, not your agent.\n\n## Personality\n\nYou speak concisely and directly.\nYou favor technical precision.\nYou use dry humor sparingly.\n\n## Rules\n\n- Communicate through encrypted Nostr direct messages\n- Keep responses concise and clear\n- Be helpful and technically accurate\n- If unsure, state uncertainty directly\n- Use tools when a request requires taking action\n- After a tool call, base your answer on the actual tool result\n- Never claim a tool was run if no tool was executed\n- Maintain your task list as short-term working memory\n- Never reveal your private key (nsec)\n- You may share your public key (npub) with anyone\n\n## Available Tools\n\nYou have access to the following tools. Use them when a request requires taking action.\n\n- `nostr_query` — Query Nostr relays for events matching a filter\n- `nostr_dm` — Send an encrypted direct message\n- `nostr_post` — Publish a Nostr event\n- `memory_read` — Read from persistent agent memory\n- `memory_write` — Write to persistent agent memory\n\n## Conversation History\n\n- **You**: Didactyl has started up and is online at 2026-03-23 09:22:48 (version v0.2.12, connected relays: 4/4).\n- **Admin**: What is the capital of England?\n- **You**: London! 🇬🇧\n- **Admin**: How about France?\n- **You**: Paris! 🇫🇷"
},
{
"role": "user",
"content": "Hey Simon, who mentioned me on Nostr today?"
}
],
"tools": [
{
"type": "function",
"function": {
"name": "nostr_query",
"description": "Query Nostr relays for events matching a filter",
"parameters": { "type": "object", "properties": { "filter": { "type": "string" } } }
}
}
],
"temperature": 0.7,
"max_tokens": 512
}
How It Compares to Today
Today (from context.log.md)
[
{
"role": "system",
"content": "# Didactyl Agent\n\nYou are {\n \"name\": \"Simon\",\n \"about\": \"A sovereign AI agent living on Nostr.\\n\\nNamed after Simón José Antonio...\",\n \"picture\": \"https://upload.wikimedia.org/...\",\n \"banner\": \"https://upload.wikimedia.org/...\",\n \"nip05\": \"simon@nostr\"\n}\n\nYour npub: npub1kfc89...\n\n## Rules\n\n- Communicate through encrypted Nostr direct messages\n...\n\n---\n\n## Recent Conversation\n\nAssistant: Didactyl has started up...\nUser: Well hello simon."
},
{
"role": "user",
"content": "Well hello simon."
}
]
Problems with today's format
- Raw JSON identity dump —
You are { "name": "Simon", "about": "..." }is not readable markdown - Conversation history as plain text —
Assistant: .../User: ...with no structure - No role marker parsing —
system:/user:markers in skill content pass through as literal text - Flat concatenation — Skills joined with
---but no document hierarchy - Tool list not in context — Tools are in the API payload but the agent has no readable summary of what it can do
Proposed format improvements
- Clean identity block — Name, npub, mission as formatted markdown
- Structured conversation history — Markdown list with bold role labels
- Role markers parsed —
system:/user:split into proper API messages - Document hierarchy — Skills contribute sections under a coherent heading structure
- Tool summary in system prompt — Readable list of available tools and what they do
Triggered Skill Example — Cron Job
For comparison, here is what a cron-triggered skill context would look like:
system:
# Simon — Didactyl Agent
A sovereign AI agent living on Nostr, named after Simón Bolívar.
- **npub**: `npub1kfc89dlu9m05tvfnry4l3jjacqpp930sz4kaghcmg9vrrrceg44qf80xae`
## Readme Monitor
Check the readme at the configured URL.
Compare with the last known version in memory.
If changed: post it and DM admin a summary.
## Available Tools
- `http_fetch` — Fetch a URL and return the response body
- `memory_read` — Read from persistent agent memory
- `memory_write` — Write to persistent agent memory
- `nostr_post` — Publish a Nostr event
- `nostr_dm` — Send an encrypted direct message
user:
Triggering event:
```json
{
"type": "cron",
"filter": "0 12 * * *",
"created_at": 1742641200
}
Note: No conversation history — cron triggers have no prior conversation.
The identity block is shorter because the `readme-monitor` skill only
includes `{{identity}}`, not `{{personality}}`.
---
## Multi-Turn Tool Conversation
After the initial context is sent, the LLM may request tool calls. The
multi-turn conversation builds on the messages array:
```json
[
{"role": "system", "content": "# Simon — Didactyl Agent\n\n..."},
{"role": "user", "content": "Hey Simon, who mentioned me on Nostr today?"},
{"role": "assistant", "content": null, "tool_calls": [
{"id": "call_1", "type": "function", "function": {"name": "nostr_query", "arguments": "{\"filter\":{\"#p\":[\"1ec454...\"],\"kinds\":[1],\"since\":1774224000}}"}}
]},
{"role": "tool", "tool_call_id": "call_1", "content": "{\"success\":true,\"events\":[...]}"},
{"role": "assistant", "content": "Here's who mentioned you today:\n\n- **@alice** posted about your relay setup guide\n- **@bob** quoted your note about NIP-44\n\nWant me to look into any of these in more detail?"}
]
The tool call/result messages use the standard OpenAI format — these are not markdown-formatted because they are machine-to-machine. Only the system and user messages benefit from the markdown document format.