Skip to content

Feature/v0.4.3 with customizations#17

Open
mionemedia wants to merge 312 commits intoopenagen:masterfrom
mionemedia:feature/v0.4.3-with-customizations
Open

Feature/v0.4.3 with customizations#17
mionemedia wants to merge 312 commits intoopenagen:masterfrom
mionemedia:feature/v0.4.3-with-customizations

Conversation

@mionemedia
Copy link

Summary

Describe this PR in 2-5 bullets:

  • Base branch target (master for all contributions):
  • Problem:
  • Why it matters:
  • What changed:
  • What did not change (scope boundary):

Label Snapshot (required)

  • Risk label (risk: low|medium|high):
  • Size label (size: XS|S|M|L|XL, auto-managed/read-only):
  • Scope labels (core|agent|channel|config|cron|daemon|doctor|gateway|health|heartbeat|integration|memory|observability|onboard|provider|runtime|security|service|skillforge|skills|tool|tunnel|docs|dependencies|ci|tests|scripts|dev, comma-separated):
  • Module labels (<module>: <component>, for example channel: telegram, provider: kimi, tool: shell):
  • Contributor tier label (trusted contributor|experienced contributor|principal contributor|distinguished contributor, auto-managed/read-only; author merged PRs >=5/10/20/50):
  • If any auto-label is incorrect, note requested correction:

Change Metadata

  • Change type (bug|feature|refactor|docs|security|chore):
  • Primary scope (runtime|provider|channel|memory|security|ci|docs|multi):

Linked Issue

  • Closes #
  • Related #
  • Depends on # (if stacked)
  • Supersedes # (if replacing older PR)

Supersede Attribution (required when Supersedes # is used)

  • Superseded PRs + authors (#<pr> by @<author>, one per line):
  • Integrated scope by source PR (what was materially carried forward):
  • Co-authored-by trailers added for materially incorporated contributors? (Yes/No)
  • If No, explain why (for example: inspiration-only, no direct code/design carry-over):
  • Trailer format check (separate lines, no escaped \n): (Pass/Fail)

Validation Evidence (required)

Commands and result summary:

cargo fmt --all -- --check
cargo clippy --all-targets -- -D warnings
cargo test
  • Evidence provided (test/log/trace/screenshot/perf):
  • If any command is intentionally skipped, explain why:

Security Impact (required)

  • New permissions/capabilities? (Yes/No)
  • New external network calls? (Yes/No)
  • Secrets/tokens handling changed? (Yes/No)
  • File system access scope changed? (Yes/No)
  • If any Yes, describe risk and mitigation:

Privacy and Data Hygiene (required)

  • Data-hygiene status (pass|needs-follow-up):
  • Redaction/anonymization notes:
  • Neutral wording confirmation (use ZeroClaw/project-native labels if identity-like wording is needed):

Compatibility / Migration

  • Backward compatible? (Yes/No)
  • Config/env changes? (Yes/No)
  • Migration needed? (Yes/No)
  • If yes, exact upgrade steps:

i18n Follow-Through (required when docs or user-facing wording changes)

  • i18n follow-through triggered? (Yes/No)
  • If Yes, locale navigation parity updated in README*, docs/README*, and docs/SUMMARY.md for supported locales (en, zh-CN, ja, ru, fr, vi)? (Yes/No)
  • If Yes, localized runtime-contract docs updated where equivalents exist (minimum for fr/vi: commands-reference, config-reference, troubleshooting)? (Yes/No/N.A.)
  • If Yes, Vietnamese canonical docs under docs/i18n/vi/** synced and compatibility shims under docs/*.vi.md validated? (Yes/No/N.A.)
  • If any No/N.A., link follow-up issue/PR and explain scope decision:

Human Verification (required)

What was personally validated beyond CI:

  • Verified scenarios:
  • Edge cases checked:
  • What was not verified:

Side Effects / Blast Radius (required)

  • Affected subsystems/workflows:
  • Potential unintended effects:
  • Guardrails/monitoring for early detection:

Agent Collaboration Notes (recommended)

  • Agent tools used (if any):
  • Workflow/plan summary (if any):
  • Verification focus:
  • Confirmation: naming + architecture boundaries followed (AGENTS.md + CONTRIBUTING.md):

Rollback Plan (required)

  • Fast rollback command/path:
  • Feature flags or config toggles (if any):
  • Observable failure symptoms:

Risks and Mitigations

List real risks in this PR (or write None).

  • Risk:
    • Mitigation:

faustoheikkinen and others added 30 commits March 13, 2026 18:24
…w-labs#3414)

* Ignore JetBrains .idea folder

* fix(ollama): support stringified JSON tool call arguments

* providers: allow ZEROCLAW_PROVIDER_URL env var to override Ollama base URL

Supports container deployments where Ollama runs on a Docker network host
(e.g. http://ollama:11434) without requiring config.toml changes.

Includes regression test ensuring the environment override works.

* fix(clippy): replace Default::default() with ProviderRuntimeOptions::default()

---------

Co-authored-by: Argenis <theonlyhennygod@gmail.com>
…eroclaw-labs#3450)

Add README and SUMMARY translations for 25 missing languages to match
the root-level README coverage. Update English docs hub and SUMMARY
with links to all localized hubs.

New languages: ar, bn, cs, da, de, el, es, fi, he, hi, hu, id, it,
ko, nb, nl, pl, pt, ro, sv, th, tl, tr, uk, ur. Also adds missing
SUMMARY.vi.md for Vietnamese.

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
zeroclaw-labs#3429)

* docs(i18n/zh-CN): Complete full Chinese documentation translation and i18n migration

  - Translate 58 core Chinese docs covering all modules (setup, reference, operations, security, hardware,
  contributor guides, etc.)
  - Migrate all .zh-CN.md files to i18n/zh-CN directory preserving original directory structure
  - Update internal links across 3 entry files:
    * Root README.zh-CN.md
    * docs/README.zh-CN.md
    * docs/SUMMARY.zh-CN.md
  - All links point to correct i18n paths with full accessibility
  - Align with Vietnamese i18n directory structure per project conventions

* fix(i18n/zh-CN): resolve all 30 blocking markdown lint errors
- Fix all MD022 blank lines around headings issues across 10 files
- Fix MD036 emphasis used as heading issue in refactor-candidates.md

* docs(i18n/zh-CN): resolve broken document reference link in root README.zh-CN.md

* fix(docs): repair double-quote HTML bug and broken relative links in zh-CN docs

- Remove stray extra `"` after href closing quotes in 6 HTML links in
  root README.zh-CN.md
- Fix relative link depth for files under docs/i18n/zh-CN/ that
  reference repo-root files (CONTRIBUTING.md, README.zh-CN.md,
  .github/workflows/, tests/, docs/SUMMARY.zh-CN.md): use correct
  number of `../` levels based on actual file location in the tree

---------

Co-authored-by: argenis de la rosa <theonlyhennygod@gmail.com>
Co-authored-by: Argenis <theonlyhennygod@gmail.com>
Co-authored-by: Argenis <theonlyhennygod@gmail.com>
Co-authored-by: Alix-007 <Alix-007@users.noreply.github.com>
* fix(config): recover docker runtime path on save

* style(config): align docker save path formatting

---------

Co-authored-by: Argenis <theonlyhennygod@gmail.com>
* fix(config): decrypt feishu channel secrets on load

* style(config): format feishu secret assertions

---------

Co-authored-by: Argenis <theonlyhennygod@gmail.com>
* fix(linq): accept current webhook payload shape

* style(linq): satisfy clippy lifetime lint

---------

Co-authored-by: argenis de la rosa <theonlyhennygod@gmail.com>
* ci: add x86_64-pc-windows-msvc to build matrix

* fix: prevent test deadlock in ensure_onboard_overwrite_allowed

Gate non-interactive terminal check behind cfg!(not(test)) so tests with
force=false do not hang waiting on stdin. cfg!(test) path bails immediately
with a clear message. No changes to extra_headers, mcp, nodes, or shellexpand.

---------

Co-authored-by: Argenis <theonlyhennygod@gmail.com>
…eroclaw-labs#3453)

* docs(readme): add v0.1.9a release highlights and contributor credits

Add "What's New in v0.1.9a" section covering web dashboard restyle,
new providers/channels, MCP tools, infrastructure updates, and fixes.
Add "Recent Contributors" table crediting key contributors with their
specific highlights for this release cycle.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(docs): use table format for release highlights to pass MD036 lint

Replace bold-text subsections with a table to satisfy the markdown
linter's no-emphasis-as-heading rule (MD036).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Update What's New and Recent Contributors sections to reference
v0.1.9b release.

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
After publishing a beta or stable release, dispatch a
repository_dispatch event to zeroclaw-website so it rebuilds
with the latest version tag automatically.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…#3459)

The system prompt has no documentation of channel media markers
([Voice], [IMAGE:], [Document:]), causing the LLM to misinterpret
transcribed voice messages as unprocessable audio attachments instead
of responding to the transcribed text content.

Re-applies fix from merged dev PR zeroclaw-labs#1697 which was lost during the
master branch migration.

Co-authored-by: Argenis <theonlyhennygod@gmail.com>
…eroclaw-labs#3469)

The website at zeroclawlabs.ai shows a copy button with
curl -fsSL https://zeroclawlabs.ai/install.sh | bash but the website
does not serve the script, returning 404.

Add install.sh as a GitHub release asset in both beta and stable
workflows so it is always available at a stable URL. Pass the raw
GitHub URL in the website redeploy dispatch payload so the website
can configure a redirect or proxy for /install.sh.

Closes zeroclaw-labs#3463
…claw-labs#3467)

Replace single-turn chat with persistent Agent to maintain conversation
history across WebSocket turns within the same connection.

Co-authored-by: staz <starzwan2333@gmail.com>
Co-authored-by: Argenis <theonlyhennygod@gmail.com>
…claw-labs#3470)

The relative href="install.sh" in README nav headers resolves to
zeroclawlabs.ai/install.sh when viewed on the website, which returns
404 since the website does not serve repo-root files. Replace with
the raw.githubusercontent.com URL used elsewhere in the docs.

Fixes zeroclaw-labs#3463
…call (zeroclaw-labs#3473)

Conversation history on long-running channel sessions (e.g. Feishu) grew
unbounded until the provider returned a context-window-exceeded error.
The existing reactive compaction only kicked in *after* the error,
causing the user's message to be lost and requiring a resend.

Add proactive_trim_turns() which estimates total character count and
drops the oldest turns before the request reaches the provider.  The
budget (400 k chars ≈ 100 k tokens) leaves headroom for system prompt,
memory context, and model output.

Closes zeroclaw-labs#3460
…abs#3461)

* fix(channels): harden slack threading and utf8 truncation

* refactor(channel): collapse interrupt flags to satisfy clippy

---------

Co-authored-by: Argenis <theonlyhennygod@gmail.com>
…eroclaw-labs#3471)

* feat(install): consolidate one-click installer with branded output and inline onboarding

- Add blue color scheme with 🦀 crab emoji branding throughout installer
- Add structured [1/3] [2/3] [3/3] step output with ✓/·/✗ indicators
- Consolidate onboarding into install.sh: inline provider selection menu,
  API key prompt, and model override — no separate wizard step needed
- Replace --onboard/--interactive-onboard with --skip-onboard (opt-out)
- Add OS detection display, install method, version detection, upgrade vs
  fresh install logic
- Add post-install gateway service install/restart, doctor health check
- Add dashboard URL (port 42617) with clipboard copy and browser auto-open
- Add docs link (https://www.zeroclawlabs.ai/docs) to success output
- Display pairing code after onboarding in Rust CLI (src/main.rs)
- Remove --interactive flag from `zeroclaw onboard` CLI command
- Remove redundant scripts/install-release.sh legacy redirect
- Update all --interactive references across codebase

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat(onboard): auto-pair and include bearer token in dashboard URL

After onboarding, the CLI now auto-pairs using the generated pairing
code to produce a bearer token, then displays the dashboard URL with
the token embedded (e.g. http://127.0.0.1:42617?token=zc_...) so
users can access the dashboard immediately without a separate pairing
step. The token is also persisted to config for gateway restarts.

The install script captures this token-bearing URL from the onboard
output and uses it for clipboard copy and browser auto-open.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* security(onboard): revert token-in-URL, keep pairing code terminal-only

Removes the auto-pair + token-in-URL approach in favor of the original
secure pairing flow. Bearer tokens should never appear in URLs where
they can leak via browser history, Referer headers, clipboard, or
proxy logs. The pairing code stays in the terminal and the user enters
it in the dashboard to complete the handshake securely.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* style: apply cargo fmt formatting

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
…eroclaw-labs#3475)

* feat(release): bump to v0.2.0, auto-tweet with features + contributors

- Bump version from 0.1.9 to 0.2.0
- Release notes now auto-generate from feat() commits only (no bug
  fixes) keeping them clean and concise
- Contributors are always featured in release notes, pulled from
  git log authors and Co-Authored-By trailers
- Tweet workflow now fires on all releases (beta + stable), auto-
  generates punchy feature-focused tweets with contributor shoutouts
- Stable release workflow gets the same release notes treatment
- Tweet gracefully skips if Twitter secrets aren't configured

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat(release): credit all contributors, wider range, filter bots

- Use wider git range for contributor collection — skips same-version
  betas to capture everyone who contributed to the release, not just
  the last incremental push
- Filter out bot accounts (dependabot, github-actions, copilot, etc.)
  from contributor lists
- Tweet shows up to 6 contributors with "+ N more" when there are
  extras, ensuring everyone gets credit
- Deduplicate contributors across git authors and Co-Authored-By
- Deduplicate features with sort -uf for cleaner notes

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(release): use last stable tag for contributor range, not last beta

Ensures the tweet and release notes capture ALL contributors since the
last stable release (e.g. v0.1.9a), not just since the last beta tag.
This gives proper credit to everyone who contributed across the full
release cycle.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
…eroclaw-labs#3481)

- Only tweet when there are NEW feat() commits since the previous
  release (including betas) — skips if no new features to announce
- Feature diff uses previous release tag (beta-to-beta) to prevent
  listing the same features across consecutive releases
- Contributor count uses stable-to-HEAD range for full cycle credit
- Shows count instead of names to avoid 280 char clipping
- Added #zeroclaw #rust #ai #opensource hashtags

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
…ions (zeroclaw-labs#3480)

* feat(channels): add show_tool_calls config to suppress tool notifications

When show_tool_calls is false, the ChannelNotifyObserver drains tool
events silently instead of forwarding them as individual messages to
the channel. Server-side logs remain unaffected.

Defaults to true for backwards compatibility.

* docs: add before/after screenshots for show_tool_calls PR

* docs(config): add doc comment on show_tool_calls field

---------

Co-authored-by: Argenis <theonlyhennygod@gmail.com>
…#3458)

parse_attachment_markers uses .find(']') which matches the first ]
in the content. Filenames containing brackets (e.g. yt-dlp output
'Video [G4PvTrTp7Tc].mp4') get truncated at the inner bracket,
causing the send to fail with 'path not found'.

Uses depth-tracking bracket matching instead.

Re-applies fix from merged dev PR zeroclaw-labs#1632 which was lost during the
master branch migration.

Co-authored-by: Argenis <theonlyhennygod@gmail.com>
zeroclaw-labs#3457)

Documents with image extensions (jpg, png, etc.) are routed to
[Document: name] /path instead of [IMAGE:/path], bypassing the
multimodal pipeline entirely. This causes the model to have no vision
input for images sent as Telegram Documents.

Re-applies fix from merged dev PR zeroclaw-labs#1631 which was lost during the
master branch migration.

Co-authored-by: Argenis <theonlyhennygod@gmail.com>
- Mounted deploy/marketing/output/ into container at /zeroclaw-data/workspace/output/
- Init container chowns output dir to uid 65534 for write access
- Updated AGENTS.md with output folder instructions for all agents
- Agent can create .md, .txt, .pdf scripts, .docx scripts directly readable by user
…selection

- Orchestrator now auto-selects the right specialist based on user's request
- No need to manually 'Activate' agents — it reads definitions and adopts workflows automatically
- Multi-step projects get planned across multiple specialists sequentially
- Manual override still available via 'Activate [Agent Name]'
- Configured hybrid OpenRouter + Ollama setup
- Added model selection strategy to AGENTS.md orchestrator
- Created marketing-specific hints: brainstorm, outline, seo, draft, final
- Implemented two-stage workflow (free draft → premium polish)
- Default: Claude Sonnet 4 for marketing/books
- Ollama routes for utility tasks (code, reasoning, fast responses)
- Added OLLAMA_URL env var for Docker host access
- Updated docker-compose.yml with extra_hosts for Ollama connectivity

Cost optimization: 80% savings by using free models for drafts/brainstorming
and premium Claude only for final publication-ready content.
- Created comprehensive SOUL.md with agent personality and core principles
- Defines role as Senior Marketing Strategist and Book Publishing Expert
- Includes hard boundaries: cost optimization, quality standards, security, autonomy limits
- Establishes cost-first thinking: free Ollama for drafts, premium Claude for finals
- Documents specialist agent coordination workflow
- Provides task execution framework and success metrics
- Mounted SOUL.md in docker-compose.yml alongside AGENTS.md
- SOUL.md forms the stable identity layer of the Soul Stack

This file defines the agent's DNA - who it is, how it communicates, and what
rules it must always follow. Ensures consistent persona across all sessions.
…fantasy

- Created STYLE.md with dual-mode voice guidance (professional vs casual)
- Professional mode: Direct, data-driven, strategic (for plans/reports)
- Casual mode: Immersive, mythic, urgent (for social media/ads)
- Includes transition rules for seamless Pro ↔ Casual shifts
- Defines formatting rules, do's/don'ts, and sample outputs
- Specific to Odin Smalls' ZAHANARA dark cultivation fantasy series
- Emphasizes African myth (Anansi), realm curses, power ascension
- Mounted STYLE.md in docker-compose.yml alongside SOUL.md and AGENTS.md

This completes the Soul Stack voice layer, ensuring consistent brand voice
across all marketing materials while maintaining cost-efficient operations.
- Created system brief documenting entire marketing deployment
- Covers architecture, Soul Stack, model routing, access points
- Includes configuration details, security features, daily operations
- Documents cost management strategy and troubleshooting guides
- Lists all specialist agents and their roles
- Provides technical stack overview and next steps
- Reference guide for deployment at localhost:42617
- Specific to ZAHANARA marketing agent setup

This serves as the complete operational manual for the deployment.
- Created marketing-cron.sh for automated marketing tasks
- Supports 7 task types: bookbub, cover-review, email, storyorigin, relaunch, review, monthly
- Each task invokes ZeroClaw agent with specialist prompts
- Output saved to dated markdown files in output/ folder
- Added comprehensive CRON-SETUP.md documentation
- Includes Windows Task Scheduler setup instructions
- Tested successfully with 'email' task - generated complete nurture email
- Cost: ~.05 per task, well under budget
- Note: Requires auto_approve config for file_write to run unattended

Test results: email task generated 250-word nurture campaign with
STYLE.md voice (casual mode), lore hook, BookBub tease, and 99¢ CTA.
Duration: 74 seconds, Cost: ~.05, Output: professional quality.
- Enabled scheduler and cron in config.toml (was disabled)
- Added 3 native cron jobs via zeroclaw cron add:
  * Weekly email (Mon 8am): Content Creator nurture campaign
  * Weekly review (Fri 5pm): Analytics Reporter metrics
  * Monthly summary (28-31st 4pm): Executive metrics review
- Jobs now visible in zeroclaw cron list
- Next runs: Mar 19 (review), Mar 22 (email), Mar 28 (monthly)

This replaces external bash script with ZeroClaw's built-in scheduler.
Jobs persist in agent database and run automatically when scheduled.
- Comprehensive guide for native ZeroClaw cron functionality
- Documents all 3 active scheduled jobs with next run times
- Includes cron expression format reference and examples
- Covers job management (add/pause/resume/update/remove)
- Explains one-time tasks and timezone configuration
- Compares native cron vs bash script approach
- Troubleshooting guide and cost estimates
- Auto-approval configuration instructions

Native cron jobs persist in database, visible in CLI, and work
cross-platform without external Task Scheduler dependencies.
…tent

- Added query classification system with 7 priority-based rules
- Routes messages to optimal models automatically (no manual hints needed)
- Marketing/creative content → Claude Sonnet 4 (premium)
- Deep analysis (100+ chars) → Claude Sonnet 4.5 (advanced reasoning)
- Code/technical → Ollama qwen2.5-coder (free specialist)
- SEO/data analysis → Ollama deepseek-r1 (free)
- Short messages (<50 chars) → Ollama gemma3:4b (fast & free)
- Brainstorming → Ollama llama3.2 (free ideation)
- Default fallback → Claude Sonnet 4

Works for:
- Telegram channel (@Kuffsbot)
- Gateway dashboard (http://localhost:42617)
- Webhook API
- Scheduled cron jobs

Estimated cost savings: 60-70% by routing utility tasks to free local models
while preserving premium quality for marketing/creative work.

Classification uses keyword matching, pattern detection, and message length
constraints. Rules evaluated by priority (100→50). First match wins.

New file: INTELLIGENT-ROUTING.md - complete guide with examples
- Added [model_providers.ollama] section with correct field names
- Set base_url to http://host.docker.internal:11434 for container→host access
- Fixed 'localhost' connection error when routing to Ollama models
- Verified all required models present: qwen2.5-coder, deepseek-r1, gemma3, llama3.2

This enables intelligent routing to free local models for:
- Code tasks (qwen2.5-coder)
- SEO/data analysis (deepseek-r1)
- Quick responses (gemma3:4b)
- Brainstorming (llama3.2)

Container can now successfully connect to host Ollama instance.
Root cause: ZeroClaw's router only uses api_url for PRIMARY provider.
When routing to Ollama (non-primary), it defaults to localhost:11434.

Solution:
1. Bind-mount config.toml directly to container for Ollama provider config
2. Set ZEROCLAW_PROVIDER_URL=http://host.docker.internal:11434 env var
   - This env var is checked by Ollama provider factory for routed instances

Changes:
- docker-compose.yml: Added config.toml bind mount (read-only)
- docker-compose.yml: Added ZEROCLAW_PROVIDER_URL environment variable
- config.toml: Added [model_providers.ollama] with base_url

This allows intelligent routing rules to successfully use local Ollama models
for code, SEO, brainstorming, and fast-response tasks without connection errors.
The bot_token was set to '__TELEGRAM_BOT_TOKEN__' causing 404 errors
when attempting to connect to Telegram API.

Replaced with actual token: 8711868088:AAE3ymXEXa739HfPm0crvBEI6XMIVcRaORk

Bot now connects successfully without 404 errors.
The 'fast' rule wasn't triggering because ZeroClaw's classifier requires
at least one keyword OR pattern match - length constraints alone aren't enough.

Added common short reply keywords:
- Acknowledgments: ok, thanks, sure, got it
- Yes/no variants: yes, no, yeah, yep, nope
- Abbreviations: k, ty, thx

This ensures short conversational messages like 'ok thanks' route to
Ollama gemma3:4b (fast & free) instead of expensive Claude Sonnet 4.

Test results after fix:
- 'Generate SEO keywords' → deepseek-r1 (Ollama) ✅
- 'Write email' → Claude Sonnet 4 ✅
- 'ok thanks' → Will now route to gemma3:4b ✅
Problem: deepseek-r1-tool-calling model outputs reasoning/tool schemas
instead of direct content for SEO keyword requests.

Solution: Changed SEO route to llama3.2 for direct content generation.

Updated route:
- hint: seo
- provider: ollama
- model: llama3.2

Ready to test with Telegram @Kuffsbot
Problem: llama3.2 model not found in Ollama instance
Error: 404 Not Found - model 'llama3.2' not found

Solution: Replaced all llama3.2 references with llama3:8b which is
available in the local Ollama installation.

Updated routes:
- seo: llama3.2 → llama3:8b
- draft: llama3.2 → llama3:8b
- brainstorm: llama3.2 → llama3:8b
- outline: llama3.2 → llama3:8b

Available Ollama models verified:
- llama3:8b ✅
- qwen2.5-coder:latest ✅
- gemma3:4b ✅
- MFDoom/deepseek-r1-tool-calling:latest ✅

SEO routing now works: seo hint → llama3:8b (free)
Problem: Ollama models (llama3:8b) were handling high-level creative work:
- draft (content creation)
- brainstorm (strategic ideation)
- outline (content planning)
- seo (marketing keyword research)

These are higher-level functions requiring premium quality, not utility tasks.

Solution: Realigned model routing based on task complexity:

Ollama (LOW-level utility only):
- code → qwen2.5-coder (technical tasks)
- fast → gemma3:4b (quick acknowledgments)
- reasoning → deepseek-r1-tool-calling (data processing)

OpenRouter (HIGH-level creative/strategic):
- marketing → Claude Sonnet 4 (campaigns, copy)
- book → Claude Sonnet 4 (fiction writing)
- deep → Claude Sonnet 4.5 (strategic analysis)
- draft → Claude Sonnet 4 (content drafts) ← moved
- brainstorm → Claude Sonnet 4 (ideation) ← moved
- outline → Claude Sonnet 4 (planning) ← moved
- seo → Claude Sonnet 4 (keywords) ← moved
- final → Claude Sonnet 4 (polish)
- DEFAULT → Claude Sonnet 4 (everything else)

Updated classification rule comments to reflect new routing.

This ensures premium quality for all creative/strategic work while
keeping Ollama strictly for low-level utility functions.
Problem: Claude Sonnet 4.5 has availability issues on OpenRouter.

Solution: Changed 'deep' route from Sonnet 4.5 to Sonnet 4 which is
proven reliable across all other routes.

Sonnet 4 still provides excellent strategic analysis, deep reasoning,
and complex decision-making while ensuring consistent availability.

Updated:
- model_routes deep hint: 4.5 → 4
- query_classification rule comment for accuracy
Strategy: Use Ollama for drafts/brainstorming/planning/SEO to maximize
savings, reserve OpenRouter for premium marketing/book/deep work only.

New Ollama Routes (High Savings):
- draft → llama3:8b (4.34GB) - versatile drafts, lore (15-25 t/s)
- brainstorm → gemma3:4b (3.11GB) - creative hooks, ideas (20-40 t/s)
- outline → qwen2.5:7b (4.36GB) - plans/structure (12-25 t/s)
- seo → deepseek-r1-tool-calling (4.36GB) - keywords/promos (10-20 t/s)
- reasoning → mixtral:8x7b (24GB) - complex analysis/BookBub (5-15 t/s)
- code → qwen2.5-coder (4.36GB) - programming tasks
- fast → gemma3:4b (3.11GB) - quick acknowledgments

OpenRouter Routes (Premium Quality Only):
- marketing → Claude Sonnet 4 - campaigns, emails, copy
- book → Claude Sonnet 4 - fiction chapters, prose
- deep → Claude Sonnet 4 - strategic analysis
- final → Claude Sonnet 4 - publication polish
- DEFAULT → Claude Sonnet 4 - everything else

Expected Impact:
- 80%+ cost reduction on drafts/brainstorming/planning/SEO
- Premium quality preserved for final marketing/book content
- Fast local processing (15-40 t/s) for creative tasks
- Complex reasoning via mixtral:8x7b for BookBub strategy

Updated classification rule comments to reflect new routing.
Problem 1: gemma3:4b doesn't support tools/function calling
Error: 'gemma3:4b does not support tools'

Problem 2: Bot can't access workspace files without tool support

Solution: Changed routes to tool-capable models:
- draft: gemma3:4b → deepseek-r1-tool-calling (tool access)
- brainstorm: gemma3:4b → llama3:8b (tool access)
- fast: kept gemma3:4b (no tools needed for acknowledgments)

Tool-capable Ollama models:
✅ deepseek-r1-tool-calling (draft route)
✅ llama3:8b (brainstorm route)
✅ qwen2.5-coder (code route)
✅ mixtral:8x7b (reasoning route)
✅ qwen2.5:7b (outline route)

Non-tool models (fast responses only):
❌ gemma3:4b (fast route - acknowledgments only)

Now bot can use file_read, web_search_tool, and other functions
when drafting or brainstorming.
User preference: llama3:8b is better general model for versatile drafts.

Updated:
- draft route: deepseek-r1-tool-calling → llama3:8b
- Both draft and brainstorm now use llama3:8b (tool-capable, 15-25 t/s)

llama3:8b supports tools (file_read, web_search) while being more
versatile for general drafting tasks compared to specialized
deepseek-r1-tool-calling model.
Problem: 'Draft ZAHANARA email' routed to marketing (Claude) instead
of draft (llama3:8b) because no draft classification rule existed.

The word 'email' matched marketing keywords (priority 100), so it used
expensive Claude Sonnet 4 instead of free llama3:8b.

Solution: Added draft classification rule with priority 110 (higher than
marketing's 100) to catch draft requests first.

New rule:
- hint: draft
- keywords: draft, rough draft, first draft, quick draft, write a draft
- priority: 110 (highest)

Now 'Draft X email' routes to llama3:8b (tool access, ) instead of
Claude Sonnet 4 (.003).

Test: 'Draft ZAHANARA email' should now use llama3:8b with workspace access.
Removed from Ollama:
- llama3:8b (no tool support)
- gemma3:4b (no tool support)
- gemma3:latest (duplicate)

Freed: ~11GB storage

New routing based on user benchmarks:
- draft → gpt-oss:20b (90% Sonnet quality, tool access, 8-15 t/s)
- brainstorm → gpt-oss:20b (best balance quality/tools, CoT-strong)
- fast → deepseek-r1-tool-calling (tool access, 10-20 t/s)
- outline → qwen2.5:7b (82% quality, likely tools, 12-25 t/s)
- seo → deepseek-r1-tool-calling (85% quality, explicit tools)
- reasoning → mixtral:8x7b (92% quality, 5-15 t/s)
- code → qwen2.5-coder (tool-capable)

All Ollama routes now support workspace file access (file_read, web_search).

User benchmark data confirmed gpt-oss:20b as optimal for draft/brainstorm
tasks requiring ZAHANARA notes and knowledge stack access.
Problem: Agent couldn't access or manage scheduled cron jobs without
manual approval, limiting its ability to create automated marketing tasks.

Solution: Added cron management tools to auto_approve list:
- cron_add: Create new scheduled jobs (shell or agent tasks)
- cron_list: View all scheduled jobs
- cron_remove: Delete jobs by ID
- cron_update: Modify existing jobs
- cron_run: Manually trigger a job

These tools were already registered in the tool registry (src/tools/mod.rs
lines 284-289) but required manual approval. Now the agent can:
1. Create marketing automation schedules autonomously
2. List/view existing cron jobs
3. Edit schedules or prompts
4. Remove outdated jobs
5. Test jobs with manual runs

Use cases:
- 'Create a cron job to post SEO keywords every Monday at 9am'
- 'Show me all scheduled jobs'
- 'Delete the job named daily-email-draft'
- 'Update job X to run at 2pm instead of 9am'

Security: Jobs still respect SecurityPolicy constraints (rate limits,
workspace_only, etc.) and are persisted in cron store.
Problem: User expected cron job results delivered to Telegram, but jobs
were saving to output/*.md files instead.

Solution: Created TELEGRAM-CRON-DELIVERY.md with instructions for updating
existing jobs to use delivery configuration.

Key points:
- Easiest method: Ask agent on Telegram to update all jobs
- Agent has cron_update in auto_approve (enabled earlier)
- Delivery config: mode=announce, channel=telegram, to=8203092181
- CLI doesn't support delivery flags (tool-only feature)

Jobs to update (7 total):
- Weekly Email Draft, BookBub Daily Check, Weekly Review
- Monthly Review, Mini-Relaunch Kickoff, StoryOrigin Promos
- MiBlart Cover Arrival

User can now receive cron output directly in Telegram instead of
checking Docker logs or browsing output folder.
Problem: Agent was saying it couldn't see scheduled jobs, even though
cron_list/cron_update were in auto_approve and working. The agent simply
didn't know these tools existed.

Root cause: SOUL.md (agent identity document) listed file_read, file_write,
web_search, memory, and shell commands, but didn't mention any cron tools.
When the agent is asked to manage jobs, it has no awareness that cron_list
exists as an available tool.

Solution: Added 5 cron tools to 'Tools at Your Disposal' section in SOUL.md:
- cron_list: List all jobs with IDs, schedules, delivery settings
- cron_add: Create new scheduled jobs with Telegram delivery
- cron_update: Modify jobs (schedule, prompt, delivery, enable/disable)
- cron_remove: Delete jobs by ID
- cron_run: Manually trigger jobs for testing

Impact: Agent now knows it can proactively use cron_list when asked about
scheduled jobs, then use cron_update to modify them. This completes the
cron management capability enablement.

Testing: After restart, user should message agent on Telegram asking it to
list and update jobs. Agent should now use the tools autonomously.

Related: Earlier commit 11380b1 added tools to auto_approve but didn't
update the agent's identity document.
…tion capabilities

- Removed failing models: deepseek-r1-tool-calling, mixtral:8x7b (freed 30.7 GB)
- Updated model routes: hint:seo/fast → gpt-oss:20b, hint:reasoning → qwen3:8b
- Verified tool-calling reliability: gpt-oss:20b (primary), qwen3:8b (backup)
- Documented full cron management capabilities in BRIEF.md
- Added marketing automation framework with recommended scheduled tasks
- Updated BRIEF.md with model test results and latest deployment info (2026-03-22)
- Fix web_search_tool: Update snippet regex to match any HTML tag (not just <a>)
  DuckDuckGo changed HTML structure, breaking result parsing
- Update SOUL.md: Add rule to prevent automatic file creation
  Bot now only creates files when explicitly requested by user
- Update BRIEF.md: Document web search fix and behavior optimization

Tested: Web search now returns real results, bot provides research-backed analysis
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.