{"title":"To build a long-term AI assistant, I built the foundational components for OpenClaw and assembled a coding team.","url":"/en/posts/2026-02-28-openclaw-automation-sharing/","date":"2026-02-28","type":"posts","content":"\u003ch1 id=\"to-build-a-long-term-ai-assistant-i-forged-my-own-tools-and-assembled-a-coding-team-for-openclaw\"\u003e\n  To Build a Long-Term AI Assistant, I Forged My Own Tools and Assembled a Coding Team for OpenClaw\n  \u003ca class=\"heading-link\" href=\"#to-build-a-long-term-ai-assistant-i-forged-my-own-tools-and-assembled-a-coding-team-for-openclaw\"\u003e\n    \u003ci class=\"fa-solid fa-link\" aria-hidden=\"true\" title=\"Link to heading\"\u003e\u003c/i\u003e\n    \u003cspan class=\"sr-only\"\u003eLink to heading\u003c/span\u003e\n  \u003c/a\u003e\n\u003c/h1\u003e\n\u003cp\u003eForeword: This article was co-authored with my OpenClaw. My OpenClaw is purely cloud-based, so its capabilities are still limited. During the Chinese New Year, aside from taking care of my baby (just a few months old), I spent most of my time building OpenClaw through \u0026ldquo;vibe coding.\u0026rdquo; It can now help me get many things done quickly. I\u0026rsquo;m sure much of it was reinventing the wheel and not the optimal solution, but I feel the process is worth sharing—consider it my project for the Spring Festival. All the custom tools were built by OpenClaw\u0026rsquo;s own little team; I was just the commander. :)\u003c/p\u003e\n\u003cp\u003eMany people\u0026rsquo;s use of OpenClaw / Agents stops at the \u0026ldquo;chatting, researching, and writing\u0026rdquo; stage. However, I\u0026rsquo;ve taken it a step further: my current cloud-based OpenClaw is no longer a \u0026ldquo;chatbot\u0026rdquo; but an always-online cloud adjutant. It runs scheduled tasks daily, performs health self-checks, and reliably handles very specific jobs:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eAI Daily\u003c/strong\u003e: Automatically fetches my watchlist and X trending topics at 06:30 every day, generates a Chinese summary, and delivers it (via email/Discord).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eYesterday\u0026rsquo;s Email Summary\u003c/strong\u003e: Pulls from two IMAP mailboxes, automatically categorizes emails into \u0026ldquo;Expenses/Risks/Actions/FYI,\u0026rdquo; and sends a condensed summary.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eLocal Life/Travel\u003c/strong\u003e: Makes real calls to Amap to check ETA, routes, weather, and POIs, and generates a mobile-friendly map preview.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eOffice Collaboration\u003c/strong\u003e: Integrates with Outlook Mail and Calendar, reliably sending emails and creating meetings when the token is healthy.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eKnowledge Management\u003c/strong\u003e: Organizes key content into Markdown and syncs it to Obsidian/WebDAV.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eContinuous Development\u003c/strong\u003e: Uses a main Agent + coder/scoder collaborative workflow to asynchronously modify scripts and run self-checks for acceptance, without blocking the main conversation.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eHowever, once I started treating it as a system that needs to be always-on, continuously productive, recoverable, and verifiable—rather than just a \u0026ldquo;chat window\u0026rdquo;—the deeper I went, the more I encountered real problems that aren\u0026rsquo;t apparent with surface-level use:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eWhen conversations get long, the model quickly hits \u003cstrong\u003eTPM / context limits\u003c/strong\u003e, leading to slower responses, looser logic, and an increase in hallucinations.\u003c/li\u003e\n\u003cli\u003eWhile a \u003ccode\u003e/reset\u003c/code\u003e can restore its intelligence, the assistant immediately gets \u0026ldquo;amnesia\u0026rdquo;: it forgets the rules, the project progress, and the status of external services.\u003c/li\u003e\n\u003cli\u003eThe most dangerous part comes after adding more capabilities: \u003cstrong\u003ethe Agent will confidently give an output even when scripts, tokens, or APIs are broken\u003c/strong\u003e. You think the system is running, but it\u0026rsquo;s actually just \u0026lsquo;making things up.\u0026rsquo;\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eWhat I want to share in this article is how I solved these problems to build a long-term assistant, creating a runnable, recoverable, and auditable cloud AI operating system that can perform health self-checks and resume work 3 seconds after a reset. This involves physicalizing state, Reset V2, a three-piece health suite, and a closed-loop engineering process with multi-agent collaboration.\u003c/p\u003e\n\u003cp\u003eSo, I\u0026rsquo;m writing this not to showcase a cool demo, but to share a reusable architectural methodology that I already have up and running in the cloud:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003ePhysicalization\u003c/strong\u003e: Grounding memory, capabilities, and task states into the file system.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eReset V2 (Runtime Contract)\u003c/strong\u003e: Upgrading reset from \u0026ldquo;amnesia\u0026rdquo; to a \u0026ldquo;controlled reboot.\u0026rdquo;\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eHealth System (selftest / health / capabilities)\u003c/strong\u003e: To always be able to answer the question, \u0026ldquo;Can it still work reliably right now?\u0026rdquo;\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eMulti-Agent Collaboration (Main + coder + scoder)\u003c/strong\u003e: Turning coding from a chat-based promise into an engineering delivery.\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"1-runtime-environment-a-purely-server-side-hub-architecture-why-i-insist-on-the-cloud\"\u003e\n  1. Runtime Environment: A Purely Server-Side \u0026ldquo;Hub\u0026rdquo; Architecture (Why I Insist on the Cloud)\n  \u003ca class=\"heading-link\" href=\"#1-runtime-environment-a-purely-server-side-hub-architecture-why-i-insist-on-the-cloud\"\u003e\n    \u003ci class=\"fa-solid fa-link\" aria-hidden=\"true\" title=\"Link to heading\"\u003e\u003c/i\u003e\n    \u003cspan class=\"sr-only\"\u003eLink to heading\u003c/span\u003e\n  \u003c/a\u003e\n\u003c/h2\u003e\n\u003cp\u003eI chose not to run OpenClaw locally (e.g., on a Mac mini), and the core reason wasn\u0026rsquo;t performance, but the \u003cstrong\u003esecurity boundary\u003c/strong\u003e.\u003c/p\u003e\n\u003cp\u003eWhen you use an Agent deeply, it\u0026rsquo;s no longer just a \u0026ldquo;dialogue box for writing summaries\u0026rdquo; but a hub \u0026ldquo;connected to the real world.\u0026rdquo; It needs to hold my tokens for email, calendar, maps, news sources, and various accounts; run long-term cron jobs; read and write state files; and trigger script workflows. For me, placing this entire suite of capabilities directly on a desktop device is too risky—issues like permissions, network access, device loss, and human error become much less controllable.\u003c/p\u003e\n\u003cp\u003eThat\u0026rsquo;s why I placed it in a headless cloud environment:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eIsolation and Control\u003c/strong\u003e: A Linux VPS with Docker to lock down permissions, dependencies, and network boundaries.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e24/7 Availability\u003c/strong\u003e: Scheduled tasks don\u0026rsquo;t depend on my computer being on.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eEngineered System\u003c/strong\u003e: Due to the lack of desktop-level capabilities (i.e., no reliance on GUI operations), I was forced to engineer tasks into a system of \u0026ldquo;scripts + SOPs + health checks.\u0026rdquo; It is precisely these mechanisms that allowed it to evolve from a chat tool into a personal operating system.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThe system\u0026rsquo;s capabilities are connected as follows:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003ePhysical Deployment\u003c/strong\u003e: Linux VPS, containerized with Docker.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eHub Connections\u003c/strong\u003e: Gmail/Outlook, Zhuge Intelligence/Cloopen work email, Amap API, Yahoo Finance, Twitter (via Bird CLI).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eAsynchronous Delivery\u003c/strong\u003e: Even when I\u0026rsquo;m sleeping, I can wake up \u003ccode\u003egen_ai_digest.py\u003c/code\u003e at 6 AM, process last night\u0026rsquo;s information, and deliver it asynchronously via Outlook or Discord.\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"2-combatting-context-cancer-reset-v2s-background-and-two-iterations-including-health-system\"\u003e\n  2. Combatting \u0026ldquo;Context Cancer\u0026rdquo;: Reset V2\u0026rsquo;s Background and Two Iterations (Including Health System)\n  \u003ca class=\"heading-link\" href=\"#2-combatting-context-cancer-reset-v2s-background-and-two-iterations-including-health-system\"\u003e\n    \u003ci class=\"fa-solid fa-link\" aria-hidden=\"true\" title=\"Link to heading\"\u003e\u003c/i\u003e\n    \u003cspan class=\"sr-only\"\u003eLink to heading\u003c/span\u003e\n  \u003c/a\u003e\n\u003c/h2\u003e\n\u003cp\u003eI later came to realize a fact: the problem wasn\u0026rsquo;t that \u0026ldquo;models aren\u0026rsquo;t smart enough,\u0026rdquo; but that \u003cstrong\u003emodels inherently have limitations\u003c/strong\u003e, and I pushed OpenClaw to a depth that continuously triggered these limitations.\u003c/p\u003e\n\u003cp\u003eTaking Gemini as an example: as conversations and tasks progress, OpenClaw\u0026rsquo;s context continuously expands, eventually exceeding Gemini\u0026rsquo;s input limits; coupled with throttling like \u003cstrong\u003eTPM (Tokens Per Minute)\u003c/strong\u003e, the system enters a \u0026ldquo;brain fog state\u0026rdquo;: it slows down, becomes erratic, hallucinations increase, and API calls even directly error out/refuse service.\u003c/p\u003e\n\u003cp\u003eTherefore, I must regularly perform a mandatory action: \u003cstrong\u003ereset\u003c/strong\u003e.\u003c/p\u003e\n\u003cp\u003eHowever, the side effects of a reset are extremely fatal: at this point, OpenClaw has accumulated a large amount of \u0026ldquo;engineering assets\u0026rdquo;:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eIt has learned a set of development specifications and collaboration mechanisms for tasks/projects.\u003c/li\u003e\n\u003cli\u003eI have built up a collection of script tool libraries and capability routes.\u003c/li\u003e\n\u003cli\u003eThe engineering status, troubleshooting experience, and dependencies of existing projects are all in progress.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eA regular reset would instantly \u0026ldquo;disrupt\u0026rdquo; these things: it would forget the rules, forget the tool library, and wouldn\u0026rsquo;t actively re-learn.\nSo, all my subsequent mechanism designs essentially answer the same question:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eSince a reset is unavoidable, how can I ensure the system can quickly recover to a \u0026ldquo;trusted operational state\u0026rdquo; after a reset, and continue to develop and iterate?\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch3 id=\"21-first-iteration-pure-sop-recovery-heavy-and-unstable\"\u003e\n  2.1 First Iteration: Pure SOP Recovery (Heavy and Unstable)\n  \u003ca class=\"heading-link\" href=\"#21-first-iteration-pure-sop-recovery-heavy-and-unstable\"\u003e\n    \u003ci class=\"fa-solid fa-link\" aria-hidden=\"true\" title=\"Link to heading\"\u003e\u003c/i\u003e\n    \u003cspan class=\"sr-only\"\u003eLink to heading\u003c/span\u003e\n  \u003c/a\u003e\n\u003c/h3\u003e\n\u003cp\u003eIn the first iteration, I took a very intuitive approach: after a reset, I had the assistant reread SOP documents to restore its state.\u003c/p\u003e\n\u003cp\u003eI quickly discovered that it couldn\u0026rsquo;t solve the key problems:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eSOPs are mostly Markdown, lengthy, and recovery is costly.\u003c/li\u003e\n\u003cli\u003eMore fatally: even if it reread the SOPs, it would still forget the script tool library.\n—It might remember \u0026ldquo;what to do,\u0026rdquo; but not \u0026ldquo;which script to call, what capability entry points exist, or how to verify.\u0026rdquo;\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eTherefore, the SOP-only recovery method couldn\u0026rsquo;t achieve the \u0026ldquo;seconds-to-availability after restart\u0026rdquo; that I desired.\u003c/p\u003e\n\u003ch3 id=\"22-second-iteration-runtime-contractual-recovery-like-operating-system-bootstrapping\"\u003e\n  2.2 Second Iteration: Runtime Contractual Recovery (Like Operating System Bootstrapping)\n  \u003ca class=\"heading-link\" href=\"#22-second-iteration-runtime-contractual-recovery-like-operating-system-bootstrapping\"\u003e\n    \u003ci class=\"fa-solid fa-link\" aria-hidden=\"true\" title=\"Link to heading\"\u003e\u003c/i\u003e\n    \u003cspan class=\"sr-only\"\u003eLink to heading\u003c/span\u003e\n  \u003c/a\u003e\n\u003c/h3\u003e\n\u003cp\u003eThe second iteration involved a key suggestion from scoder:\nDon\u0026rsquo;t treat recovery as \u0026ldquo;reading documents\u0026rdquo;; treat it as \u0026ldquo;system startup\u0026rdquo; – using machine-readable runtime contracts + capability indexes + health checks to bring the state back online.\u003c/p\u003e\n\u003cp\u003eTherefore, I iterated to develop the \u003cstrong\u003eRuntime Contract\u003c/strong\u003e and BOOTSTRAP guided process: after a restart, three layers of definition files are loaded strictly in order.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eAfter the second iteration, I also documented the design process of \u0026ldquo;this runtime refactoring\u0026rdquo; as a project card (e.g., \u003ccode\u003eopenclaw-runtime-review.md\u003c/code\u003e).\nBecause the runtime itself is an evolving capability line: each time a new external service is introduced, or a new health threshold or self-check item is added, a traceable alignment anchor is needed.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch3 id=\"23-bootstrap-three-layers-identity--constitution--tooling\"\u003e\n  2.3 BOOTSTRAP Three Layers: Identity / Constitution / Tooling\n  \u003ca class=\"heading-link\" href=\"#23-bootstrap-three-layers-identity--constitution--tooling\"\u003e\n    \u003ci class=\"fa-solid fa-link\" aria-hidden=\"true\" title=\"Link to heading\"\u003e\u003c/i\u003e\n    \u003cspan class=\"sr-only\"\u003eLink to heading\u003c/span\u003e\n  \u003c/a\u003e\n\u003c/h3\u003e\n\u003ch3 id=\"layer-one-soul-and-persona-identity-layer\"\u003e\n  Layer One: Soul and Persona (Identity Layer)\n  \u003ca class=\"heading-link\" href=\"#layer-one-soul-and-persona-identity-layer\"\u003e\n    \u003ci class=\"fa-solid fa-link\" aria-hidden=\"true\" title=\"Link to heading\"\u003e\u003c/i\u003e\n    \u003cspan class=\"sr-only\"\u003eLink to heading\u003c/span\u003e\n  \u003c/a\u003e\n\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003eSOUL.md\u003c/code\u003e defines the Agent\u0026rsquo;s self-perception and behavioral red lines. I deliberately wrote it to be \u0026ldquo;action-oriented\u0026rdquo;:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eRefuse meaningless pleasantries, directly provide results.\u003c/li\u003e\n\u003cli\u003eRead-only operations without asking for permission (checking traffic/calendar).\u003c/li\u003e\n\u003cli\u003eTo remember something, it must be written to a file; prohibited from \u0026ldquo;remembering\u0026rdquo; through conversation.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-markdown\" data-lang=\"markdown\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gh\"\u003e# SOUL.md\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gh\"\u003e\u003c/span\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e Name: Jobs\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e Vibe: Sharp, Concise, No-nonsense.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e Core Truths:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003e-\u003c/span\u003e Be genuinely helpful, not performatively helpful.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003e-\u003c/span\u003e Don\u0026#39;t ask permission for read-only actions.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003e-\u003c/span\u003e If you want to remember something, WRITE IT TO A FILE.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"layer-two-operating-constitution-constitution-layer\"\u003e\n  Layer Two: Operating Constitution (Constitution Layer)\n  \u003ca class=\"heading-link\" href=\"#layer-two-operating-constitution-constitution-layer\"\u003e\n    \u003ci class=\"fa-solid fa-link\" aria-hidden=\"true\" title=\"Link to heading\"\u003e\u003c/i\u003e\n    \u003cspan class=\"sr-only\"\u003eLink to heading\u003c/span\u003e\n  \u003c/a\u003e\n\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003eruntime/RUNTIME-CONTRACT.md\u003c/code\u003e is the system\u0026rsquo;s \u0026ldquo;constitution,\u0026rdquo; machine-readable, with hard constraints. The focus isn\u0026rsquo;t slogans, but two mechanisms:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1) Mandatory Selftest\u003c/strong\u003e\nAfter a reset, \u003ccode\u003eselftest_all.sh\u003c/code\u003e must be run, with actual connections to external services:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eOutlook: Refresh OAuth Token.\u003c/li\u003e\n\u003cli\u003eIMAP: Log in to email to confirm password/permissions are valid.\u003c/li\u003e\n\u003cli\u003eMap API: Real route/weather requests to confirm quota and return structure are normal.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003e2) Health Lock\u003c/strong\u003e\nIf a self-test fails, a health file is generated (e.g., \u003ccode\u003eruntime/health/outlook.json\u003c/code\u003e marked \u003ccode\u003estatus: error\u003c/code\u003e), and all subsequent related operations are automatically intercepted to prevent the Agent from blindly trying and getting accounts locked.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-markdown\" data-lang=\"markdown\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gh\"\u003e# RUNTIME-CONTRACT.md\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gh\"\u003e\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e## 健康状态与 selftest 契约\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e\u003c/span\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e Reset 后必须运行 selftest/selftest_all.sh\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e 任何操作前必须检查 runtime/health/*.json 状态\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e## 全局硬规则\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gu\"\u003e\u003c/span\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e 时区：默认 Asia/Shanghai，禁止自作聪明转换\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e 专用实现优先：capability 中有定义，禁止使用通用 LLM 瞎猜 API\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"layer-three-capability-index-tooling-layer\"\u003e\n  Layer Three: Capability Index (Tooling Layer)\n  \u003ca class=\"heading-link\" href=\"#layer-three-capability-index-tooling-layer\"\u003e\n    \u003ci class=\"fa-solid fa-link\" aria-hidden=\"true\" title=\"Link to heading\"\u003e\u003c/i\u003e\n    \u003cspan class=\"sr-only\"\u003eLink to heading\u003c/span\u003e\n  \u003c/a\u003e\n\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003eruntime/capabilities.yaml\u003c/code\u003e is similar to an API gateway routing table: it precisely defines natural language intentions and binds SOPs and health as prerequisites.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-yaml\" data-lang=\"yaml\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# capabilities.yaml\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\u003c/span\u003e\u003cspan class=\"nt\"\u003elocal_maps\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003esummary\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;查路线/POI/天气\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003esops\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;memory/route-planning-SOP.md\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eentry_scripts\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eroute\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;python3 scripts/route_eta_amap.py \u0026#34;{origin}\u0026#34; \u0026#34;{dest}\u0026#34; --mode drive\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003epoi\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;python3 scripts/poi_search.py \u0026#34;{location}\u0026#34; \u0026#34;{keyword}\u0026#34;\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"24-reset-v2s-health-system-integrated-into-bootstrapping-the-capability-check-trifecta-selftest--health--capabilities\"\u003e\n  2.4 Reset V2\u0026rsquo;s \u0026ldquo;Health System\u0026rdquo; Integrated into Bootstrapping: The Capability Check Trifecta (selftest / health / capabilities)\n  \u003ca class=\"heading-link\" href=\"#24-reset-v2s-health-system-integrated-into-bootstrapping-the-capability-check-trifecta-selftest--health--capabilities\"\u003e\n    \u003ci class=\"fa-solid fa-link\" aria-hidden=\"true\" title=\"Link to heading\"\u003e\u003c/i\u003e\n    \u003cspan class=\"sr-only\"\u003eLink to heading\u003c/span\u003e\n  \u003c/a\u003e\n\u003c/h3\u003e\n\u003cp\u003eThis Runtime Contract ultimately aims to answer a very specific question:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003eCan this OpenClaw reliably perform its tasks right now?\u003c/strong\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eTherefore, I\u0026rsquo;ve converged \u0026ldquo;availability\u0026rdquo; into a \u003cstrong\u003ethree-part capability check\u003c/strong\u003e, and these are part of the Reset bootstrap. To avoid just discussing concepts, I\u0026rsquo;ll explain them from the perspective of \u0026ldquo;script/file division of labor\u0026rdquo;: who is responsible for self-check, who is responsible for persisting state, and who is responsible for routing natural language to the correct capability entry point.\u003c/p\u003e\n\u003chr\u003e\n\u003ch3 id=\"241-selftest_allsh-one-click-master-self-check-scheduling-script-full-machine-smoke-test-entry\"\u003e\n  2.4.1 \u003ccode\u003eselftest_all.sh\u003c/code\u003e: One-Click Master Self-Check Scheduling Script (Full Machine Smoke Test Entry)\n  \u003ca class=\"heading-link\" href=\"#241-selftest_allsh-one-click-master-self-check-scheduling-script-full-machine-smoke-test-entry\"\u003e\n    \u003ci class=\"fa-solid fa-link\" aria-hidden=\"true\" title=\"Link to heading\"\u003e\u003c/i\u003e\n    \u003cspan class=\"sr-only\"\u003eLink to heading\u003c/span\u003e\n  \u003c/a\u003e\n\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003ePurpose\u003c/strong\u003e:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eAs the main entry point, it serially/concurrently calls \u003ccode\u003eselftest/\u0026lt;domain\u0026gt;.sh\u003c/code\u003e from various domains.\u003c/li\u003e\n\u003cli\u003eAfter running, it ensures that \u003ccode\u003eruntime/health/*.json\u003c/code\u003e are all \u003cstrong\u003ethe latest check results\u003c/strong\u003e (refreshing the entire machine\u0026rsquo;s health report).\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eCore Behavior\u003c/strong\u003e (abstract understanding is sufficient):\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eIterates through capability domains, for example:\n\u003ccode\u003eai_daily / email_summary / email_check / outlook / local_maps / stocks / twitter_bird / ob_webdav / coding / web_preview / cron_midday_evening_briefing ...\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eExecutes for each domain:\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ebash selftest/\u0026lt;domain\u0026gt;.sh\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/li\u003e\n\u003cli\u003eEach selftest script internally writes/updates: \u003ccode\u003eruntime/health/\u0026lt;domain\u0026gt;.json\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eSo, the essence of \u003ccode\u003eselftest_all.sh\u003c/code\u003e can be understood in one sentence:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003eBatch refresh all capability health reports.\u003c/strong\u003e\nRun a smoke test on all capabilities first thing in the morning.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003chr\u003e\n\u003ch3 id=\"242-selftestdomainsh-health-check-script-for-a-single-domain-minimum-but-real-business-verification\"\u003e\n  2.4.2 \u003ccode\u003eselftest/\u0026lt;domain\u0026gt;.sh\u003c/code\u003e: Health Check Script for a Single Domain (Minimum but Real Business Verification)\n  \u003ca class=\"heading-link\" href=\"#242-selftestdomainsh-health-check-script-for-a-single-domain-minimum-but-real-business-verification\"\u003e\n    \u003ci class=\"fa-solid fa-link\" aria-hidden=\"true\" title=\"Link to heading\"\u003e\u003c/i\u003e\n    \u003cspan class=\"sr-only\"\u003eLink to heading\u003c/span\u003e\n  \u003c/a\u003e\n\u003c/h3\u003e\n\u003cp\u003eEach domain has one \u003ccode\u003eselftest\u003c/code\u003e script, responsible for performing \u0026quot; \u003cstrong\u003eminimum but real\u003c/strong\u003e \u0026quot; business verification: It doesn\u0026rsquo;t run empty shells but \u003cstrong\u003eactually connects to an external service / runs a dry-run / validates a critical path once\u003c/strong\u003e.\u003c/p\u003e\n\u003cp\u003eSeveral typical examples:\u003c/p\u003e\n\u003ch4 id=\"selftestai_dailysh\"\u003e\n  \u003ccode\u003eselftest/ai_daily.sh\u003c/code\u003e\n  \u003ca class=\"heading-link\" href=\"#selftestai_dailysh\"\u003e\n    \u003ci class=\"fa-solid fa-link\" aria-hidden=\"true\" title=\"Link to heading\"\u003e\u003c/i\u003e\n    \u003cspan class=\"sr-only\"\u003eLink to heading\u003c/span\u003e\n  \u003c/a\u003e\n\u003c/h4\u003e\n\u003cp\u003e\u003cstrong\u003eCheck\u003c/strong\u003e: Can \u003ccode\u003egen_ai_digest.py --dry-run\u003c/code\u003e run, and confirm:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eWatchlist JSON can be read\u003c/li\u003e\n\u003cli\u003eBird CLI can return AI hotspots\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eGEMINI_API_KEY\u003c/code\u003e is available (LLM calls do not error)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eOutput\u003c/strong\u003e: Update \u003ccode\u003eruntime/health/ai_daily.json\u003c/code\u003e (status / checked_at / detail)\u003c/p\u003e\n\u003ch4 id=\"selftestemail_summarysh\"\u003e\n  \u003ccode\u003eselftest/email_summary.sh\u003c/code\u003e\n  \u003ca class=\"heading-link\" href=\"#selftestemail_summarysh\"\u003e\n    \u003ci class=\"fa-solid fa-link\" aria-hidden=\"true\" title=\"Link to heading\"\u003e\u003c/i\u003e\n    \u003cspan class=\"sr-only\"\u003eLink to heading\u003c/span\u003e\n  \u003c/a\u003e\n\u003c/h4\u003e\n\u003cp\u003e\u003cstrong\u003eCheck\u003c/strong\u003e:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eConnect to Zhuge Intelligence + Cloopen IMAP (can dry-run by fetching only 1 email)\u003c/li\u003e\n\u003cli\u003eRun \u003ccode\u003egen_email_summary.py --dry-run\u003c/code\u003e to see if it finishes normally\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eOutput\u003c/strong\u003e: Update \u003ccode\u003eruntime/health/email_summary.json\u003c/code\u003e, detail usually includes IMAP connection status\u003c/p\u003e\n\u003ch4 id=\"selftestoutlooksh\"\u003e\n  \u003ccode\u003eselftest/outlook.sh\u003c/code\u003e\n  \u003ca class=\"heading-link\" href=\"#selftestoutlooksh\"\u003e\n    \u003ci class=\"fa-solid fa-link\" aria-hidden=\"true\" title=\"Link to heading\"\u003e\u003c/i\u003e\n    \u003cspan class=\"sr-only\"\u003eLink to heading\u003c/span\u003e\n  \u003c/a\u003e\n\u003c/h4\u003e\n\u003cp\u003e\u003cstrong\u003eCheck\u003c/strong\u003e:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eCall \u003ccode\u003eskills/outlook/scripts/outlook-token.sh test\u003c/code\u003e to verify Token\u003c/li\u003e\n\u003cli\u003eOptional: dry-run sending mail or \u003ccode\u003eoutlook-calendar.sh today\u003c/code\u003e to confirm API returns normally\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eOutput\u003c/strong\u003e: Update \u003ccode\u003eruntime/health/outlook.json\u003c/code\u003e (Token status / last successful send or fetch)\u003c/p\u003e\n\u003ch4 id=\"selftestlocal_mapssh\"\u003e\n  \u003ccode\u003eselftest/local_maps.sh\u003c/code\u003e\n  \u003ca class=\"heading-link\" href=\"#selftestlocal_mapssh\"\u003e\n    \u003ci class=\"fa-solid fa-link\" aria-hidden=\"true\" title=\"Link to heading\"\u003e\u003c/i\u003e\n    \u003cspan class=\"sr-only\"\u003eLink to heading\u003c/span\u003e\n  \u003c/a\u003e\n\u003c/h4\u003e\n\u003cp\u003e\u003cstrong\u003eCheck\u003c/strong\u003e:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eCall \u003ccode\u003eamap_weather.py\u003c/code\u003e or \u003ccode\u003eroute_eta_amap.py\u003c/code\u003e once\u003c/li\u003e\n\u003cli\u003eConfirm AMap key exists and is not expired, response structure is parsable\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eOutput\u003c/strong\u003e: Update \u003ccode\u003eruntime/health/local_maps.json\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eOther domains (\u003ccode\u003estocks.sh / twitter_bird.sh / ob_webdav.sh / coding.sh / web_preview.sh\u003c/code\u003e, etc.) follow the same pattern: \u003cstrong\u003eUse a minimal business call to verify the link, then write the health JSON.\u003c/strong\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003ch3 id=\"243-runtimehealthjson-health-report-for-each-capability-traffic-light--degrade-switch\"\u003e\n  2.4.3 \u003ccode\u003eruntime/health/*.json\u003c/code\u003e: Health Report for Each Capability (Traffic Light + Degrade Switch)\n  \u003ca class=\"heading-link\" href=\"#243-runtimehealthjson-health-report-for-each-capability-traffic-light--degrade-switch\"\u003e\n    \u003ci class=\"fa-solid fa-link\" aria-hidden=\"true\" title=\"Link to heading\"\u003e\u003c/i\u003e\n    \u003cspan class=\"sr-only\"\u003eLink to heading\u003c/span\u003e\n  \u003c/a\u003e\n\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003eruntime/health/*.json\u003c/code\u003e is not a script, but the \u003cstrong\u003eoutput file of selftest\u003c/strong\u003e. It acts as the \u0026ldquo;authoritative state source\u0026rdquo; in the system: the main Agent, SOP, and Cron must consult it before deciding on the next action.\u003c/p\u003e\n\u003cp\u003eSuggested unified field format (illustrative):\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-json\" data-lang=\"json\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;status\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;ok | degraded | error | unknown\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;checked_at\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;2026-02-25T02:15:37Z\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;detail\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;最近一次自检结果摘要\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;details\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nt\"\u003e\u0026#34;...\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;可选：更细节字段\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cstrong\u003eBusiness meaning of status\u003c/strong\u003e:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eok\u003c/code\u003e: This domain\u0026rsquo;s capabilities can be safely executed, and the output can be considered a \u0026ldquo;business credible result.\u0026rdquo;\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003edegraded\u003c/code\u003e: Partially available; risks/limitations need to be highlighted in the response.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eerror\u003c/code\u003e: This domain is considered unavailable; only the reason can be explained + a degradation plan provided.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eunknown\u003c/code\u003e: Self-check has not been run or is expired; selftest should be triggered before execution.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eTypical mapping:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eruntime/health/ai_daily.json\u003c/code\u003e determines if the AI Daily pipeline is trustworthy.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eruntime/health/email_summary.json\u003c/code\u003e determines if yesterday\u0026rsquo;s summary can run.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eruntime/health/outlook.json\u003c/code\u003e Decide whether to \u003cstrong\u003eallow sending Outlook emails/writing schedules\u003c/strong\u003e (key to health lock)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eruntime/health/local_maps.json\u003c/code\u003e Decide whether to use a real interface for checking ETA/weather\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch3 id=\"244-runtimecapabilitiesyaml-routing-table-from-intent-to-script--sop--health-capability-map\"\u003e\n  2.4.4 \u003ccode\u003eruntime/capabilities.yaml\u003c/code\u003e: Routing table from intent to \u0026ldquo;script + SOP + health\u0026rdquo; (capability map)\n  \u003ca class=\"heading-link\" href=\"#244-runtimecapabilitiesyaml-routing-table-from-intent-to-script--sop--health-capability-map\"\u003e\n    \u003ci class=\"fa-solid fa-link\" aria-hidden=\"true\" title=\"Link to heading\"\u003e\u003c/i\u003e\n    \u003cspan class=\"sr-only\"\u003eLink to heading\u003c/span\u003e\n  \u003c/a\u003e\n\u003c/h3\u003e\n\u003cp\u003eThe last part of the trinity is not a script, but a configuration: \u003ccode\u003eruntime/capabilities.yaml\u003c/code\u003e.\nIt tells the Agent:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eWhen the user says X:\n\u003cstrong\u003eWhich health to check first\u003c/strong\u003e → \u003cstrong\u003eWhich selftest to run\u003c/strong\u003e when unhealthy → \u003cstrong\u003eWhich script to execute\u003c/strong\u003e when healthy → And refer to \u003cstrong\u003ewhich SOP/project cards\u003c/strong\u003e to interpret the output.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eA more complete domain configuration example:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-yaml\" data-lang=\"yaml\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003elocal_maps\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003esummary\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;本地生活 / 地图 \u0026amp; 路线（AMap）——drive/walk/transit 多方案 ETA...\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eintents\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;route\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;poi\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;weather\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eentry_scripts\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eroute\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;python3 scripts/route_eta_amap.py \u0026#34;{origin}\u0026#34; \u0026#34;{dest}\u0026#34; --mode drive --text\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003epoi\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e   \u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;python3 scripts/poi_search.py \u0026#34;{location}\u0026#34; \u0026#34;{keyword}\u0026#34; --radius 3000 --text\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ehealth_file\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;runtime/health/local_maps.json\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eselftest\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;selftest/local_maps.sh\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003esops\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"s2\"\u003e\u0026#34;memory/route-planning-SOP.md\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"s2\"\u003e\u0026#34;memory/poi-search-SOP.md\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003ehard_rules\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"s2\"\u003e\u0026#34;禁止直接用经验或 web_search 回答路线/ETA/POI/天气，除非专用实现不可用并说明原因。\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cstrong\u003eField division at a glance\u003c/strong\u003e:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eentry_scripts.*\u003c/code\u003e: The actual business script (route/poi/weather\u0026hellip;)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eselftest\u003c/code\u003e: Which selftest to run when health is expired/unknown\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ehealth_file\u003c/code\u003e: Which health report to check before execution\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003esops\u003c/code\u003e: Binds interpretation and operational norms (refer back to project cards when necessary)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ehard_rules\u003c/code\u003e: Mandatory constraint \u0026ldquo;if a dedicated implementation can be used, no guessing allowed\u0026rdquo;\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch3 id=\"245-summary-in-one-sentence-how-the-trinity-cooperates\"\u003e\n  2.4.5 Summary in one sentence: How the trinity cooperates\n  \u003ca class=\"heading-link\" href=\"#245-summary-in-one-sentence-how-the-trinity-cooperates\"\u003e\n    \u003ci class=\"fa-solid fa-link\" aria-hidden=\"true\" title=\"Link to heading\"\u003e\u003c/i\u003e\n    \u003cspan class=\"sr-only\"\u003eLink to heading\u003c/span\u003e\n  \u003c/a\u003e\n\u003c/h3\u003e\n\u003cp\u003eCondensing the collaborative relationship of the trinity into one sentence:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eselftest_all.sh\u003c/code\u003e: \u003cstrong\u003eBatch schedule all selftests\u003c/strong\u003e, refresh the health status of the entire machine\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eselftest/\u0026lt;domain\u0026gt;.sh\u003c/code\u003e: Perform \u003cstrong\u003eminimal but real business selftests\u003c/strong\u003e on a single capability line, update corresponding health\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eruntime/health/*.json\u003c/code\u003e: \u003cstrong\u003eTraffic light health reports\u003c/strong\u003e for each domain, deciding whether to execute, how to degrade, whether to lock\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eruntime/capabilities.yaml\u003c/code\u003e: Route \u0026ldquo;user\u0026rsquo;s one sentence\u0026rdquo; to \u003cstrong\u003escript + SOP + health + selftest\u003c/strong\u003e, which is the \u0026ldquo;map\u0026rdquo; of the capability layer\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"25-benefits-3-seconds-to-restore-to-a-trusted-running-state-after-reset\"\u003e\n  2.5 Benefits: 3 seconds to restore to a trusted running state after Reset\n  \u003ca class=\"heading-link\" href=\"#25-benefits-3-seconds-to-restore-to-a-trusted-running-state-after-reset\"\u003e\n    \u003ci class=\"fa-solid fa-link\" aria-hidden=\"true\" title=\"Link to heading\"\u003e\u003c/i\u003e\n    \u003cspan class=\"sr-only\"\u003eLink to heading\u003c/span\u003e\n  \u003c/a\u003e\n\u003c/h4\u003e\n\u003cp\u003eNow reset no longer means \u0026ldquo;amnesia\u0026rdquo;, but a controllable restart:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u0026ldquo;Outlook module is healthy, map module is degraded (rate limited), I have 11 available capabilities.\u0026rdquo;\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eIt doesn\u0026rsquo;t need to remember what was just discussed, because \u003cstrong\u003ethe state is in the file, not in the conversation history\u003c/strong\u003e.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"3-solving-execution-chronic-problems-asynchronous-collaboration-model-of-primary-and-secondary-agents-edtp\"\u003e\n  3. Solving execution chronic problems: Asynchronous collaboration model of primary and secondary Agents (EDTP)\n  \u003ca class=\"heading-link\" href=\"#3-solving-execution-chronic-problems-asynchronous-collaboration-model-of-primary-and-secondary-agents-edtp\"\u003e\n    \u003ci class=\"fa-solid fa-link\" aria-hidden=\"true\" title=\"Link to heading\"\u003e\u003c/i\u003e\n    \u003cspan class=\"sr-only\"\u003eLink to heading\u003c/span\u003e\n  \u003c/a\u003e\n\u003c/h2\u003e\n\u003cp\u003eThe starting point for multi-Agent collaborative programming is actually the simultaneous existence of three pain points:\u003c/p\u003e\n\u003ch3 id=\"a-a-single-primary-agent-is-either-too-expensive-or-only-talks-but-doesnt-act\"\u003e\n  a) A single primary Agent is either too expensive or only talks but doesn\u0026rsquo;t act\n  \u003ca class=\"heading-link\" href=\"#a-a-single-primary-agent-is-either-too-expensive-or-only-talks-but-doesnt-act\"\u003e\n    \u003ci class=\"fa-solid fa-link\" aria-hidden=\"true\" title=\"Link to heading\"\u003e\u003c/i\u003e\n    \u003cspan class=\"sr-only\"\u003eLink to heading\u003c/span\u003e\n  \u003c/a\u003e\n\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eUsing heavy intelligent agent models is effective but costly, and prone to \u0026ldquo;overly complex planning\u0026rdquo;\u003c/li\u003e\n\u003cli\u003eUsing ordinary conversational models is low cost, but a common problem is \u0026ldquo;only talks but doesn\u0026rsquo;t act\u0026rdquo;\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"b-i-learn-from-gui-programming-primary-thread-does-not-block-secondary-threads-do-heavy-work\"\u003e\n  b) I learn from GUI programming: primary thread does not block, secondary threads do heavy work\n  \u003ca class=\"heading-link\" href=\"#b-i-learn-from-gui-programming-primary-thread-does-not-block-secondary-threads-do-heavy-work\"\u003e\n    \u003ci class=\"fa-solid fa-link\" aria-hidden=\"true\" title=\"Link to heading\"\u003e\u003c/i\u003e\n    \u003cspan class=\"sr-only\"\u003eLink to heading\u003c/span\u003e\n  \u003c/a\u003e\n\u003c/h3\u003e\n\u003cp\u003eLike mobile apps/desktop programs: the primary thread is responsible for interactive response, and secondary threads asynchronously handle time-consuming logic and IO.\nSimilarly, multi-Agent frees the primary Agent, allowing it to maintain task reception and demand analysis capabilities, and handing over heavy development/long tasks to secondary Agents for silent completion.\u003c/p\u003e\n\u003ch3 id=\"c-primary-agent--coder--scoder-trade-cost-for-scale-trade-review-for-reliability\"\u003e\n  c) Primary Agent + coder + scoder: trade cost for scale, trade review for reliability\n  \u003ca class=\"heading-link\" href=\"#c-primary-agent--coder--scoder-trade-cost-for-scale-trade-review-for-reliability\"\u003e\n    \u003ci class=\"fa-solid fa-link\" aria-hidden=\"true\" title=\"Link to heading\"\u003e\u003c/i\u003e\n    \u003cspan class=\"sr-only\"\u003eLink to heading\u003c/span\u003e\n  \u003c/a\u003e\n\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003ePrimary Agent (Jobs) = PM/Tech Lead\u003c/strong\u003e: Decomposes tasks, writes task descriptions, performs acceptance, does not directly modify code (high token cost for primary conversation)\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ecoder = primary engineer\u003c/strong\u003e: Uses cheaper programming models to modify scripts, add logs, and self-test to close the loop\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003escoder (Senior) = Architect/Review\u003c/strong\u003e: Uses stronger models for solutions and reviews, improving the quality and reliability of complex projects\u003c/li\u003e\n\u003c/ul\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIn practice, the primary Agent usually locates the corresponding project card before assigning a task:\n\u0026ldquo;This requirement belongs to \u003ccode\u003eai_daily\u003c/code\u003e / \u003ccode\u003eemail_summary\u003c/code\u003e, which line\u0026rsquo;s iteration version\u0026rdquo;, and then writes the Task Spec (goals, constraints, acceptance commands) accordingly.\nIn this way, the coder\u0026rsquo;s changes will not deviate from the business topology, and the scoder\u0026rsquo;s review will also have a unified alignment baseline.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch3 id=\"31-edtp-evidence-driven-task-distribution-protocol\"\u003e\n  3.1 EDTP: Evidence-Driven Task Distribution Protocol\n  \u003ca class=\"heading-link\" href=\"#31-edtp-evidence-driven-task-distribution-protocol\"\u003e\n    \u003ci class=\"fa-solid fa-link\" aria-hidden=\"true\" title=\"Link to heading\"\u003e\u003c/i\u003e\n    \u003cspan class=\"sr-only\"\u003eLink to heading\u003c/span\u003e\n  \u003c/a\u003e\n\u003c/h3\u003e\n\u003cp\u003eBefore the primary Agent starts the coder/scoder, the Task Spec must meet four conditions:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003eEvidence-based entry\u003c/strong\u003e: Clear file path, key functions/branches/line numbers given when necessary\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eActive Role\u003c/strong\u003e: Declare the sub-Agent\u0026rsquo;s expert persona (Deep Researcher / System Architect / Senior Debugger / Protocol Specialist)\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCognitive Alignment Handshake\u003c/strong\u003e: The sub-agent restates the task and environment upon startup.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eLayered Evidence Loop\u003c/strong\u003e: The \u003ccode\u003ecoder\u003c/code\u003e provides commands and their output; the \u003ccode\u003eresearcher\u003c/code\u003e provides a chain of facts and citations.\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"32-division-of-responsibilities-main--coder--scoder\"\u003e\n  3.2 Division of Responsibilities: Main / coder / scoder\n  \u003ca class=\"heading-link\" href=\"#32-division-of-responsibilities-main--coder--scoder\"\u003e\n    \u003ci class=\"fa-solid fa-link\" aria-hidden=\"true\" title=\"Link to heading\"\u003e\u003c/i\u003e\n    \u003cspan class=\"sr-only\"\u003eLink to heading\u003c/span\u003e\n  \u003c/a\u003e\n\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eMain Agent\u003c/strong\u003e: Understands requirements, breaks down tasks, writes Task Specs, decides which sub-agent to activate, and performs acceptance testing.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ecoder\u003c/strong\u003e: Modifies code, adjusts cron jobs, adds logs, and performs self-checks based on the Task Spec. Delivers \u0026ldquo;modified files + verification command + output\u0026rdquo;.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003escoder\u003c/strong\u003e: Intervenes for system-level refactoring, complex requirements, or when the \u003ccode\u003ecoder\u003c/code\u003e fails after multiple attempts. Creates architectural designs and conducts reviews.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"33-three-task-status-levels-statements-must-align-with-facts\"\u003e\n  3.3 Three Task Status Levels: Statements Must Align with Facts\n  \u003ca class=\"heading-link\" href=\"#33-three-task-status-levels-statements-must-align-with-facts\"\u003e\n    \u003ci class=\"fa-solid fa-link\" aria-hidden=\"true\" title=\"Link to heading\"\u003e\u003c/i\u003e\n    \u003cspan class=\"sr-only\"\u003eLink to heading\u003c/span\u003e\n  \u003c/a\u003e\n\u003c/h3\u003e\n\u003cp\u003eCoding tasks are only allowed three statuses: Not Started / In Progress / Completed. The Main Agent is prohibited from verbally stating \u0026ldquo;it\u0026rsquo;s in progress\u0026rdquo; or \u0026ldquo;it\u0026rsquo;s done\u0026rdquo; unless a corresponding session and verification record exists.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"4-solidifying-personalized-capabilities-the-sop-and-project-card-mechanism\"\u003e\n  4. Solidifying Personalized Capabilities: The SOP and Project Card Mechanism\n  \u003ca class=\"heading-link\" href=\"#4-solidifying-personalized-capabilities-the-sop-and-project-card-mechanism\"\u003e\n    \u003ci class=\"fa-solid fa-link\" aria-hidden=\"true\" title=\"Link to heading\"\u003e\u003c/i\u003e\n    \u003cspan class=\"sr-only\"\u003eLink to heading\u003c/span\u003e\n  \u003c/a\u003e\n\u003c/h2\u003e\n\u003ch3 id=\"41-sops-general-skills-are-insufficient-for-my-highly-personalized-scenarios\"\u003e\n  4.1 SOPs: General Skills Are Insufficient for My Highly Personalized Scenarios\n  \u003ca class=\"heading-link\" href=\"#41-sops-general-skills-are-insufficient-for-my-highly-personalized-scenarios\"\u003e\n    \u003ci class=\"fa-solid fa-link\" aria-hidden=\"true\" title=\"Link to heading\"\u003e\u003c/i\u003e\n    \u003cspan class=\"sr-only\"\u003eLink to heading\u003c/span\u003e\n  \u003c/a\u003e\n\u003c/h3\u003e\n\u003cp\u003eGeneral skills solve for generalized capabilities, but many of my tasks are highly personalized: accounts, knowledge structures, task workflows, classification criteria, output formats, fallback strategies, and more.\nThese cannot be run stably by simply explaining them once in a prompt. Therefore, I consolidate them into SOPs, allowing new models or new agents to \u0026ldquo;get up to speed just by glancing at the manual.\u0026rdquo;\u003c/p\u003e\n\u003ch3 id=\"42-the-project-card-mechanism-a-recurring-need--a-long-term-maintained-project-card\"\u003e\n  4.2 The Project Card Mechanism: A Recurring Need = A Long-Term Maintained Project Card\n  \u003ca class=\"heading-link\" href=\"#42-the-project-card-mechanism-a-recurring-need--a-long-term-maintained-project-card\"\u003e\n    \u003ci class=\"fa-solid fa-link\" aria-hidden=\"true\" title=\"Link to heading\"\u003e\u003c/i\u003e\n    \u003cspan class=\"sr-only\"\u003eLink to heading\u003c/span\u003e\n  \u003c/a\u003e\n\u003c/h3\u003e\n\u003cp\u003eWhen it comes to Project Cards, I\u0026rsquo;ve condensed the design philosophy into a single sentence:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003eA recurring type of need = A long-term maintained Project Card\u003c/strong\u003e\nUsed to carry the \u0026ldquo;Background → Architecture → Usage → Iteration History\u0026rdquo; for this capability.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eIt\u0026rsquo;s not about solving \u0026ldquo;how to call a script,\u0026rdquo; but rather three higher-level questions:\n\u003cstrong\u003eWhy does this capability exist? What is the system topology? How will it be continuously iterated upon and handed over in the future?\u003c/strong\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003ch4 id=\"421-when-is-a-project-card-needed\"\u003e\n  4.2.1 When is a Project Card needed?\n  \u003ca class=\"heading-link\" href=\"#421-when-is-a-project-card-needed\"\u003e\n    \u003ci class=\"fa-solid fa-link\" aria-hidden=\"true\" title=\"Link to heading\"\u003e\u003c/i\u003e\n    \u003cspan class=\"sr-only\"\u003eLink to heading\u003c/span\u003e\n  \u003c/a\u003e\n\u003c/h4\u003e\n\u003cp\u003eIf any of the following conditions are met, there should be a \u003ccode\u003enotes/projects/\u0026lt;name\u0026gt;.md\u003c/code\u003e:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eThe task is \u003cstrong\u003elong-term and will be continuously iterated upon\u003c/strong\u003e (not a one-off script).\u003c/li\u003e\n\u003cli\u003eIt involves multiple scripts, cron jobs, or external services (e.g., IMAP + Outlook + LLM).\u003c/li\u003e\n\u003cli\u003eIt may be handed over to another agent in the future, or I might need to resume work on it after a break.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eTypical examples include:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eai-daily.md\u003c/code\u003e: The entire AI Daily pipeline.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eemail-summary.md\u003c/code\u003e: Yesterday\u0026rsquo;s email summary.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eopenclaw-runtime-review.md\u003c/code\u003e: The runtime modification project.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emiaokong-website.md\u003c/code\u003e: Personal site: content + build + preview + deployment.\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch4 id=\"422-what-should-a-project-card-contain\"\u003e\n  4.2.2 What should a Project Card contain?\n  \u003ca class=\"heading-link\" href=\"#422-what-should-a-project-card-contain\"\u003e\n    \u003ci class=\"fa-solid fa-link\" aria-hidden=\"true\" title=\"Link to heading\"\u003e\u003c/i\u003e\n    \u003cspan class=\"sr-only\"\u003eLink to heading\u003c/span\u003e\n  \u003c/a\u003e\n\u003c/h4\u003e\n\u003cp\u003eI try to keep the structure of Project Cards consistent (the phrasing can vary, but the skeleton remains the same), typically including these 5 sections:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eBackground \u0026amp; Goal\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eWhy this capability was created and the specific pain point it solves.\u003c/li\u003e\n\u003cli\u003ee.g., AI Daily: To reduce the time spent manually browsing newsletters / X, consolidating everything into a single email before 06:30 each day.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eArchitecture Topology\u003c/strong\u003e\nDescribe the data flow from a three-layer perspective:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eData Layer: RSS / Watchlist / Bird / IMAP, etc.\u003c/li\u003e\n\u003cli\u003eLogic Layer: Core scripts (e.g., \u003ccode\u003egen_ai_digest.py\u003c/code\u003e, \u003ccode\u003egen_email_summary.py\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003eTransport Layer: Delivery channels (e.g., \u003ccode\u003esend_ai_briefing.sh\u003c/code\u003e, Outlook API, etc.)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eDependencies \u0026amp; Environment\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eRequired environment variables / API keys.\u003c/li\u003e\n\u003cli\u003eDependencies on external CLIs or services (e.g., bird, outlook-cli, tvscreener).\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eUsage / Invocation\u003c/strong\u003e\nA \u0026ldquo;quick start\u0026rdquo; section for my future self:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eThe command to run it manually.\u003c/li\u003e\n\u003cli\u003eHow the scheduled task is configured (in which Cron / OpenClaw cron id).\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eIteration Log\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eRecord key changes on a timeline (V1.0 launch, V1.1 added sources, V2.0 architecture overhaul\u0026hellip;).\u003c/li\u003e\n\u003cli\u003eThe purpose is to make the \u0026ldquo;current state\u0026rdquo; and \u0026ldquo;how it got here\u0026rdquo; traceable.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003chr\u003e\n\u003ch4 id=\"423-the-role-of-project-cards-in-the-overall-system\"\u003e\n  4.2.3 The Role of Project Cards in the Overall System\n  \u003ca class=\"heading-link\" href=\"#423-the-role-of-project-cards-in-the-overall-system\"\u003e\n    \u003ci class=\"fa-solid fa-link\" aria-hidden=\"true\" title=\"Link to heading\"\u003e\u003c/i\u003e\n    \u003cspan class=\"sr-only\"\u003eLink to heading\u003c/span\u003e\n  \u003c/a\u003e\n\u003c/h4\u003e\n\u003cp\u003eIn the system, Project Cards serve three main purposes:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eBusiness Documentation \u0026ldquo;Above the Capability\u0026rdquo;\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003ecapabilities.yaml\u003c/code\u003e only tells the agent that a capability exists and what its entry-point script is.\u003c/li\u003e\n\u003cli\u003eThe actual business context, goals, boundaries, topology, and constraints are written in the Project Card.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eAn Anchor for Coding Collaboration\u003c/strong\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cul\u003e\n\u003cli\u003eWhen the main Agent initiates coder/scoder, it prioritizes pointing to the project card:\n“This requirement belongs to V1.2 of the AI Daily line”\u003c/li\u003e\n\u003cli\u003eThe coder modifies scripts based on the project card\u0026rsquo;s topology and constraints, rather than aimlessly searching the repository.\u003c/li\u003e\n\u003c/ul\u003e\n\u003col start=\"3\"\u003e\n\u003cli\u003e\u003cstrong\u003eLong-Term Memory / Handover Medium\u003c/strong\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003cul\u003e\n\u003cli\u003eWhen reviewing after a period, or switching Agents, simply reading the project card will reveal:\n\u003cul\u003e\n\u003cli\u003eThe current status of this business line\u003c/li\u003e\n\u003cli\u003eWhich scripts/cron jobs are the \u0026lsquo;official\u0026rsquo; ones, and which are merely historical remnants\u003c/li\u003e\n\u003cli\u003eHow to iterate next\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"5-application-scenarios-how-do-these-architectures-translate-into-practical-capabilities\"\u003e\n  5. Application Scenarios: How Do These Architectures Translate into Practical Capabilities?\n  \u003ca class=\"heading-link\" href=\"#5-application-scenarios-how-do-these-architectures-translate-into-practical-capabilities\"\u003e\n    \u003ci class=\"fa-solid fa-link\" aria-hidden=\"true\" title=\"Link to heading\"\u003e\u003c/i\u003e\n    \u003cspan class=\"sr-only\"\u003eLink to heading\u003c/span\u003e\n  \u003c/a\u003e\n\u003c/h2\u003e\n\u003ch3 id=\"51-email-distillation-and-dehydrated-briefings\"\u003e\n  5.1 Email Distillation and \u0026lsquo;Dehydrated\u0026rsquo; Briefings\n  \u003ca class=\"heading-link\" href=\"#51-email-distillation-and-dehydrated-briefings\"\u003e\n    \u003ci class=\"fa-solid fa-link\" aria-hidden=\"true\" title=\"Link to heading\"\u003e\u003c/i\u003e\n    \u003cspan class=\"sr-only\"\u003eLink to heading\u003c/span\u003e\n  \u003c/a\u003e\n\u003c/h3\u003e\n\u003cp\u003eCron triggers \u003ccode\u003egen_email_summary.py\u003c/code\u003e, IMAP fetches emails, LLM categorizes them as “Cost/Risk/Action/Notification”, outputting minimalist daily reports.\u003c/p\u003e\n\u003ch3 id=\"52-route-rendering-and-web-preview\"\u003e\n  5.2 Route Rendering and Web Preview\n  \u003ca class=\"heading-link\" href=\"#52-route-rendering-and-web-preview\"\u003e\n    \u003ci class=\"fa-solid fa-link\" aria-hidden=\"true\" title=\"Link to heading\"\u003e\u003c/i\u003e\n    \u003cspan class=\"sr-only\"\u003eLink to heading\u003c/span\u003e\n  \u003c/a\u003e\n\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003eroute_eta_amap.py\u003c/code\u003e pulls data → \u003ccode\u003eamap_render.py\u003c/code\u003e generates static HTML → Nginx exposes links, tap on mobile to compare routes.\u003c/p\u003e\n\u003ch3 id=\"53-automatic-notes-obsidian-sync\"\u003e\n  5.3 Automatic Notes (Obsidian Sync)\n  \u003ca class=\"heading-link\" href=\"#53-automatic-notes-obsidian-sync\"\u003e\n    \u003ci class=\"fa-solid fa-link\" aria-hidden=\"true\" title=\"Link to heading\"\u003e\u003c/i\u003e\n    \u003cspan class=\"sr-only\"\u003eLink to heading\u003c/span\u003e\n  \u003c/a\u003e\n\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003eob_note_sync.py\u003c/code\u003e integrates with WebDAV, organizing conversation highlights into Markdown and synchronizing them.\u003c/p\u003e\n\u003ch3 id=\"54-all-network-information-sentinel-bird--watchlist\"\u003e\n  5.4 All-Network Information Sentinel (Bird + Watchlist)\n  \u003ca class=\"heading-link\" href=\"#54-all-network-information-sentinel-bird--watchlist\"\u003e\n    \u003ci class=\"fa-solid fa-link\" aria-hidden=\"true\" title=\"Link to heading\"\u003e\u003c/i\u003e\n    \u003cspan class=\"sr-only\"\u003eLink to heading\u003c/span\u003e\n  \u003c/a\u003e\n\u003c/h3\u003e\n\u003cp\u003eBird CLI monitors X hotspots + Watchlist captures RSS, outputting AI Daily and hotspot aggregation.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"conclusion-stability-comes-from-architecture-not-prompts\"\u003e\n  Conclusion: Stability Comes from Architecture, Not Prompts\n  \u003ca class=\"heading-link\" href=\"#conclusion-stability-comes-from-architecture-not-prompts\"\u003e\n    \u003ci class=\"fa-solid fa-link\" aria-hidden=\"true\" title=\"Link to heading\"\u003e\u003c/i\u003e\n    \u003cspan class=\"sr-only\"\u003eLink to heading\u003c/span\u003e\n  \u003c/a\u003e\n\u003c/h2\u003e\n\u003cp\u003eWhen you \u003cstrong\u003edocument\u003c/strong\u003e business logic (\u003cstrong\u003eSOP\u003c/strong\u003e), \u003cstrong\u003easynchronize\u003c/strong\u003e tasks (\u003cstrong\u003eSub-agents\u003c/strong\u003e), and \u003cstrong\u003ephysicalize\u003c/strong\u003e states (\u003cstrong\u003eFiles \u0026amp; Configs\u003c/strong\u003e), AI is no longer an unstable black box, but a truly manageable, iterable cloud adjutant.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"appendix-current-system-capabilities-overview-runtime-capabilities\"\u003e\n  Appendix: Current System Capabilities Overview (Runtime Capabilities)\n  \u003ca class=\"heading-link\" href=\"#appendix-current-system-capabilities-overview-runtime-capabilities\"\u003e\n    \u003ci class=\"fa-solid fa-link\" aria-hidden=\"true\" title=\"Link to heading\"\u003e\u003c/i\u003e\n    \u003cspan class=\"sr-only\"\u003eLink to heading\u003c/span\u003e\n  \u003c/a\u003e\n\u003c/h2\u003e\n\u003ch3 id=\"1--high-frequency-automated-tasks\"\u003e\n  1) ⚡ High-Frequency Automated Tasks\n  \u003ca class=\"heading-link\" href=\"#1--high-frequency-automated-tasks\"\u003e\n    \u003ci class=\"fa-solid fa-link\" aria-hidden=\"true\" title=\"Link to heading\"\u003e\u003c/i\u003e\n    \u003cspan class=\"sr-only\"\u003eLink to heading\u003c/span\u003e\n  \u003c/a\u003e\n\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eai_daily\u003c/code\u003e: AI Daily (✅ Healthy)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eemail_summary\u003c/code\u003e: Yesterday\u0026rsquo;s Email Summary (✅ Healthy)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ecron_midday_evening_briefing\u003c/code\u003e: Mid/Evening Report Push (✅ Healthy)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"2--practical-toolkit\"\u003e\n  2) 🛠️ Practical Toolkit\n  \u003ca class=\"heading-link\" href=\"#2--practical-toolkit\"\u003e\n    \u003ci class=\"fa-solid fa-link\" aria-hidden=\"true\" title=\"Link to heading\"\u003e\u003c/i\u003e\n    \u003cspan class=\"sr-only\"\u003eLink to heading\u003c/span\u003e\n  \u003c/a\u003e\n\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003elocal_maps\u003c/code\u003e: Routes/POI/Weather (✅ Healthy)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003estocks\u003c/code\u003e: Market Trends + Technical Analysis (✅ Healthy)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003etwitter_bird\u003c/code\u003e: Hotspot Search (✅ Healthy)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"3--office-and-collaboration\"\u003e\n  3) 📅 Office and Collaboration\n  \u003ca class=\"heading-link\" href=\"#3--office-and-collaboration\"\u003e\n    \u003ci class=\"fa-solid fa-link\" aria-hidden=\"true\" title=\"Link to heading\"\u003e\u003c/i\u003e\n    \u003cspan class=\"sr-only\"\u003eLink to heading\u003c/span\u003e\n  \u003c/a\u003e\n\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eemail_check\u003c/code\u003e: Unread Email Summary\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eoutlook_calendar\u003c/code\u003e: Schedule Management (✅ Healthy)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eob_webdav\u003c/code\u003e: Note Synchronization (✅ Healthy)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"4--development-and-preview\"\u003e\n  4) 💻 Development and Preview\n  \u003ca class=\"heading-link\" href=\"#4--development-and-preview\"\u003e\n    \u003ci class=\"fa-solid fa-link\" aria-hidden=\"true\" title=\"Link to heading\"\u003e\u003c/i\u003e\n    \u003cspan class=\"sr-only\"\u003eLink to heading\u003c/span\u003e\n  \u003c/a\u003e\n\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003ecoding\u003c/code\u003e: Scheduling coder/scoder (EDTP Acceptance)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eweb_preview\u003c/code\u003e: Markdown Rendering to Web Links\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"5-underlying-implementation-index-technical-mapping\"\u003e\n  5) Underlying Implementation Index (Technical Mapping)\n  \u003ca class=\"heading-link\" href=\"#5-underlying-implementation-index-technical-mapping\"\u003e\n    \u003ci class=\"fa-solid fa-link\" aria-hidden=\"true\" title=\"Link to heading\"\u003e\u003c/i\u003e\n    \u003cspan class=\"sr-only\"\u003eLink to heading\u003c/span\u003e\n  \u003c/a\u003e\n\u003c/h3\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth style=\"text-align: left\"\u003eDomain\u003c/th\u003e\n          \u003cth style=\"text-align: left\"\u003eCore Capability\u003c/th\u003e\n          \u003cth style=\"text-align: left\"\u003ePhysical Implementation (Script/Tool)\u003c/th\u003e\n          \u003cth style=\"text-align: left\"\u003eCorresponding SOP\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd style=\"text-align: left\"\u003eLocal Maps\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003eRoute Planning, ETA, POI, Weather\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003e\u003ccode\u003eroute_eta_amap.py\u003c/code\u003e, \u003ccode\u003epoi_search.py\u003c/code\u003e\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003e\u003ccode\u003eroute-planning-SOP.md\u003c/code\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd style=\"text-align: left\"\u003eEmail Summary\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003eYesterday\u0026rsquo;s Summary Generation and Sending\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003e\u003ccode\u003egen_email_summary.py\u003c/code\u003e, \u003ccode\u003esend_email_summary.sh\u003c/code\u003e\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003e\u003ccode\u003eemail-summary.md\u003c/code\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd style=\"text-align: left\"\u003eAI Daily\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003eWatchlist + Twitter Daily\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003e\u003ccode\u003egen_ai_digest.py\u003c/code\u003e, \u003ccode\u003ebird\u003c/code\u003e CLI\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003e\u003ccode\u003eai-daily.md\u003c/code\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd style=\"text-align: left\"\u003eOutlook\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003eCalendar Management, Email Sending\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003e\u003ccode\u003eoutlook-calendar.sh\u003c/code\u003e, \u003ccode\u003eoutlook-mail.sh\u003c/code\u003e\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003e\u003ccode\u003eoutlook-SOP.md\u003c/code\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd style=\"text-align: left\"\u003eObsidian\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003eWebDAV Writing\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003e\u003ccode\u003eob_note_sync.py\u003c/code\u003e\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003e\u003ccode\u003emiaok-约定.md\u003c/code\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd style=\"text-align: left\"\u003eCoding\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003eAsynchronous Coding and Architecture Review\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003e\u003ccode\u003esessions_spawn\u003c/code\u003e\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003e\u003ccode\u003ecoding-SOP.md\u003c/code\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd style=\"text-align: left\"\u003eWeb Preview\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003eRendered Publishing Preview\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003e\u003ccode\u003eweb_preview_publish.py\u003c/code\u003e, Nginx\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003e\u003ccode\u003e基础设置-总览.md\u003c/code\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd style=\"text-align: left\"\u003eTwitter\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003eTrending Search \u0026amp; Aggregation\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003e\u003ccode\u003ebird\u003c/code\u003e CLI\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003e\u003ccode\u003etwitter-bird-SOP.md\u003c/code\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd style=\"text-align: left\"\u003eStocks\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003eMarket Conditions \u0026amp; Technical Analysis\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003e\u003ccode\u003eyf\u003c/code\u003e, \u003ccode\u003etvscreener\u003c/code\u003e\u003c/td\u003e\n          \u003ctd style=\"text-align: left\"\u003e\u003ccode\u003emiaok-炒股-SOP.md\u003c/code\u003e\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n","description":"Sharing how I leverage OpenClaw to build a personal automation system, including materialized state, Reset V2, Health Triad, and multi-Agent collaboration processes."}