Skip to content

billion-token-one-task/ClawOSS

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

299 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

                         โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘
                     โ–‘โ–‘โ–‘โ–‘โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–‘โ–‘โ–‘โ–‘
                  โ–‘โ–‘โ–‘โ–’โ–’โ–’โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–’โ–’โ–’โ–‘โ–‘โ–‘
               โ–‘โ–‘โ–’โ–’โ–“โ–“โ–“โ–“โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–“โ–“โ–“โ–’โ–’โ–‘โ–‘
             โ–‘โ–‘โ–’โ–“โ–“โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–“โ–“โ–’โ–‘โ–‘
            โ–‘โ–’โ–“โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–€โ–€โ–€โ–€โ–€โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–€โ–€โ–€โ–€โ–€โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–“โ–’โ–‘
           โ–‘โ–’โ–“โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–€         โ–€โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–€         โ–€โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–“โ–’โ–‘
          โ–‘โ–’โ–“โ–ˆโ–ˆโ–ˆโ–ˆโ–€    โ•”โ•โ•โ•โ•—   โ–€โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–€   โ•”โ•โ•โ•โ•—    โ–€โ–ˆโ–ˆโ–ˆโ–ˆโ–“โ–’โ–‘
         โ–‘โ–’โ–“โ–ˆโ–ˆโ–ˆโ–ˆ     โ•‘ โ—‰ โ•‘    โ–€โ–ˆโ–ˆโ–ˆโ–ˆโ–€    โ•‘ โ—‰ โ•‘     โ–ˆโ–ˆโ–ˆโ–ˆโ–“โ–’โ–‘
         โ–‘โ–’โ–“โ–ˆโ–ˆโ–ˆโ–ˆ     โ•šโ•โ•โ•โ•     โ–ˆโ–ˆโ–ˆโ–ˆ     โ•šโ•โ•โ•โ•     โ–ˆโ–ˆโ–ˆโ–ˆโ–“โ–’โ–‘
         โ–‘โ–’โ–“โ–ˆโ–ˆโ–ˆโ–ˆโ–„              โ–ˆโ–ˆโ–ˆโ–ˆ              โ–„โ–ˆโ–ˆโ–ˆโ–ˆโ–“โ–’โ–‘
          โ–‘โ–’โ–“โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–„โ–„   โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—   โ–„โ–„โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–“โ–’โ–‘
           โ–‘โ–’โ–“โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–„ โ•‘  โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„โ–„ โ•‘ โ–„โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–“โ–’โ–‘
            โ–‘โ–’โ–“โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•‘  โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ โ•‘โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–“โ–’โ–‘
             โ–‘โ–‘โ–’โ–“โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•‘  โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€ โ•‘โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–“โ–’โ–‘โ–‘
               โ–‘โ–‘โ–’โ–’โ–“โ–“โ–ˆโ–ˆโ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ–ˆโ–ˆโ–“โ–“โ–’โ–’โ–‘โ–‘
                  โ–‘โ–‘โ–‘โ–’โ–’โ–“โ–“โ–“โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–“โ–“โ–“โ–’โ–’โ–‘โ–‘โ–‘
                     โ–‘โ–‘โ–‘โ–‘โ–’โ–’โ–’โ–’โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–’โ–’โ–’โ–’โ–‘โ–‘โ–‘โ–‘
                         โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘

ClawOSS

[AUTONOMOUS] [V6] [32+ PRs] [23 REPOS] [1 MERGED]

An OpenClaw agent that autonomously discovers issues, implements fixes, and submits pull requests to open-source projects โ€” 24/7, without human intervention.

OpenClaw is the engine. ClawOSS is the race car.


Quick Start

git clone https://github.com/billion-token-one-task/ClawOSS.git
cd ClawOSS
cp .env.example .env   # edit with your API keys
bash scripts/setup.sh
bash scripts/restart.sh

First Run Stats

โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—
โ•‘                                                                   โ•‘
โ•‘   PRs Submitted ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท 32+                             โ•‘
โ•‘   Repos Contributed To ยทยทยทยทยทยทยทยทยทยท 23                              โ•‘
โ•‘   PRs Merged ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท 1  (badlogic/pi-mono#2166)      โ•‘
โ•‘   Time to First PR ยทยทยทยทยทยทยทยทยทยทยทยทยทยท 12 minutes autonomous           โ•‘
โ•‘   Concurrent Sub-Agents ยทยทยทยทยทยทยทยทยท 5                               โ•‘
โ•‘   Model ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท Kimi Code k2p5 (direct API)     โ•‘
โ•‘   Content Filter 403s ยทยทยทยทยทยทยทยทยทยทยท ZERO (PII sanitizer bypass)     โ•‘
โ•‘   Peak Throughput ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท 15 PRs in 85 minutes            โ•‘
โ•‘                                                                   โ•‘
โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•

Architecture

โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘
โ–‘                                                                                โ–‘
โ–‘  โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”“   โ–‘
โ–‘  โ”ƒ          O P E N C L A W   G A T E W A Y   ( port 18789 )              โ”ƒ   โ–‘
โ–‘  โ”ƒ                    mode: local ยท model: kimi-coding/k2p5               โ”ƒ   โ–‘
โ–‘  โ”—โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”›   โ–‘
โ–‘                                 โ”ƒ                                              โ–‘
โ–‘                                 โ”ƒ heartbeat every 10m                          โ–‘
โ–‘                                 โ”ƒ lightContext: false                            โ–‘
โ–‘                                 โ–ผ                                              โ–‘
โ–‘  โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”“   โ–‘
โ–‘  โ”ƒ                                                                        โ”ƒ   โ–‘
โ–‘  โ”ƒ         โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—            โ”ƒ   โ–‘
โ–‘  โ”ƒ         โ•‘          ORCHESTRATOR  (main session)           โ•‘            โ”ƒ   โ–‘
โ–‘  โ”ƒ         โ•‘                                                  โ•‘            โ”ƒ   โ–‘
โ–‘  โ”ƒ         โ•‘  reads: HEARTBEAT.md ยท AGENTS.md ยท SOUL.md      โ•‘            โ”ƒ   โ–‘
โ–‘  โ”ƒ         โ•‘         memory/work-queue.md                     โ•‘            โ”ƒ   โ–‘
โ–‘  โ”ƒ         โ•‘         memory/pr-ledger.md                      โ•‘            โ”ƒ   โ–‘
โ–‘  โ”ƒ         โ•‘         memory/pipeline-state.md                 โ•‘            โ”ƒ   โ–‘
โ–‘  โ”ƒ         โ•‘         memory/wake-state.md                     โ•‘            โ”ƒ   โ–‘
โ–‘  โ”ƒ         โ•‘                                                  โ•‘            โ”ƒ   โ–‘
โ–‘  โ”ƒ         โ•‘  runs:  oss-discover ยท oss-triage                โ•‘            โ”ƒ   โ–‘
โ–‘  โ”ƒ         โ•‘         repo-analyzer ยท context-manager          โ•‘            โ”ƒ   โ–‘
โ–‘  โ”ƒ         โ•‘                                                  โ•‘            โ”ƒ   โ–‘
โ–‘  โ”ƒ         โ•šโ•โ•โ•โ•โ•คโ•โ•โ•โ•โ•โ•โ•โ•โ•คโ•โ•โ•โ•โ•โ•โ•โ•โ•คโ•โ•โ•โ•โ•โ•โ•โ•โ•คโ•โ•โ•โ•โ•โ•โ•โ•โ•คโ•โ•โ•โ•โ•โ•โ•โ•โ•            โ”ƒ   โ–‘
โ–‘  โ”ƒ              โ”‚        โ”‚        โ”‚        โ”‚        โ”‚                      โ”ƒ   โ–‘
โ–‘  โ”ƒ              โ”‚ sessions_spawn (maxConcurrent: 5)  โ”‚                     โ”ƒ   โ–‘
โ–‘  โ”ƒ              โ”‚        โ”‚        โ”‚        โ”‚        โ”‚                      โ”ƒ   โ–‘
โ–‘  โ”ƒ         โ”Œโ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”โ”Œโ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”โ”Œโ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”โ”Œโ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”โ”Œโ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”            โ”ƒ   โ–‘
โ–‘  โ”ƒ         โ”‚ SUB  1 โ”‚โ”‚ SUB  2 โ”‚โ”‚ SUB  3 โ”‚โ”‚ SUB  4 โ”‚โ”‚ SUB  5 โ”‚            โ”ƒ   โ–‘
โ–‘  โ”ƒ         โ”‚        โ”‚โ”‚        โ”‚โ”‚        โ”‚โ”‚        โ”‚โ”‚        โ”‚            โ”ƒ   โ–‘
โ–‘  โ”ƒ         โ”‚ fresh  โ”‚โ”‚ fresh  โ”‚โ”‚ fresh  โ”‚โ”‚ fresh  โ”‚โ”‚ fresh  โ”‚            โ”ƒ   โ–‘
โ–‘  โ”ƒ         โ”‚ contextโ”‚โ”‚ contextโ”‚โ”‚ contextโ”‚โ”‚ contextโ”‚โ”‚ contextโ”‚            โ”ƒ   โ–‘
โ–‘  โ”ƒ         โ”‚        โ”‚โ”‚        โ”‚โ”‚        โ”‚โ”‚        โ”‚โ”‚        โ”‚            โ”ƒ   โ–‘
โ–‘  โ”ƒ         โ”‚ clone  โ”‚โ”‚ clone  โ”‚โ”‚ clone  โ”‚โ”‚ clone  โ”‚โ”‚ clone  โ”‚            โ”ƒ   โ–‘
โ–‘  โ”ƒ         โ”‚ repro  โ”‚โ”‚ repro  โ”‚โ”‚ repro  โ”‚โ”‚ repro  โ”‚โ”‚ repro  โ”‚            โ”ƒ   โ–‘
โ–‘  โ”ƒ         โ”‚ fix    โ”‚โ”‚ fix    โ”‚โ”‚ fix    โ”‚โ”‚ fix    โ”‚โ”‚ fix    โ”‚            โ”ƒ   โ–‘
โ–‘  โ”ƒ         โ”‚ test   โ”‚โ”‚ test   โ”‚โ”‚ test   โ”‚โ”‚ test   โ”‚โ”‚ test   โ”‚            โ”ƒ   โ–‘
โ–‘  โ”ƒ         โ”‚ submit โ”‚โ”‚ submit โ”‚โ”‚ submit โ”‚โ”‚ submit โ”‚โ”‚ submit โ”‚            โ”ƒ   โ–‘
โ–‘  โ”ƒ         โ”‚ cleanupโ”‚โ”‚ cleanupโ”‚โ”‚ cleanupโ”‚โ”‚ cleanupโ”‚โ”‚ cleanupโ”‚            โ”ƒ   โ–‘
โ–‘  โ”ƒ         โ””โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”˜โ””โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”˜โ””โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”˜โ””โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”˜โ””โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”˜            โ”ƒ   โ–‘
โ–‘  โ”ƒ             โ”‚         โ”‚         โ”‚         โ”‚         โ”‚                  โ”ƒ   โ–‘
โ–‘  โ”ƒ             โ–ผ         โ–ผ         โ–ผ         โ–ผ         โ–ผ                  โ”ƒ   โ–‘
โ–‘  โ”ƒ         memory/subagent-result-<repo>-<issue>.md                       โ”ƒ   โ–‘
โ–‘  โ”ƒ         then: rm -rf /tmp/clawoss-<issue>-<ts>/                        โ”ƒ   โ–‘
โ–‘  โ”ƒ         then: reply ANNOUNCE_SKIP                                      โ”ƒ   โ–‘
โ–‘  โ”ƒ                                                                        โ”ƒ   โ–‘
โ–‘  โ”—โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”›   โ–‘
โ–‘                                 โ”‚                                              โ–‘
โ–‘            โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                       โ–‘
โ–‘            โ–ผ                    โ–ผ                       โ–ผ                       โ–‘
โ–‘  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”            โ–‘
โ–‘  โ”‚  GitHub          โ”‚ โ”‚  Vercel Dashboard โ”‚  โ”‚  Telemetry Hooks     โ”‚            โ–‘
โ–‘  โ”‚  (BillionClaw)   โ”‚ โ”‚  /api/ingest/*    โ”‚  โ”‚  dashboard-reporter  โ”‚            โ–‘
โ–‘  โ”‚                  โ”‚ โ”‚                   โ”‚  โ”‚  audit-logger         โ”‚            โ–‘
โ–‘  โ”‚  PRs ยท Commits   โ”‚ โ”‚  heartbeat        โ”‚  โ”‚  pii-sanitizer       โ”‚            โ–‘
โ–‘  โ”‚  Reviews         โ”‚ โ”‚  metrics          โ”‚  โ”‚  dashboard-sync.sh   โ”‚            โ–‘
โ–‘  โ”‚  Follow-ups      โ”‚ โ”‚  conversation     โ”‚  โ”‚  pr-ledger-sync.sh   โ”‚            โ–‘
โ–‘  โ”‚                  โ”‚ โ”‚  state ยท logs     โ”‚  โ”‚                      โ”‚            โ–‘
โ–‘  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜            โ–‘
โ–‘                                                                                โ–‘
โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘

The Autonomous Loop โ€” HEARTBEAT.md

Every 10 minutes, OpenClaw wakes the agent. It reads HEARTBEAT.md and executes this cycle:

โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’
โ–’                                                                              โ–’
โ–’                  โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ                                       โ–’
โ–’                  โ”‚  0a. CONTEXT HEALTH โ”‚                                      โ–’
โ–’                  โ”‚  session_status     โ”‚                                      โ–’
โ–’                  โ”‚  >70% โ†’ /compact   โ”‚                                      โ–’
โ–’                  โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ                                      โ–’
โ–’                            โ–ผ                                                  โ–’
โ–’                  โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ                                       โ–’
โ–’                  โ”‚  0b. CIRCUIT BREAK  โ”‚                                      โ–’
โ–’                  โ”‚  wakes >= 50? stop  โ”‚                                      โ–’
โ–’                  โ”‚  errors >= 2? stop  โ”‚                                      โ–’
โ–’                  โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ                                      โ–’
โ–’                            โ–ผ                                                  โ–’
โ–’       โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ                              โ–’
โ–’       โ”‚  1. STALL RECOVERY                     โ”‚                              โ–’
โ–’       โ”‚  sessions_list โ†’ stale >5min? kill     โ”‚                              โ–’
โ–’       โ”‚  re-queue task, 2 strikes โ†’ skip       โ”‚                              โ–’
โ–’       โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ                              โ–’
โ–’                           โ–ผ                                                   โ–’
โ–’       โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ                              โ–’
โ–’       โ”‚  2. PR FOLLOW-UPS                      โ”‚                              โ–’
โ–’       โ”‚  gh pr list --author @me --state open  โ”‚                              โ–’
โ–’       โ”‚  reviews โ†’ oss-followup                โ”‚                              โ–’
โ–’       โ”‚  CI fail โ†’ fix & push                  โ”‚                              โ–’
โ–’       โ”‚  merged โ†’ update pipeline-state.md     โ”‚                              โ–’
โ–’       โ”‚  stale >7d โ†’ close politely            โ”‚                              โ–’
โ–’       โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ                              โ–’
โ–’                           โ–ผ                                                   โ–’
โ–’       โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ                              โ–’
โ–’       โ”‚  3. PICK WORK                          โ”‚โ—€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ          โ–’
โ–’       โ”‚  merge staging files โ†’ work-queue.md   โ”‚                   โ”‚          โ–’
โ–’       โ”‚  active >= 5 โ†’ skip to step 6          โ”‚                   โ”‚          โ–’
โ–’       โ”‚  active < 5 โ†’ pick task (score >= 5)   โ”‚                   โ”‚          โ–’
โ–’       โ”‚  skip if in pr-ledger (no duplicates)  โ”‚                   โ”‚          โ–’
โ–’       โ”‚  queue < 5 โ†’ run oss-discover broadly  โ”‚                   โ”‚          โ–’
โ–’       โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ                   โ”‚          โ–’
โ–’                           โ–ผ                                        โ”‚          โ–’
โ–’       โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ                   โ”‚          โ–’
โ–’       โ”‚  4. TRIAGE                             โ”‚                   โ”‚          โ–’
โ–’       โ”‚  oss-triage: complexity, feasibility   โ”‚                   โ”‚          โ–’
โ–’       โ”‚  repo-analyzer: repo health check      โ”‚                   โ”‚          โ–’
โ–’       โ”‚  web_search: upstream context          โ”‚                   โ”‚          โ–’
โ–’       โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ                   โ”‚          โ–’
โ–’                           โ–ผ                                        โ”‚          โ–’
โ–’       โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ                   โ”‚          โ–’
โ–’       โ”‚  5. SPAWN SUB-AGENT                    โ”‚                   โ”‚          โ–’
โ–’       โ”‚  sessions_spawn with task:             โ”‚                   โ”‚          โ–’
โ–’       โ”‚    clone โ†’ reproduce โ†’ implement       โ”‚                   โ”‚          โ–’
โ–’       โ”‚    โ†’ verify โ†’ review โ†’ submit          โ”‚                   โ”‚          โ–’
โ–’       โ”‚    โ†’ cleanup โ†’ ANNOUNCE_SKIP           โ”‚                   โ”‚          โ–’
โ–’       โ”‚                                        โ”‚                   โ”‚          โ–’
โ–’       โ”‚  LOOP BACK if active < 5 โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ          โ–’
โ–’       โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ                              โ–’
โ–’                           โ–ผ                                                   โ–’
โ–’       โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ                              โ–’
โ–’       โ”‚  6. HANDLE RESULTS                     โ”‚                              โ–’
โ–’       โ”‚  read subagent-result-*.md files       โ”‚                              โ–’
โ–’       โ”‚  success + PR URL โ†’ pipeline-state.md  โ”‚                              โ–’
โ–’       โ”‚  no PR URL โ†’ re-queue once             โ”‚                              โ–’
โ–’       โ”‚  failure โ†’ log reason                  โ”‚                              โ–’
โ–’       โ”‚  disk cleanup: rm stale /tmp/clawoss-* โ”‚                              โ–’
โ–’       โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ                              โ–’
โ–’                           โ–ผ                                                   โ–’
โ–’       โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ                              โ–’
โ–’       โ”‚  7. REPORT + SELF-WAKE                 โ”‚                              โ–’
โ–’       โ”‚  dashboard-reporter: log cycle         โ”‚                              โ–’
โ–’       โ”‚  update wake-state.md counters         โ”‚                              โ–’
โ–’       โ”‚  active < 5? โ†’ go back to step 3       โ”‚                              โ–’
โ–’       โ”‚  openclaw system event "cycle-complete" โ”‚                              โ–’
โ–’       โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ                              โ–’
โ–’                                                                              โ–’
โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’

PII Sanitizer โ€” Content Filter Bypass

The plugins/pii-sanitizer/index.js (101 lines) performs bidirectional @ swapping so OpenRouter never sees the @ symbol that triggers its content filter.

โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“
โ–“                                                                             โ–“
โ–“  var FULLWIDTH_AT = '\uFF20'   // ๏ผ                                        โ–“
โ–“                                                                             โ–“
โ–“                      INCOMING (persist)                                     โ–“
โ–“   โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„                                โ–“
โ–“   sanitizeString(text)  โ†’  text.replace(/@/g, FULLWIDTH_AT)                 โ–“
โ–“         โ”‚                                                                   โ–“
โ–“         โ–ผ                                                                   โ–“
โ–“   deepSanitize(value)   โ†’  recurse strings, arrays, objects                 โ–“
โ–“         โ”‚                                                                   โ–“
โ–“         โ–ผ                                                                   โ–“
โ–“   sanitizeMessage(msg)  โ†’  returns { message: cleaned }                     โ–“
โ–“                                                                             โ–“
โ–“                                                                             โ–“
โ–“                      OUTGOING (execute)                                     โ–“
โ–“   โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„                                โ–“
โ–“   desanitizeString(text) โ†’ text.replace(FULLWIDTH_AT, '@')                  โ–“
โ–“         โ”‚                                                                   โ–“
โ–“         โ–ผ                                                                   โ–“
โ–“   deepDesanitize(value)  โ†’ same recursion, opposite direction               โ–“
โ–“                                                                             โ–“
โ–“                                                                             โ–“
โ–“   register(api) hooks:                                                      โ–“
โ–“                                                                             โ–“
โ–“   โ–‘ api.on('tool_result_persist')  โ†’ sanitize(@ โ†’ ๏ผ )  file reads          โ–“
โ–“   โ–’ api.on('before_message_write') โ†’ sanitize(@ โ†’ ๏ผ )  assistant output    โ–“
โ–“   โ–“ api.on('before_tool_call')     โ†’ desanitize(๏ผ  โ†’ @) write/edit/exec    โ–“
โ–“                                                                             โ–“
โ–“                                                                             โ–“
โ–“      Disk (@) โ”€โ”€readโ”€โ”€โ–ถ Session (๏ผ ) โ”€โ”€modelโ”€โ”€โ–ถ Tool call (๏ผ โ†’@) โ”€โ”€โ–ถ Disk   โ–“
โ–“                                                                             โ–“
โ–“      OpenRouter never sees raw @  โ”€โ”€โ–ถ  zero 403 content filter errors       โ–“
โ–“                                                                             โ–“
โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“

Telemetry Pipeline

โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘
โ–‘                                                                             โ–‘
โ–‘  dashboard-reporter/handler.ts (628 lines)                                  โ–‘
โ–‘  โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„                               โ–‘
โ–‘                                                                             โ–‘
โ–‘  State:  accumulatedInputTokens ยท accumulatedOutputTokens                   โ–‘
โ–‘          toolCallCount ยท reposUsed (Set) ยท subagentMeta (Map)               โ–‘
โ–‘  Cost:   INPUT_COST = $0.60/M  ยท  OUTPUT_COST = $3.00/M                    โ–‘
โ–‘                                                                             โ–‘
โ–‘  Events:                                                                    โ–‘
โ–‘  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    โ–‘
โ–‘  โ”‚ user_message     โ”‚ postConversation({role:"user", content})        โ”‚    โ–‘
โ–‘  โ”‚ after_tool_call  โ”‚ accumulate tokens + detect sessions_spawn       โ”‚    โ–‘
โ–‘  โ”‚                  โ”‚ track repos via regex on JSON.stringify(params) โ”‚    โ–‘
โ–‘  โ”‚                  โ”‚ relay sub-agent history (last 20 messages)      โ”‚    โ–‘
โ–‘  โ”‚ agent_end        โ”‚ flush metrics + heartbeat + state + logs        โ”‚    โ–‘
โ–‘  โ”‚                  โ”‚ costUsd = input * 0.6/M + output * 3.0/M       โ”‚    โ–‘
โ–‘  โ”‚                  โ”‚ RESET all accumulators                          โ”‚    โ–‘
โ–‘  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜    โ–‘
โ–‘                                                                             โ–‘
โ–‘  Network:                                                                   โ–‘
โ–‘  postNonBlocking(path, body)   โ†’ 2 attempts, 10s timeout, 3s retry          โ–‘
โ–‘  postConversation(body)        โ†’ 1 attempt, 5s timeout, fire-and-forget     โ–‘
โ–‘  postState(apiKey)             โ†’ reads work-queue.md + pipeline-state.md    โ–‘
โ–‘                                                                             โ–‘
โ–‘  โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€   โ–‘
โ–‘                                                                             โ–‘
โ–‘  audit-logger/handler.ts (133 lines)                                        โ–‘
โ–‘  โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„                                   โ–‘
โ–‘  Fire-and-forget structured logs. 10s timeout.                              โ–‘
โ–‘  command:new โ†’ "Session started"   (info)                                   โ–‘
โ–‘  after_tool_call โ†’ "Tool: {name}"  (debug / warn on error)                 โ–‘
โ–‘  agent_end โ†’ "Run completed"       (info / error)                          โ–‘
โ–‘                                                                             โ–‘
โ–‘  โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€   โ–‘
โ–‘                                                                             โ–‘
โ–‘  dashboard-sync.sh (319 lines) โ€” runs as background process                 โ–‘
โ–‘  โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„                         โ–‘
โ–‘  PID lock ยท md5 self-update every 60s ยท polls JSONL every 10s               โ–‘
โ–‘  build_session_map() โ†’ python3 reads sessions.json for sub-agent metadata   โ–‘
โ–‘  parse_content_blocks() โ†’ text/thinking/toolCall/tool_result                โ–‘
โ–‘  ROLE_MAP: userโ†’user, assistantโ†’assistant, toolResultโ†’tool_result           โ–‘
โ–‘  curl POST /api/ingest/conversation per new message                         โ–‘
โ–‘  curl POST /api/ingest/heartbeat with session counts                        โ–‘
โ–‘                                                                             โ–‘
โ–‘  โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€   โ–‘
โ–‘                                                                             โ–‘
โ–‘  pr-ledger-sync.sh (185 lines) โ€” runs every 60s via launchd                 โ–‘
โ–‘  โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„โ”„                            โ–‘
โ–‘  Source 1: gh search prs --author BillionClaw --limit 200                    โ–‘
โ–‘  Source 2: grep subagent-result-*.md for PR URLs                             โ–‘
โ–‘  Python merger: pr_map keyed by URL, GH is authoritative for status          โ–‘
โ–‘  Result files fill in issue numbers, existing ledger preserves mappings      โ–‘
โ–‘  Output: workspace/memory/pr-ledger.md (sorted markdown table)               โ–‘
โ–‘                                                                             โ–‘
โ–‘  All telemetry โ†’ clawoss-dashboard.vercel.app                                โ–‘
โ–‘                                                                             โ–‘
โ–‘  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    โ–‘
โ–‘  โ”‚ /api/ingest/heartbeat     โ† status, uptimeSeconds, repos           โ”‚    โ–‘
โ–‘  โ”‚ /api/ingest/metrics       โ† inputTokens, outputTokens, costUsd     โ”‚    โ–‘
โ–‘  โ”‚ /api/ingest/conversation  โ† sessionId, role, content, toolName     โ”‚    โ–‘
โ–‘  โ”‚ /api/ingest/state         โ† workQueue, pipelineState, activeRepos  โ”‚    โ–‘
โ–‘  โ”‚ /api/ingest/logs          โ† structured audit trail                 โ”‚    โ–‘
โ–‘  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜    โ–‘
โ–‘                                                                             โ–‘
โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘

Skills

Phase Skill What It Does
Discovery oss-discover gh search issues across all languages, score >= 5, write to queue
Discovery oss-triage Assess complexity (simple/medium/complex), decide attempt/skip/defer
Discovery repo-analyzer Repo health gate: stars, merge velocity, review rate, cache to repos/
Implement oss-implement Reproduce-first TDD: failing test โ†’ minimal fix โ†’ verify โ†’ evidence
Implement oss-review 7-gate quality check: scope, quality, tests, security, anti-slop, git, PR
Implement safety-checker 8-check final gate: budget, diff, secrets, branch, spam, CI, independent review
Submit oss-submit Push to fork, gh pr create, AI disclosure, log + report
Submit oss-followup Categorize review feedback, implement changes, max 3 rounds
Infra context-manager Monitor context %, flush at 80%, re-read after compaction
Infra dashboard-reporter Post telemetry to Vercel dashboard
Super systematic-debugging Root-cause-first, never guess
Super test-driven-development Red-green-refactor cycle
Super verification-before-completion Fresh evidence before claiming done
Super brainstorming Explore intent before complex design
Super requesting-code-review Dispatch isolated reviewer subagent

Cron Schedule

Job Schedule What It Does
work-queue-refill Every 2 hours oss-discover batch mode, score >= 5, write work-queue-staging.md
pr-followup-scan Every 30 min gh pr list --author @me, check reviews + CI, write followup-staging.md
daily-report 11pm daily Compile stats: submitted/merged/rejected, cost, acceptance rate
weekly-retrospective Mon 9am Review acceptance per repo, adjust scores, prune queue
memory-cleanup Sun 3am Archive >14d patterns, remove stale logs, prune closed PRs

Boot Sequence โ€” scripts/restart.sh

โ–‘ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ–‘
โ–‘                                                                             โ–‘
โ–‘  Step  1  โ–‘โ–‘   source .env                                                  โ–‘
โ–‘  Step  2  โ–‘โ–‘โ–‘  git config user.name BillionClaw                             โ–‘
โ–‘  Step  3  โ–‘โ–‘โ–‘โ–‘ gh auth login --with-token                                   โ–‘
โ–‘  Step  4  โ–’โ–’โ–’โ–’ ln -sf workspace โ†’ ~/.openclaw/workspace                    โ–‘
โ–‘  Step  5  โ–’โ–’โ–’โ–’โ–’ sed __WORKSPACE_PATH__ โ†’ deploy config                     โ–‘
โ–‘           โ–’โ–’โ–’โ–’โ–’ python3: inject API keys, strip empties                     โ–‘
โ–‘  Step  6  โ–“โ–“โ–“โ–“โ–“โ–“ rm sessions/*.jsonl *.lock                                โ–‘
โ–‘  Step  7  โ–“โ–“โ–“โ–“โ–“โ–“โ–“ reset wake-state.md counters                             โ–‘
โ–‘  Step  8  โ–“โ–“โ–“โ–“โ–“โ–“โ–“โ–“ clean stale /tmp/clawoss-* dirs                         โ–‘
โ–‘  Step  9  โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ openclaw gateway stop                                 โ–‘
โ–‘  Step 10  โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ openclaw gateway install                             โ–‘
โ–‘  Step 11  โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ nohup dashboard-sync.sh &                           โ–‘
โ–‘  Step 12  โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ launchctl load pr-ledger-sync                      โ–‘
โ–‘  Step 13  โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ openclaw system event --mode now                  โ–‘
โ–‘           โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ "Fill all 5 sub-agent slots. Go."                 โ–‘
โ–‘                                                                             โ–‘
โ–‘ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ”€ โ–‘

Safety Defaults

Rule Limit
Max lines changed per PR 200
Max files per PR 5
Max PRs per repo per day 3
Max PRs total per day 10
Min gap between same-repo PRs 30 minutes
Fix attempts before abandon 2
Review rounds before disengage 3
Push to main/master NEVER
Force-push NEVER
Commit secrets/.env NEVER
GitHub token scope public_repo only
Branch naming clawoss/<type>/<description>
Commit format Conventional Commits

Project Structure

clawOSS/
โ”œโ”€โ”€ config/
โ”‚   โ”œโ”€โ”€ openclaw.json ยทยทยทยทยทยทยทยทยทยทยทยท gateway + agent + compaction config
โ”‚   โ”œโ”€โ”€ cron-jobs.json ยทยทยทยทยทยทยทยทยทยทยท 5 scheduled jobs
โ”‚   โ””โ”€โ”€ com.clawoss.pr-ledger-sync.plist
โ”œโ”€โ”€ plugins/
โ”‚   โ””โ”€โ”€ pii-sanitizer/
โ”‚       โ””โ”€โ”€ index.js ยทยทยทยทยทยทยทยทยทยทยทยทยท 101 lines โ€” bidirectional @ โ†” ๏ผ 
โ”œโ”€โ”€ scripts/
โ”‚   โ”œโ”€โ”€ setup.sh ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท first-time install (145 lines)
โ”‚   โ”œโ”€โ”€ restart.sh ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท 13-step full restart (146 lines)
โ”‚   โ”œโ”€โ”€ start.sh ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท register agent + cron + gateway
โ”‚   โ”œโ”€โ”€ stop.sh ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท teardown
โ”‚   โ”œโ”€โ”€ health-check.sh ยทยทยทยทยทยทยทยทยทยท verify all systems
โ”‚   โ”œโ”€โ”€ dashboard-sync.sh ยทยทยทยทยทยทยทยท poll JSONL sessions (319 lines)
โ”‚   โ””โ”€โ”€ pr-ledger-sync.sh ยทยทยทยทยทยทยทยท merge GitHub API + result files (185 lines)
โ”œโ”€โ”€ dashboard/ ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท Next.js 15 + shadcn/ui + Turso
โ””โ”€โ”€ workspace/ ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท (symlinked to ~/.openclaw/workspace)
    โ”œโ”€โ”€ AGENTS.md ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท 163 lines โ€” prime directive + rules
    โ”œโ”€โ”€ HEARTBEAT.md ยทยทยทยทยทยทยทยทยทยทยทยทยท 244 lines โ€” 8-step autonomous loop
    โ”œโ”€โ”€ SOUL.md ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท persona, tone, boundaries
    โ”œโ”€โ”€ IDENTITY.md ยทยทยทยทยทยทยทยทยทยทยทยทยทยท @BillionClaw
    โ”œโ”€โ”€ USER.md ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท operator profile
    โ”œโ”€โ”€ hooks/
    โ”‚   โ”œโ”€โ”€ dashboard-reporter/ ยทยท 628 lines โ€” telemetry to Vercel
    โ”‚   โ””โ”€โ”€ audit-logger/ ยทยทยทยทยทยทยทยท 133 lines โ€” structured logs
    โ”œโ”€โ”€ skills/ ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท 15 skills (10 custom + 5 superpowers)
    โ””โ”€โ”€ memory/ ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท runtime state (agent-managed)
        โ”œโ”€โ”€ work-queue.md
        โ”œโ”€โ”€ pipeline-state.md
        โ”œโ”€โ”€ pr-ledger.md ยทยทยทยทยทยทยทยทยท auto-synced by pr-ledger-sync.sh
        โ”œโ”€โ”€ wake-state.md
        โ””โ”€โ”€ subagent-result-*.md

Dashboard

Live at clawoss-dashboard.vercel.app

  • Agent status + heartbeat
  • Live conversation feed (orchestrator + per-sub-agent tabs)
  • Token usage + cost tracking ($0.60/M input, $3.00/M output)
  • PR pipeline with status tracking
  • Structured audit logs
  • Work queue and pipeline state

How It Works โ€” The Short Version

  1. Gateway wakes the agent every 10 minutes
  2. Orchestrator checks context health, handles PR reviews, picks work from the queue
  3. Sub-agents (up to 5 parallel) each clone a repo, reproduce the bug, write a failing test, implement a minimal fix, verify, and submit a PR
  4. Telemetry streams everything to the Vercel dashboard in real-time
  5. Cron jobs refill the work queue, scan for PR reviews, compile daily reports
  6. PII sanitizer swaps @ โ†” ๏ผ  so the content filter never triggers
  7. PR ledger auto-syncs every 60s from GitHub API + sub-agent result files

The agent never stops. Empty sub-agent slots are filled immediately. Idle is failure.


License

MIT

About

modifications to OpenClaw that lets it autonomously make, judge, and submit & follow up PRs with 1 openclaw agent

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors