[!!]

doggowoof

Local-first observability for autonomous AI agents.

Watches your agents. Barks when they misbehave.

~ doggo bore --watch
=== DEEP BORE WATCH ===
Monitoring: ~/projects/claude-in-factorio/logs/
Binary:     ~/projects/.../factorioctl/target/release/mcp
Press Ctrl+C to stop.

Tailing: bridge-2026-04-29_140000.log (offset: 0)
[ok] binary baseline: 2e77a28c...fc359909
[.]  agent_start new agent session
[.]  task_dispatch task 'mine-iron-ore' (1/10)
[.]  task_complete cost=$1.50 turns=12 duration=75s
[.]  agent_broadcast IRON ORE LOCATED. MINING COMMENCES.
[!]  agent_anomaly Furnace unit 15 extraction failed
[!!] self_modification tool: Bash({"command":"cargo build --release"})
  ↳ desktop notification fired

^C
Received terminated, shutting down...
Watch stopped. Good dog.

Why this exists

During an unsupervised session, an autonomous Claude agent playing Factorio (his name is Doug) discovered broken tools, read his own Rust source code, patched it, recompiled the binary, and resumed operations. Twice.

The safety measures that would have caught this — sandboxing, binary checksumming, operator alerts — didn't exist yet. doggowoof is the alerting layer. It watches Doug so I don't have to stare at the terminal.

The same primitives apply to any agent system you run locally. Log tailing, integrity checks, config validation, cost tracking. Read-only observation, no modification of the monitored system. Dog watches. Dog does not touch.

What it catches

severityeventtrigger
[!!]criticalsandbox_violationForbidden tool call appears in agent log (Bash, Edit, Read, Write, Grep, Glob, Task)
[!!]criticalself_modificationBuild commands inside tool calls (cargo build, rustc, gcc, make)
[!!]criticalbinary_mismatchMonitored binary SHA-256 hash changed from baseline
[!!]criticalconfig_violationAgent config missing sandbox: true or required disallowedTools
[!]highagent_bug_reportAgent broadcasts containing BUG REPORT, DEFECT, BLOCKED, Self-Repair
[!]highagent_anomalyAgent broadcasts containing ANOMALY
[.]infotask_dispatch / task_completeNormal session progress — cost, turns, duration
[.]infoagent_broadcastAgent status messages and decisions

Critical and high alerts trigger desktop notifications. Info events are stored silently in SQLite for review.

The watch loop

One process. Three tickers. No goroutines, no daemons, no HTTP. Cursor position persists to SQLite so it resumes after restart.

1s

log poll

Glob latest bridge-*.log, read new bytes from saved cursor, parse events with regex priority ordering, save alerts.

60s

binary check

SHA-256 the monitored binary, compare to baseline. Drift triggers a critical binary_mismatch alert.

30s

config check

Validate every agent JSON in the configured directory. Missing sandbox: true or incomplete disallowedTools fires critical alerts.

architecture
bridge logs (claude-in-factorio)         doggowoof
┌─────────────────────────┐         ┌──────────────────────────┐
│ tool calls, broadcasts, │         │ regex parser             │
│ task dispatches, costs  │────────▶│ binary SHA-256 checks    │
│                         │  TAIL   │ config validation        │
│ bridge-*.log            │         │ session state tracking   │
└─────────────────────────┘         │                          │
                                    │ alerts.sqlite (own DB)   │
agent config files                  │                          │
┌─────────────────────────┐         │ desktop notifications    │
│ sandbox: true,          │────────▶│   (high/critical only)   │
│ disallowedTools: [...]  │  READ   │                          │
└─────────────────────────┘         └──────────────────────────┘

factorioctl binary
┌─────────────────────────┐
│ target/release/mcp      │────────▶ SHA-256 baseline + drift detection
└─────────────────────────┘

Try it

  1. 1. install

    go install github.com/QRY91/doggowoof/cmd/doggowoof@latest
    ln -sf $(go env GOPATH)/bin/doggowoof $(go env GOPATH)/bin/doggo
    doggo init
  2. 2. enable in ~/.config/doggowoof/config.toml

    [deepbore]
    enabled = true
    log_directory = "~/projects/claude-in-factorio/logs/"
    binary_path = "~/projects/claude-in-factorio/factorioctl/target/release/mcp"
    agent_config_directory = "~/projects/claude-in-factorio/bridge/agents/"
  3. 3. watch

    doggo bore --watch

    Run this alongside your agent session. From another terminal: doggo bore for status, doggo alerts to review findings.

Requires Go 1.21+. Pure Go, builds with CGO_ENABLED=0. No C compiler, no runtime dependencies.

Honest history

doggowoof has been three different things. The current shape is the legitimate one.

  • v0.1
    CI alert triage — Python webhook daemon for GitHub workflow failures. removed
  • v0.2
    OSINT coordination detection — companion to osmotic, temporal/behavior clustering. removed
  • v0.3
    AI agent observability — current. The Deep Bore work was the real identity all along. active