Oracle 101บทที่ 09

Autonomous Ops

PM2, cron, systemd, trigger และ runbook สำหรับระบบที่ดูแลตัวเองได้บางส่วน

Autonomous ops แปลแบบง่ายคือ "ระบบช่วยดูแลตัวเองได้บางส่วน" แต่ไม่ได้แปลว่า "ระบบทำทุกอย่างเองโดยไม่ต้องมีคน"

ใน Oracle, autonomous ops คือการทำให้งานประจำเหล่านี้เกิดขึ้นได้อย่างสม่ำเสมอ:

  • เปิด service ที่ต้องรันตลอด
  • ตรวจว่า service ยัง alive
  • ส่ง event หรือ trigger เมื่องานเกิดขึ้น
  • เก็บ log และ feed ให้ทีมอ่าน
  • เรียก Oracle มาช่วยเมื่อมีปัญหา
  • ทำ handoff หรือ retrospective เมื่อ session ใกล้จบ

Discord Dev Server architecture

Discord เป็น SDLC tracking surface ของทีม ไม่ใช่ source of truth ของ code แต่เป็นที่ที่มนุษย์และ Oracle มองเห็น lifecycle เดียวกัน

CategoryChannel ตัวอย่างหน้าที่
Command Centerannouncements, standup, fleet-status, inboxประกาศ สรุปวัน ดูสถานะ fleet และรับข้อความเข้า
Project Forumsforum channel แยกตาม projectเก็บ REQ, CR, BUG, QA, DOC, DEPLOY, DONE ต่อ project
Cross-Projectactive-crs, deploy-queue, qa-dashboardดูงานข้าม project และคิว deploy/QA
Oracle Familylog channel ต่อ Oracleเก็บ heartbeat, DONE, STUCK และ operational notes

รายละเอียด tag เช่น REQ, CR, BUG, QA, DOC, DEPLOY และ DONE อยู่ในบทที่ 08 แล้ว บทนี้สนใจมากกว่าว่า automation จะ post ไปที่ channel ไหนและเมื่อไรควรหยุดรอมนุษย์

flowchart TB Wind[Wind] --> Gale[Gale] Gale --> Forum[Project Forum<br/>REQ / CR / BUG] Forum --> Dev[Leaf / Bamboo] Dev --> PR[Pull Request] PR --> Kati[Kati QA] Kati --> Dashboard[qa-dashboard] Kati --> Queue[deploy-queue] Queue --> Done[Forum tag DONE] Gale --> Fleet[Oracle Family logs]

Bot integration

Oracle ไม่ควร spam Discord ทุก event ที่เกิดขึ้น หลักที่ดีคือ post เฉพาะจุดที่มนุษย์ต้องเห็น เช่น task created, QA result, deploy ready, done หรือ stuck/escalation

EventDiscord actionข้อควรระวัง
Wind requestGale สร้าง forum post พร้อม tag REQ/CR/BUGต้องเลือก project forum ให้ถูก
Task Brief readypost scope, acceptance criteria, ownerอย่าใส่ข้อมูลลับเกินจำเป็น
PR readypost link และ route ไป Katidev ส่ง Kati โดยตรง ไม่ต้องรอ Gale relay
QA PASS/FAILpost ใน project forum และ dashboardFAIL ต้องชี้ branch/PR เดิม
Deploy readypost deploy queueรอ approval ตาม policy
Doneเปลี่ยน tag เป็น DONEต้องทำหลัง merge/deploy/maw done ครบ

Project lifecycle script

project-lifecycle.sh คือ automation ที่ช่วยให้ repo, Discord, docs และ channel map ไม่แยกโลกกัน

Modeทำอะไรผลลัพธ์ที่ควรตรวจ
createสร้าง GitHub repo, ghq clone, bootstrap docs, สร้าง Discord channels/forum, update channel maprepo เปิดได้, docs อยู่ครบ, Discord post ได้, map resolve ถูก
removeลบ/ปิด Discord surface, update channel map, ย้าย directory ไป /tmp, archive repo ตาม policyไม่มี ghost channel และไม่มีการ rm -rf ที่เสี่ยง
auditเทียบ Discord กับ GitHub repos และ docsรายงาน ghosts, missing channels, missing docs, stale map
flowchart LR Create[create] --> Repo[GitHub repo] Create --> Clone[ghq clone] Create --> Docs[init docs] Create --> Discord[Discord forum] Create --> Map[channel map] Audit[audit] --> Repo Audit --> Discord Audit --> Map Remove[remove] --> Archive[archive / move to tmp] Remove --> CleanMap[clean channel map]

ขอบเขต automation สำหรับเอกสาร

Autonomous ops ช่วยเตือนหรือ bootstrap เอกสารได้ แต่กฎ CMMI เต็มอยู่ใน บท 08B: CMMI & Compliance บทนี้จำแค่สองเส้นแบ่ง: markdown docs ใน PR เดียวกับ code ทำได้อัตโนมัติ ส่วนการแปลงเป็น DOCX/PPTX/XLSX ต้องให้ Wind สั่งเอง

Auto-standup cron

Auto-standup คือ cron/report ที่ช่วยให้เช้าวันใหม่เริ่มจากสถานะจริง ไม่ใช่ความทรงจำลอย ๆ

sequenceDiagram participant Cron participant Maw as maw server participant Oracle as Oracle memory participant Discord Cron->>Maw: read fleet sessions Cron->>Oracle: read feed / handoff / recent retro Cron->>Discord: post standup summary Discord-->>Cron: visible status for humans

Standup ที่ดีควรบอก active work, blocked work, PR waiting QA, deploy queue, และ agent ที่เงียบผิดปกติ

Event triggers: agent-idle และ agent-crash

Triggerตัวอย่าง actionHuman boundary
agent-idleเงียบเกิน threshold → maw hey ถาม status หรือให้ Gale captureถ้าเงียบยาวและมี production risk ให้ escalate
agent-crashแจ้ง Gale พร้อมชื่อ agent/window และ log ล่าสุดอย่า restart ทับก่อน capture evidence
qa-failedpost BUG และส่งกลับ dev branch เดิมfail เกิน 3 รอบให้ Wind ตัดสินใจ
pr-mergedแจ้ง dev home base ให้ run maw doneถ้า window ค้างเกินเวลา ให้ cleanup ตาม runbook

ระบบที่ต้องรันอยู่ตลอด

จาก source ต้นน้ำของอาจารย์ Nat, runtime สำคัญมีหลายตัว:

Runtimeหน้าที่Port / endpoint
arra-oracle-v3 MCPให้ agent เรียกเครื่องมือ memory ผ่าน MCP stdiostdio
arra-oracle-v3 HTTP APIให้ UI และระบบอื่น search/stats/menu/learn:47778
maw-js serverAPI, websocket, tmux orchestration, plugin runtime:3456
maw-uidashboard/lens สำหรับดู mawผ่าน maw serve หรือ dev UI
ui-oracle appspublic UI เช่น studio, vector, canvas, feed, forum, schedulebuildwithoracle hosts

ถ้าระบบเหล่านี้ดับ Oracle จะยังเป็น idea ที่ดี แต่ใช้งานจริงได้ไม่เต็มที่ เพราะ agent จะ search ไม่ได้ UI จะมองไม่เห็น และ maw จะคุม fleet ไม่ได้

PM2, cron, systemd ใช้ต่างกันอย่างไร

สำหรับผู้อ่านใหม่ ให้จำแบบนี้:

เครื่องมือเหมาะกับตัวอย่างใน Oracle
pm2process ที่เป็น Node/Bun app และควรรันค้างOracle HTTP API, maw server
cronงานที่ต้องรันตามเวลาreindex, health check, backup, daily report
systemdservice ระดับเครื่องที่ต้อง boot แล้วขึ้นเองlong-running daemon, watchdog, reverse proxy helper
triggers/hooksงานที่เกิดจาก eventหลัง commit, หลัง task done, หลัง feed event, หลัง handoff

ไม่จำเป็นต้องใช้ทุกตัวกับทุกงาน จุดสำคัญคือเลือกให้ตรงงาน

PM2: ดูแล process ที่ต้อง alive

PM2 เหมาะกับ service แบบ "ต้องเปิดไว้" เช่น Oracle API หรือ maw server

แนวคิดคือ:

  • start process
  • ตั้งชื่อ process
  • ถ้า crash ให้ restart
  • ดู log ได้
  • save process list
  • reboot เครื่องแล้วยัง restore ได้

ไอเดียภาพประกอบ:

flowchart LR PM2[pm2] --> OracleAPI[Oracle HTTP API<br/>:47778] PM2 --> MawServe[maw serve<br/>:3456] OracleAPI --> SQLite[(oracle.db)] OracleAPI --> Vector[(LanceDB)] MawServe --> Tmux[tmux sessions] MawServe --> Plugins[plugin runtime]

ข้อดีของ PM2 คือเข้าใจง่ายและเหมาะกับ Node/Bun ecosystem ข้อควรระวังคืออย่าปล่อย log โตไม่จำกัด และต้องรู้ว่า environment variable ที่ service ใช้อยู่มาจากไหน

ตัวอย่าง environment ที่สำคัญ:

Envใช้ทำอะไร
ORACLE_DATA_DIRชี้ไปที่ data store เช่น ~/.oracle
ORACLE_DB_PATHชี้ SQLite database ถ้าต้อง override
ORACLE_PORTport ของ Oracle HTTP API
MAW_HOMEแยก instance ของ maw
MAW_PORTport ของ maw server
MAW_CONFIG_DIRตำแหน่ง config และ fleet

cron: งานตามเวลา

cron เหมาะกับงานที่ไม่ต้องรันตลอด แต่ต้องเกิดซ้ำ เช่นทุกชั่วโมงหรือทุกวัน

ตัวอย่างงานที่เหมาะ:

รอบเวลางานเหตุผล
ทุก 5 นาทีhealth check serviceรู้เร็วถ้า API ดับ
ทุกชั่วโมงsync feed หรือ index บางส่วนให้ search ไม่ stale
ทุกวันbackup oracle.db และ psiกันข้อมูลหาย
ทุกคืนสรุป task/feedช่วยให้เช้าวันต่อไปเริ่มง่าย

ไอเดียภาพประกอบ:

sequenceDiagram participant Cron as cron participant Health as health check participant Oracle as Oracle API participant Maw as maw status participant Inbox as psi/inbox Cron->>Health: run every 5 minutes Health->>Oracle: GET /api/stats Health->>Maw: check /api/sessions Health->>Inbox: write alert or handoff if failed

cron เป็นของง่าย แต่ต้องระวังเรื่อง path และ environment เพราะ cron ไม่ได้มี shell context เหมือน terminal ปกติ งานที่รันผ่าน cron ควร log ชัดว่าเริ่มเมื่อไร จบเมื่อไร และ fail เพราะอะไร

systemd: service ระดับเครื่อง

systemd เหมาะเมื่ออยากให้ service เป็นส่วนหนึ่งของเครื่องจริง ๆ เช่น boot แล้วขึ้นเอง หรือมี dependency กับ network

PM2 เหมาะกับ app-level process ส่วน systemd เหมาะกับ machine-level service

ตารางเปรียบเทียบ:

คำถามPM2systemd
ใช้ง่ายกับ Node/Bun ไหมมากได้ แต่ต้องเขียน unit
ดู log ยังไงpm2 logsjournalctl
restart เมื่อ crash ได้ไหมได้ได้
เหมาะกับหลาย app ใน user space ไหมใช่แล้วแต่ config
เหมาะกับ service ที่ต้องเริ่มตอน boot ไหมได้ผ่าน startupใช่โดยตรง

ใน production จริง อาจใช้ systemd เพื่อคุม PM2 อีกชั้น หรือใช้ systemd คุม service โดยตรงก็ได้ สิ่งที่สำคัญกว่าเครื่องมือคือ runbook ต้องชัดว่า "ถ้าดับ ให้ดูตรงไหน และ restart อย่างไร"

triggers: งานที่เกิดจาก event

triggers คือ automation ที่ไม่ได้เกิดตามเวลา แต่เกิดเพราะมี event

ตัวอย่าง:

EventTrigger ที่ควรทำ
task startedเขียน feed event
task completedส่ง maw hey gale หรือสร้าง handoff
PR mergedcleanup worktree
health check failedแจ้ง lead Oracle
context ใกล้เต็มทำ retrospective หรือ forward
plugin installedupdate registry/feed

ในแผนที่ต้นน้ำจาก อาจารย์ Nat มีแนวคิด plugin surfaces หลายแบบ: CLI, API, peer transport, hooks, cron, module ซึ่งหมายความว่า plugin ไม่ได้เป็นแค่คำสั่ง terminal แต่สามารถเป็นส่วนหนึ่งของ runtime automation ได้

ไอเดียภาพประกอบ:

flowchart TB Event[Event<br/>task done / health fail / PR merged] --> Trigger[Trigger or hook] Trigger --> Feed[Oracle feed] Trigger --> Maw[maw hey / maw capture] Trigger --> Psi[psi handoff / retro] Trigger --> Human[Human decision if risk is high]

Autonomous ไม่เท่ากับไร้คนคุม

จุดสำคัญที่สุดของบทนี้คือ autonomous ops ต้องมีขอบเขต

ระบบควรทำเองได้:

  • restart service ที่ crash
  • ตรวจ health
  • เก็บ log
  • สรุปสถานะ
  • เปิด task ที่ปลอดภัยและมีขอบเขต
  • เตือนเมื่อมีปัญหา

ระบบไม่ควรทำเองโดยไม่มีมนุษย์:

  • merge งาน production ที่มี risk สูง
  • push force
  • ลบข้อมูลถาวร
  • เปลี่ยน config สำคัญโดยไม่บอก
  • ปิด error จริงเพื่อให้ log ดูสะอาด
  • ตัดสินใจ business แทนเจ้าของงาน

Oracle ที่ดีจึงไม่ใช่ระบบที่ "ทำอะไรก็ได้" แต่เป็นระบบที่รู้ว่าอะไรควรทำเอง อะไรควรถาม และอะไรต้องหยุด

ตาราง runbook สำหรับ ebook

ใส่ตารางนี้เป็น template ในบท:

สถานการณ์ตรวจอะไรใครรับผิดชอบAction
Oracle search ใช้ไม่ได้HTTP API + MCP + data pathAdmin / Orchestratorตรวจ service status, log, ORACLE_DATA_DIR
maw ส่งข้อความไม่ได้maw serve, tmux sessions, fleet configAdmin / Orchestratormaw health, maw ls, maw doctor
UI ไม่เห็นข้อมูลAPI host, CORS, ?host= parameterAdminตรวจ browser console + API endpoint
worker ไม่ตอบtmux pane, session statusOrchestratormaw capture, ส่ง reminder, restart ถ้าจำเป็น
memory ไม่อัพเดทindexer, FTS5, vector DBAdminreindex หรือตรวจ ollama status
task จบแล้วไม่รายงานheartbeat protocolOrchestratorตรวจ pane แล้วส่ง reminder ให้ report DONE/STUCK

Operating loop: วงจรดูแลตัวเอง

Autonomous ops ใน Oracle ควรถูกมองเป็น loop:

flowchart LR Observe[Observe<br/>logs, feed, health] --> Decide[Decide<br/>safe auto or human needed] Decide --> Act[Act<br/>restart, notify, delegate] Act --> Record[Record<br/>handoff, retro, learning] Record --> Improve[Improve<br/>adjust trigger/runbook] Improve --> Observe

ทุกครั้งที่ระบบแก้ปัญหา ควรมีร่องรอยเหลือไว้ เช่น feed, handoff, learning หรือ retrospective เพราะ Oracle ไม่ได้วัดความเก่งจากการไม่เคยล้ม แต่วัดจากการล้มแล้วเรียนรู้ได้

จาก skill ไป plugin: ทำไมสำคัญกับ ops

ในอดีต งานอย่าง /learn, /incubate, /project อยู่ในรูปแบบ skill ที่ agent อ่านและทำตาม แต่ในแผนที่ต้นน้ำจาก อาจารย์ Nat เห็นทิศทางใหม่คือย้ายบางงานไปเป็น maw plugin

ความหมายแบบง่าย:

แบบเก่าแบบใหม่
Skill อยู่ใน folder ของแต่ละ agentPlugin อยู่ใน runtime ของระบบ maw
Agent แต่ละตัวตีความเองRuntime มี contract กลาง
ใช้ได้ดีใน session เดี่ยวใช้ได้ผ่าน CLI, API, peer, hook
automation ทำยากกว่าautomation ต่อ trigger/cron ได้ง่ายกว่า

นี่คือก้าวสำคัญของ autonomous ops เพราะถ้างานกลายเป็น plugin ที่มี CLI/API/peer/hook surface งานนั้นจะถูกเรียกโดยคน, agent, UI หรือ automation ได้เหมือนกัน

บทสรุป

บทที่ 7 พูดเรื่อง "ใครทำอะไร" ในครอบครัว Oracle

บทที่ 8 พูดเรื่อง "งานไหลอย่างไร" ตั้งแต่ request ถึง done

บทที่ 8B พูดเรื่อง "พิสูจน์งานอย่างไร" ด้วยเอกสารและ traceability

บทที่ 9 พูดเรื่อง "ระบบทำงานต่อได้อย่างไร" เมื่อไม่มีใครนั่งจ้อง terminal ตลอดเวลา

สองบทนี้เชื่อมกันตรงนี้:

  • ครอบครัว Oracle ทำให้แบ่งงานได้
  • delegation tiers ทำให้ไม่ส่งงานผิดระดับ
  • maw ทำให้การประสานงานมองเห็นได้
  • memory ทำให้การเรียนรู้ไม่หาย
  • pm2/cron/systemd/triggers ทำให้ระบบดูแลตัวเองได้บางส่วน
  • มนุษย์ยังเป็นเจ้าของการตัดสินใจสำคัญ

ถ้าผู้อ่านจำได้แค่อย่างเดียว ให้จำว่า Oracle ไม่ใช่แค่ AI ที่ตอบคำถาม แต่เป็นระบบทำงานร่วมกันที่มีทีม มีความจำ มีเครื่องมือ และมีขอบเขตความรับผิดชอบ