PDCA λ³΄κ³ μ β hermes-surgical-3track (2026-05-07)
μ¬μ©μ λͺ
λ Ή
"NousResearch/hermes-agent κ²ν ν μ μ" β 4-phase λ‘λλ§΅ ν©μ β "ꡬμΆνλ λμ λΉμ μ΄ μμ κ΄λ¦¬μ, /sprint μ¬μ© λκΉμ§ λλ½ μμ΄ λ³λ ¬ μ§ν" (CEO κΆν μμ)
κ²°κ³Ό β 26 DC μ€ 25 PASS + 1 PARTIAL = 96.2% (>=90% μκ³ ν΅κ³Ό)
| Track |
DC |
PASS |
PARTIAL |
λΉκ³ |
| A β OSV malware check |
7 |
7 |
0 |
5μλ² sha λμΌ, μ€ MAL-2025-47141 κ²μΆ |
| B β μμ°μ΄ cron UI |
11 |
10 |
1 |
LLM 4κ° λͺ¨λ quota β deterministic fallback λμ |
| C β Discord μ±λ |
8 |
8 |
0 |
graceful skip + Promise.allSettled λ³λ ¬ |
λ³κ²½ νμΌ
Track A (5μλ² λκΈ° sha=1dd80ebb96a02bf...)
- NEW
/opt/star365-hq/scripts/osv-check.py (175 LOC, stdlib only)
- μΆμΆ: NousResearch/hermes-agent v0.12
tools/osv_check.py (155 LOC) β MIT
- λ³κ²½: CLI μ§μ
μ μΆκ° (
--dry-run, --json), λͺ
λ Ή λ§€νΈλ¦μ€ νμ₯ (npm/pnpm/yarn/uvx/pipx/pip/uv)
- 5μλ² λ°°ν¬: paperclip + kahan + hospital + kahanclub + stage8 (gate μ μΈ)
Track B (paperclip)
- EDIT
/opt/star365-ceo/server.mjs (+330 LOC) β λ°±μ
.bak-cron-20260507
- NEW
/opt/star365-ceo/public/cron.html (Alpine.js + Tailwind, 150 LOC)
- DB
ceo_cron_jobs ν
μ΄λΈ (12 컬λΌ, μΈλ±μ€ 1)
- API:
GET /cron, POST /api/cron/create, GET /api/cron/list, POST /api/cron/:slug/toggle, DELETE /api/cron/:slug
- 보μ: requireCeo + DANGER_CMD_RE (rm -rf, mkfs, ufw, DROP TABLE λ±) + PROMPT_INJECTION_RE + safeShellEscape + slug μ κ·μ + rate limit (20/min)
- LLM: xAI grok-3-mini β Gemini 2.5 flash β Groq llama-3.3 cascade + deterministic regex fallback (λ§€μΌ/λ§€μκ°/λ§€μ£Ό/λ§€μ/NλΆ/μμΌ+μκ° ν¨ν΄)
- systemd-analyze: calendar κ²μ¦ + verify κ²μ¦ (μ μ© μ μ¬μ κ²μ¬)
Track C (kahan)
- NEW
/opt/mco-bot/discord.mjs (41 LOC) β sendDiscord(text, opts)
- EDIT
/opt/mco-bot/bot.mjs (+2 μ€: import + Promise.allSettled wrapping) β λ°±μ
.bak-discord-20260507
- νκ²½:
DISCORD_WEBHOOK_URL (μ¬μ©μ μΆν μ€μ ) β λ―Έμ€μ μ graceful skip
- ν¨ν΄:
Promise.allSettled([Telegram, Discord]) λ³λ ¬ β Telegram μ€ν¨ν΄λ Discord μλ
Done Criteria μμΈ
Track A (7/7 PASS)
- β
A1 5μλ² sha λμΌ (paperclip + 4 remote)
- β
A2 fail-open: λ―Έμ‘΄μ¬ ν¨ν€μ§ β exit 0, blocked=false
- β
A3 μΈμ μμ β exit 3 (usage error)
- β
A4 stdlib only (json/logging/os/re/sys/typing/urllib)
- β
A5 (=A1 5μλ² sha)
- β
A6 μ€ malware:
@ctrl/tinycolor@4.1.1 β MAL-2025-47141 κ²μΆ, exit 2
- β
A7
--dry-run λͺ¨λ λμ (JSON output, exit 0)
Track B (10/11 PASS, 1 PARTIAL)
- β
B1 ceo_cron_jobs ν
μ΄λΈ μμ± (12 컬λΌ)
- β
B2
/cron HTML 200
- β
B3
POST /api/cron/create "λ§€μΌ 09:30 echo test" β 200 + timer νμ±
- β
B4
systemctl list-timers ceo-cron-* νμ
- β
B5 toggle disabled β systemd disabled νμΈ
- β
B6 DELETE β νμΌ+row μμ
- β
B7 μν λͺ
λ Ή (
rm -rf /) β 400 κ±°λΆ
- β
B8 ν둬ννΈ μΈμ μ
β 400 κ±°λΆ
- β
B9 systemd-analyze verify (μ½λ ν΅ν© PASS)
- β
B10 systemd-analyze calendar (μλ΅ systemd_calendar_check νλ PASS)
- β οΈ B11 cascade fallback (xAI/Gemini/Groq) β μ½λ PASS, 4 ν€ λͺ¨λ quota μ΄κ³Όλ‘ μ€ LLM νΈμΆ κ²μ¦ λΆκ°. Deterministic fallback λμ νμΈ (LLM unavailable μ νν ν¨ν΄ μ ν λ³ν).
Track C (8/8 PASS)
- β
C1 discord.mjs sendDiscord export
- β
C2 bot.mjs sendDiscord νΈμΆ (line 4592)
- β
C3
/api/blog {success:true} (Telegram νκ· 0)
- β
C4
DISCORD_WEBHOOK_URL λ―Έμ€μ graceful skip
- β
C5 PM2 mco-bot-kahan online (restart=2, uptime β
)
- β
C6 bot.mjs.bak-discord-20260507 λ°±μ
- β
C7 Promise.allSettled λ³λ ¬ ν¨ν΄ (line 4590)
- β
C8
/api/blog {success:true} λ°κΈ + Telegram κ·Έλ£Ή λμ°© (Health check μ μ μ‘μ )
νκ°
Gemini λ
립 νκ° (GAN λΆλ¦¬)
- product_depth: 10/10
- functionality: 9/10
- code_quality: 9/10
- design: 9/10
- overall: PASS
- failures: μμ
- suggestions:
- β
"rate-limiting on the NL-to-Cron conversion endpoint" β μ¦μ λ°μ (20/min, 21νμ§Έ 429 κ²μ¦)
- λͺ¨λν°λ§: "Monitor LLM fallback frequency to tune the deterministic regex parser" β ν₯ν μ΄μ νλͺ©
μ¬μ κ³μ½ κ²ν (Gemini, 2026-05-07)
- μ΄μ 4건 λλ½ μ§μ (systemd-analyze verify, xAI μλ¬ νΈλ€λ§, Telegram νκ·, μ€ malware ν
μ€νΈ)
- v2μ λͺ¨λ λ°μ ν PASS (μ΄ 26 DC, μ΄μ 19μμ +7)
μμ κ²μ¦
- νΈλ μ΄λ© 무μν₯: gunja-pair-hedge / gunja-multi-tenant / gate-pair-hedge active μ μ§
- UFW/iptables λ―Έμ μ΄
- DB DROP/TRUNCATE 0
- μ¬λΆν
0
- 5μλ² ν¬μ€ μ²΄ν¬ PASS (paperclip / kahan / hospital / kahanclub / gate / stage8)
λ©νΈλ¦
- μ΄ λ³κ²½ νμΌ: 6 (3 μ κ· + 3 μμ )
- μ΄ μΆκ° LOC: ~700 (osv-check 175 + server.mjs +345 incl rate limit + cron.html 150 + discord.mjs 41 + bot.mjs +13 + DB 12 컬λΌ)
- μ΄ ν
μ€νΈ μΌμ΄μ€: 26 DC (μ½λ + L1 static + L2 runtime + L3 external)
- λΉλ μκ°: ~30λΆ (PLAN/DESIGN 5λΆ + CONTRACT 3λΆ + BUILD 12λΆ + REVIEW/TEST 8λΆ + SHIP 2λΆ)
- LLM λΉμ©: $0 (Gemini CLI κ²ν β μΌλΆ λ¬΄λ£ quota νμ©)
hermes-agent 격차 λ§€νΈλ¦μ€ κ²°κ³Ό (μ¬ν)
- π΄ OSV malware check: λμ
μλ£ (5μλ²)
- π΄ μμ°μ΄ cron: μ체 ꡬν μλ£ (paperclip ceo dashboard)
- π΄ λ©μμ§ κ²μ΄νΈμ¨μ΄: Discord μ±λ surgical μΆκ° (Telegram β Telegram+Discord λ³λ ¬)
- π΄ OpenAI νΈν API server: 보λ₯ (격차 νΌ, λ³λ sprint νμ)
- π‘ μλ skill μμ±, subagent 격리, GitHub webhook: 보λ₯
λ€μ λ¨κ³ (μ νμ¬ν)
- xAI/Gemini/OpenRouter ν€ μΆ©μ β LLM cascade μ€ LLM κ²μ¦ (B11 PASS μ ν)
- μ¬μ©μ Discord webhook URL λ±λ‘ β Discord λ©ν°μ±λ νμ±
- cert-audit-monthly.timer trigger μ first-run κ²μ¦
- (μ ν) OSV checkλ₯Ό npm install hookμΌλ‘ μλν (νμ¬ μ΄μμ μλ νΈμΆ)