๐ ํญ๋ชฉ๋ณ ์ธ๋ถ ์์
1. ์ถ๋ฐ์ โ ์นด๋์์ธ ๋ชจ๋ํฐ๋ง์ ํ๊ณ [๋ฐฐ๊ฒฝ]
์ฆ์: โ ์์ ์ค ์ค๋ฅ๋ฅผ ๋ชป ์ก๋ ๊ฒฝ์ฐ โก ์ ์ฝ์ผ๋ก ๋ฉ์ถฐ๋ ์ ํํ ๋ด์ฉ ๋ถ์กฑ โข ๋ฌธ์ ๋ฅผ ๋ฐ๋ก ์ฐ ์ ๋ชป ์บ์น โ ์ฑํฐ ๋ฐ๋ณต ํ ์คํธ โฃ ์ง์ ์ง์(์ฑํฐ ๋ฐ์คํฌํฑ/์ฝ๋ VSCode) ์์ค์ ๋ชป ๋ฏธ์นจ. ๋ชฉํ: ์ค๋ฅ ์์ + ์์ ์์ค์ ์ฝ๋ VSCode ์์ค์ผ๋ก.
2. ์ง๋จ โ ๋น์คํธ๋ฆฌ๋ฐ ์คํ์ด ๊ณตํต ๋พ๋ฆฌ [ํฉ์]
- ํ ์นด๋์์ธ๋ Bridge ์ค์๊ฐ์ด ์๋๋ผ DB(activity_logs+์ปด๋ผ) ์ฌ๊ตฌ์ฑ๋ณธ.
- ์ฑํฐ:
query()๋ฃจํ๊ฐ ์ต์ข ํ ์คํธ + ๋๊ตฌ ์ด๋ฆ๋ง ์์ง. ๋๊ตฌ ์ ๋ ฅ/๊ฒฐ๊ณผ/์ค๋ฅยท์คํ์์ยทraw stderr(๊ฐ์๋ง ๋ฐํ) ํ๊ธฐ. - ์ฝ๋:
--output-format jsonโ ์ต์ข result ๊ฐ์ฒด๋ง. ์ค๊ฐ ๋๊ตฌํธ์ถยทํ์ผ์์ ยทbash์ถ๋ ฅยทํ ์คํธยทreasoning ๋ฏธ๋ฐฉ์ถ. - โ ๋ ๋ค "์ต์ข ์์ฝ๋ง ๋จ๊ณ ์ค๊ฐ ์์ค" = ๋ฉ์ถค ์์ธ ๋ถ๋ช + ๋ฐ๋ณต ํ ์คํธ์ ๊ณตํต ๋พ๋ฆฌ.
3. ์ ์ โ ์ฝ๋๋ ์ด๋ฏธ real Claude CLI [ํ์ ์ฌ์ค]
codi_runner_cli.py(Phase 78+)๊ฐ ์ค์ Claude Code CLI subprocess ์คํ:claude -p --output-format json --max-turns 100 --permission-mode acceptEdits(stdin prompt, timeout 900s)- ํ์ผ/bash/git ํ ๋๊ตฌ ๋ณด์ , turn ์ํ 100(๋ฐํ์ 1~200). ๋ณ๋ชฉ์ ์ถ๋ ฅ ๋ชจ๋(json).
- ์ฑํฐ๋ ๋ณ๊ฐ:
claude_client.chat()โ SDKquery(), cmdboard MCP ๋๊ตฌ๋ง,max_turns=8.
4. ๋ ๋ฒ ์ฐ์ ์์ [ํฉ์]
1) stream-json ์บํฌ(์ฒ์ถ) 2) ์ธ์ ์ฌ๊ฐ/ํต๋์คํ 3) ์ง๋จ์ adminโ์นด๋์์ธ ์ด์ . - ์บํฌ๋ ํ ํฐ ์ค์ธก์ ์ ์ ์กฐ๊ฑด์ด๊ธฐ๋ ํจ.
5. ์ด์ด๊ฐ๊ธฐ ๋ ์ข
๋ฅ [ํฉ์]
- resume(๊ฐ์ ์ธ์ ): ์ง์ ๋งฅ๋ฝ ๊ทธ๋๋ก. ์ค๊ฐ ๊ต์ /์ปจํ ์คํธ ์ฌ์ ์.
- ์ ์ธ์ +ํต๋์คํ: ๋๊ท๋ชจ ์์ ์ผ๋ก ์ปจํ ์คํธ ํฌํ ์ ์์ถ ์์ฝ์ผ๋ก ์ ์ธ์ ์๋.
- ๊ธด์ฅ: ํฌํ๋ผ์ ์ ์ธ์ ๊ฐ๋ ๊ฒ โ "๊ทธ๋๋ก"๋ ๋ถ๊ฐ, "์ด์ด๊ฐ ๋งํผ" ์ํ ๋ณด์กด์ด ๋ชฉํ.
- ์ฑํฐยท์ฝ๋ยท์ฌ๋ผ ๋ชจ๋ ๋งค ์์ ์ ์ธ์ ํ์ ๊ฐ๋ฅ โ ์ด์ ์์ ์ ๋ฌ ์๋จ ํ์.
6. ํต๋์คํ ์๋จ โ continuation brief [ํฉ์]
- ๋ชจ๋ธ ์ปจํ ์คํธ๊ฐ ์๋๋ผ ์นด๋์ ์์ํ (=์ธ๋ถ ๋๋ ๋ณธ๋ ๋ชฉ์ ).
- ์ฝ๋: git์ด ground truth โ brief๋ ์๋ด, ์ ์ธ์ ์ repo๋ก ๊ฒ์ฆ.
- ์ฑํฐ:
chati_work_summary(์ค๊ณ๋จ, ๋ฏธ์ถฉ์ ) ์ต์ปค. - ์์น: repo/์นด๋=์ง์ค, brief=์๋ด + "๊ฒ์ฆํ๋ผ" ์ง์ โ ์๊ธฐ๊ต์ .
- ๋ถ์ํจ๊ณผ: brief์ "์คํจํ ์๋" ํ๋๊ฐ ๋ฐ๋ณต ์ฝ์ง ๋ฐฉ์ง.
7. CONTINUATION_STATE ์ต์ ์คํ [๋
ผ์์ค]
- ์ฝ๋ 6ํ๋:
goal/done(commitยทํ์ผ ํฌ์ธํฐ) /repo_state(branchยทheadยทdirtyยทin-flight) /remaining/failed_attempts(ํต์ฌ) /gotchas. - ์ฑํฐ ๋ณํ: repo_state โ decisions + open_questions(task_questions ๋งํฌ), failed_attempts โ rejected_options.
- ์์ฑ ์ฃผ์ฒด: A ์์ด์ ํธ ์์ฒด ์ถ๋ ฅ / B ์บํฌ๋ณธ ์์ฝ / C ํ์ด๋ธ๋ฆฌ๋(์ถ์ฒ).
- ๋ฏธ๊ฒฐ: ํ๋์งํฉยทํ๋ ํ์ .
8. ํ ํฐ ์ํฅ ๋ชจ๋ธ [ํฉ์ ยท ์ค์ธก ๋๊ธฐ]
- stream-json ์บํฌ: ๊ณผ๊ธ โ์ค๋ฆฝ(๋ชจ๋ธ ์์
๋์ผ, ์ถ๋ ฅํ์๋ง). +
result.usage๋ก ์ค์ธก ํ๋ณด(ํ ํ ํฐ์นฉ mock/0k). - resume: โ(ํ์คํ ๋ฆฌ ๋์ ์ฌ์ ์ก, prompt cache๋ก ์ํ, ์บ์ ์์ผ๋ฉด โ).
- ์ ์ธ์ +์์ถ ํต๋์คํ: resume ๋๋น โ.
- ์ง๋จ ๊ฐ์ โ ๋ธ๋ผ์ธ๋ ์ฌํ ์คํธ โ (์ค์ง ์ต๋ ์ ๊ฐ ๊ฐ๋ฅ).
- ์ ํ ์์น: ์บํฌ ์ ์ฉ ํ ์ค์ธก 1~2 run์ผ๋ก ์ฐ์ ์ฐ์ถ.
9. ๋ฉํฐ์์ด์ ํธ ์ญํ ๋ถ๋ฆฌ [ํฉ์]
- worker(์ฑํฐ1): ์คํ + ์ด๋ฒคํธ ์คํธ๋ฆผ.
- monitor(์ฝ๋, LLM ์๋): ์ํ ์ถ์ ยท์๋ฌ ๋ถ๋ฅยทํธ๋ฆฌ๊ฑฐ. ํ ํฐ 0.
- supervisor(์ฌ๋ผ/์ฑํฐ2): ์ด๋ฒคํธ ๊ตฌ๋(์ฒดํฌํฌ์ธํธ/์๋ฃ/์์ฒญ/ํธ๋ฆฌ๊ฑฐ)๋ก ๋ณด๊ณ ยท์๋ดยท๊ฐ์ ํ๋จ.
- "์ฌ๋ผ๊ฐ ์์ง ๊ทธ ์์ค ๋ชป ๋จ"์ ์์ธ = ๊ฐ๋ ํ ๋ฐ์ดํฐ(transcript)๊ฐ ๋ฒ๋ ค์ ธ์. ์บํฌ๊ฐ ํด์.
10. supervisor ๊ถํ ๋ฑ๊ธ [๊ฒฐ์ : C]
- A ๋ณด๊ณ ยท์๋ด๋ง / B +๋ฆฌ๋ทฐ์ดยทํฌ๋ฆฌํฑ / C +๋ฅ๋ ๊ฐ์ (์ค๋จยทํต๋์คํยท์ฌ๋ผ์ฐํ ).
- ์ ํ: C. ์ด์ : ์์ ์๋ํ์ worker์ goal drift(๋งค๋ชฐ)๋ฅผ ํฐ ๋งฅ๋ฝ์์ ์ก๊ณ , ์ค๋จ ์์ ์ ์ด์ด๊ฐ ํ๋จ ๋ด๋น์ด ํ์.
11. C์ ๋ Job + ์์ 3์์น [ํฉ์: Job2 ์ ํ]
- Job2(์ค๋จ ์์ ํ๋จ): ๋ฉ์ถ ์๊ฐ ์บํฌ ๋ฐ์ดํฐ+brief+git๋ก ์ง๋ก ๊ฒฐ์ . ์ด๋ฒคํธ ๊ตฌ๋, ์, ๊ธฐ์กด claim ๋ชจ๋ธ์ ์ ํฉ.
- Job1(์ค๊ฐ goal-keeping): ๋์ค ๋๋ฆฌํํธ ๊ต์ .
claude -p๋ ๋จ๋ฐ์ดa worker๋ฅผ ์ฒดํฌํฌ์ธํธ๋ก ๋ถํ (์์ max_turnsโ์ ์งโ๊ฒํ โresume/๊ต์ ์ฃผ์ /์์ค์บ๋ ์ดํธ). ๋น์ธ๊ณ ๊น๋ค๋ก์. - continuation brief = ํต๋์คํ ์๋ + ์ฒดํฌํฌ์ธํธ ์ฌ์ ์ง ์ต์ปค(์ด์ค ์ญํ ).
- ์์ 3์์น: (1) ํ๋์ ํ์ ๋ฉ๋ด๋ก(retry/retry-with-fix/์์ธ์ ํต๋์คํ/์ฌ๋ผ์ฐํ /์ฌ์ฉ์์์ค์บ๋ ์ดํธ/abort) (2) ๊ธฐ์กด ๊ฐ๋ ์์์๋ง, ์นด๋๋ณ ๊ฐ์ ยทํ ํฐ ํ๋์ธก (3) escalate-to-user๋ฅผ 1๊ธ ๊ฒฐ๊ณผ๋ก.
- ํ๋ ์ด๋ฐ: C๋ ์ ์๋ธ์์คํ ์ด ์๋๋ผ ๊ธฐ์กด ์ฑํฐ NEXT ๋ผ์ฐํ ๋๋๋ฅผ ์บํฌ๋ฐ์ดํฐ+brief+ํ์ ํ๋+์นฉ์ผ๋ก ์น๊ฒฉ.
12. supervisor ํญ์ฃผ ์ ํ & ์์ด์ ํธ ์ธ๋ถํ ๋น์ฉ [๋
ผ์์ค โ ํ์ฌ ์ง์ ]
์ฌ์ฉ์ ์๊ฒฌ: ๋งค ์์ ์ ์ธ์ = ์ค์ง ์ ๊ฐ์ฒด(ephemeral)๋ผ ์ญํ ์ ๋๋ ค๋ ์์ ๋น์ฉ ๋ถ๋ด ์์. ๋ฐ๋ผ์ ์ญํ ์ธ๋ถํ = ์๋ํ ์ ๋ฐ๋โ. ํญ์ฃผ ์ ํ์ฉ ๊ฐ๋ ๊ด๋ ๊ฐ์ ๊ฐ๋ . Job1/Job2 ๊ฒฐ์ = ์ธ๋ถํ ๊น์ด ๋ฌธ์ . ์ฑํฐ ๋ถ์: - ๋ง๋ ๋ถ๋ถ: idle ๋น์ฉ 0. ์ญํ "์ ์"๋ ๋ฌด๋ฃ. ๋จ์ผ์ฑ ์์ผ๋ก ์ขํ๋ฉด ์ ๋ฐ๋โ, supervisor ์์ ์ ๋๋ฆฌํํธ๋โ. - ์ ์ ํ์: ๋น์ฉ์ ์ญํ "์"๊ฐ ์๋๋ผ ์์ ๋น ํธ์ถ ๊ทธ๋ํ(ํธ์ถ ํ์ ร ํธ์ถ๋น ์ปจํ ์คํธ). ์ธ๋ถํ๋ ํธ์ถ์ ๋๋ฆฌ๊ณ ๋์ผ ๋งฅ๋ฝ(goal/brief/transcript)์ ์ค๋ณต ์ฌ์ญ์ทจ โ ๋ฐํ์ ๋น์ฉโ. "์ ์๋ ๋ฌด๋ฃ, ์คํ์ ์ ๋ฃ." - ๋ฌดํ ํ๊ท ๋ฌธ์ : ๊ฐ๋ ๊ด์ ๊ฐ๋ ๊ดโฆ LLM ๊ฐ์ ์ฒด์ธ์ ์ ๋ขฐ๋ฅผ ๋ฐ๋ฅ๋ด์ง ๋ชปํ๊ณ ๋น์ฉ๋ง ๊ณฑํจ. ํด๊ฒฐ: ๊ฐ์ฅ ๋ฐ๊นฅ ๊ฒฝ๊ณ๋ ๊ฒฐ์ ๋ก ์ ํ๋์ธก(ํ ํฐ/ํธ์ถ/๊ฐ์ /์๊ฐ/cycle) โ ๋ ๋ค๋ฅธ ์์ด์ ํธ๊ฐ ์๋. worker ์ LLM ํ๋จ์ธต์ ์ต๋ 1๊ฒน. ๊ฐ๋ ๊ด LLM์ ๊ฐ๋ฅํ๋ ๊ฒฐ์ ๋ก ์ ์ฒ์ฅ ์๋์ ๋๊ณ ์ฌ๊ท ๊ธ์ง. - ์ธ๋ถํ ์ถ ์ฌ์ ์: "ํ๋ฅด์๋ ๋ช ๊ฐ"๊ฐ ์๋๋ผ "์์ ์๋ช ์ฃผ๊ธฐ์ ์ด๋ ๊ฒฐ์ ์ง์ ์ ํ๋จ์ ๋ฃ๊ณ , ๊ฐ ์ง์ ์ด ๊ฒฐ์ ๋ก vs LLM์ธ๊ฐ." ํ์ดํ๋ผ์ธ: pre-run(๋ผ์ฐํ ยทLLM) / per-checkpoint(Job1ยทLLMยท๋น์) / on-stop(Job2ยทLLMยท์) / on-completion(ํฌ๋ฆฌํฑยทLLMยท์) / continuous(์ํยท์๋ฌ ๊ฐ์งยท์ฝ๋ยท๋ฌด๋ฃ) / outer-bound(ํญ์ฃผ์นฉยท์ฝ๋ยทํ์). - ์ฐ๊ฒฐ๊ณ ๋ฆฌ: ๋งค๋ฒ ์ ๊ฐ์ฒด๋ผ ๊ธฐ์ต์ด ์์ผ๋ ์นด๋/brief/๋ ธ์ ์ ๊ธฐ๋ก์ด ์ ์ผํ ์ฐ๊ฒฐ์กฐ์ง. ์ธ๋ถํํ ์๋ก ๋งค ์ ๊ท ๊ฐ์ฒด ์ฌ๋ธ๋ฆฌํ ๋น์ฉโ โ brief๋ ํ์ดํธํด์ผ ํจ(โ 7๋ฒ ์คํ์ผ๋ก ํ๊ท). ๋ฏธ๊ฒฐ: ์ธ๋ถํ ๊น์ด(์ด๋ ์ง์ ๊น์ง LLM), ํญ์ฃผ ํ๋์ธก ์์น, ํ๋์งํฉ ํ์ .
12-A. ๊ฒฐ์ ๋ก ์ ํ๋์ธก ์ถ์ฒ์ + ์ฌ์ฉ์ top-up [\ucd94\ucc9c \u00b7 \uc2dc\uc791\uac12 \ud569\uc758]
(2026-05-23, ์ธ๋ถ์๋ฃ ๊ฒ์ ๊ธฐ๋ฐ)
์ธ๋ถ ์ ์ค: 3๋ ๊ฐ๋(๋ฐ๋ณต ํ๋ / ํ ํฐยท๋น์ฉ ์์ฐ / stall ๊ฐ์ง)๊ฐ runaway์ ~95% ์ฒ๋ฆฌ, ๋ชจ๋ if/raise ๊ฒฐ์ ๋ก . LangGraph ๊ธฐ๋ณธ recursion 25, ๋จ์์์
๋ฐ๋ณต 5~7.
์ถ์ฒ ์ธก (๊ณ์ธต)
- per-run: codi max_turns 100 ์ ์ง / ์ฑํฐ 8โ25 / per-run wall-clock codi 900s, ์ฑํฐ ~180s
- per-card ์ง๊ณ(๋ฐ๊นฅ ๊ฒฝ๊ณยท์ ๊ท): ์ด LLM ํธ์ถ ~30(worker+supervisor+critic+์ฑํฐ ํฉ์ฐ) / ์ด ํ ํฐ ์์ฐ(์ค์ธก ํ ํ์ ) / ์ด wall-clock 30~60๋ถ / supervisor ๊ฐ์
~5
- ํจํด ์ฐจ๋จ๊ธฐ(์ ๊ท): stall(๊ฐ์ ๋๊ตฌยท์ธ์ โฅ3 ์ฐ์) / ์ฐ์์คํจ(โฅ3) / ์ปจํ
์คํธ ํฝ์ฐฝโํต๋์คํ
- graceful pressure: max_turns ๊ทผ์ฒ "๋ง๋ฌด๋ฆฌ" ๋ฉ์์ง ๋จ๊ณ ์ฃผ์
Pepe ๋งฅ๋ฝ: ๊ตฌ๋
OAuth ๋จ์ผ ์ฌ์ฉ์ โ "๋น์ฉ" = ์ฟผํฐ+์๊ฐ+์ปจํ
์คํธ ํฝ์ฐฝ ํ์ง์ ํ (๋ฌ๋ฌ ์ฒญ๊ตฌ ์๋).
์ฌ์ฉ์ top-up ๊ตฌ์กฐ (์ด๋ฒ ์ถ๊ฐ)
- ์ธก ๋๋ฌ = abort ์๋ โ ์ผ์์ ์ง + ์ฌ์ฉ์ ๋ณด๊ณ (escalate-to-user์ ์ธก ์ ์ฉํ).
- ๋ณด๊ณ ๋ด์ฉ: ์ด๋ค ์ธก / ํ์ฌ ์ํ(continuation brief ์ฌ์ฌ์ฉ) / supervisor ์ง๋จ(๊ฑฐ์ ์๋ฃ vs ์ ์ฒด) / ๊ตฌ์ฒด ์์ฒญ.
- ์ฌ์ฉ์ ๋ถ์ฌ = bounded top-up(+10 ํธ์ถ / +1 ๊ฐ์
/ +N๋ถ), actor=user activity_log ๊ธฐ๋ก, ๋ถ์ฌ ํ resume ๋๋ ์์ธ์
+ํต๋์คํ.
- ์์ ์ฅ์น 2: โ ๋ฐ์ฌ์ ์น์ธ ์ ํญ โ ์งํํ ์ธก์ top-up ์ ์ / ํจํดํ ์ธก์ ํต๋์คํยท์ฌ๋ผ์ฐํ
ยทabort ๊ถ๊ณ (์ฐ๊ฒจ์ override ๊ฐ๋ฅํ๋ ๊ฒฝ๊ณ ). โก ์ฐ์ฅ ์ ์ ๋ ์ฒ์ฅ โ ์นด๋ lifetime ๋น-์ฐ์ฅ ์ํ(top-up ์ต๋ Nํ ๋๋ lifetime ์ด ํธ์ถ ์ํ), ๋๋ฌ ์ one-click ์ฐ์ฅ ๋ถ๊ฐ โ ์ ์นด๋ ๋ถ๋ฆฌ.
- ์ฌ์ฌ์ฉ: ์ ํ๋ฆ ์๋ โ escalate-to-user + task_questions/asking + notify + activity_log ํน์ํ. ๋ณด๊ณ ยท์๋ด ์ฑ๋ = ์ฌ๋ผ.
๋ฏธ๊ฒฐ: ์ ๋ ์ฒ์ฅ ์์น(top-up ์ต๋ ํ์ / lifetime ์ด ํธ์ถ), ํ ํฐ ์์ฐ ์์น(์ค์ธก ํ).
12-B. ์์
์ฒด์ธ(work chain) + ํฌ๋ก์ค-์นด๋ ์ง๊ณ [\ud569\uc758]
(2026-05-23)
per-card ์ ๋ ์ฒ์ฅ ํ์ : top-up ์ต๋ 3ํ + lifetime ํธ์ถ 100 (๋ณํ).
์์
์ฒด์ธ ๊ฐ๋
: ์นด๋ = bounded ์คํ ๊ตฌ๊ฐ, ์ฒด์ธ = ์ฌ๋ฌ ์นด๋์ ๊ฑธ์น ์ ์๋ ํ๋์ ๋
ผ๋ฆฌ์ ์์
. ์นด๋ ์ฒ์ฅ ๋๋ฌโ์ ์นด๋๋ ๋ถ๋ชจ chain_id ์์.
ํตํฉ ๊ณ์ฐ์ด ํ์์ธ ์ด์ (๋ ๋ค)
- ๊ฐ์์ฑ: ํ ์์
์ ํ ํฐยท์ฌ์ดํด์ ์ฒด์ธ ๋จ์ SUMํด์ผ ์ฌ์ฉ์๊ฐ ์ง์ง ์์
๋์ ๋ณด๊ณ ํ๋จ.
- ์์ : ์ ์นด๋๊ฐ ์นด์ดํฐ๋ฅผ 0์ผ๋ก ๋ฆฌ์
ํ๋ฉด "์ ์นด๋ ๋ถ๋ฆฌ"๊ฐ ์นฉ ์ฐํ ๋ฌดํ ๊ฒฝ๋ก๊ฐ ๋จ. ์ฒด์ธ ์ง๊ณ๊ฐ ์์ด์ผ ์นด๋ ์คํฐ์ผ๋ก ์นฉ์ ๋น ์ ธ๋๊ฐ์ง ๋ชปํจ.
์ฒ์ฅ 2์ธต
- per-card: 30 ์์ โ top-up 3ํ๊น์ง 100 โ ๋ฟ์ผ๋ฉด ์ ์นด๋.
- per-chain(์ ๊ท): ์ฒด์ธ ์นด๋ ์ ~5 + ์ฒด์ธ ์ด ํธ์ถ ~300. ๋๋ฌ ์ ์นด๋๊ฐ ์๋ ์ฒด์ธ ์ฐจ์ escalate-to-user (per-card top-up์ ํ ๋จ๊ณ ์๋ก).
2๋จ ํ๊ณ: per-card(ํ ํฐยทํธ์ถยท์ฌ์ดํด, ์ธก+์ฆ์ํ์) + per-chain rollup(๋ฉค๋ฒ ์นด๋ SUM = ์์
๋ ๋ทฐ).
์ ์ (์์งํ): ํ ํ ํฐ ์นฉ mock/0k โ chain rollup์ ๊ทธ ์์ ์ธ์ฐ๋ฉด ๊ฐ์ง. ์์: ๋ ๋ฒ1(stream-json) โ result.usage๋ก ์ค์ธก per-card ํ ํฐ โ chain_id ์ฐ๊ฒฐ โ chain rollup. (rollup์ ์ค์ธก ์์๋ง.)
๊ตฌํ ์ต์ปค: task์ chain_id; ํต๋์คํ๊ฐ ์ ์นด๋ ์์ฑ ์ continuation brief๊ฐ chain_id + ๋์ totals ์ด๋ฐ; rollup = ์ฒด์ธ ๋ฉค๋ฒ agent_runs SUM; ๊ธฐ์กด cycle_count๋ ์ฒด์ธ ํฉ์ฐ(="์์
์ฌ์ดํด ์นด์ดํธ ํตํฉ").
๋ฏธ๊ฒฐ: per-chain ์ฒ์ฅ ์์น ํ์ (์ถ์ฒ 5์นด๋ / 300ํธ์ถ), ํ ํฐ ์์ฐ(์ค์ธก ํ).
๋ณด๊ฐ (2026-05-23) โ ์ฒด์ธ ์ฒ์ฅ์ ๋ง๋ค๋ฅธ ๋ฒฝ์ด ์๋ ์ฒดํฌํฌ์ธํธ
- ์์
๊ธฐ๋ก(continuation brief / git / chain rollup / transcript)์ ์ธก๊ณผ ๋ฌด๊ดํ๊ฒ ๋ณด์กด๋๋ฏ๋ก, ์ ์นด๋๋ก ์ด์ด๊ฐ๋ ๊ฒ์ ์ธ์ ๋ ๊ธฐ์ ์ ์ผ๋ก ๊ฐ๋ฅ. ์ธก์ "์๋์ผ๋ก ์ด์ด์ง๋๋ vs ์ฌ๋์ด ์๋์ ์ผ๋ก ๊ฒฐ์ ํ๋๋"๋ง ๊ฐ๋ฆ.
- ์ฒด์ธ ์ฒ์ฅ ๋๋ฌ ์ ์ฌ์ฉ์ ์ ํ: (1) ๊ฐ์ ์ฒด์ธ ์ฐ์ฅ(rollup ํตํฉ ์ ์ง โ ํ ์์
์ผ๋ก ๊ณ์ ์ง๊ณ) / (2) ์ ์ฒด์ธ ์์(rollup ๋ฆฌ์
+ ์ด์ ์ฒด์ธ ๋งํฌ๋ก ํ์ ์ถ์ ). "์ฌ์ค์ ๋ค๋ฅธ/ํ์ ์์
"์ด๋ฉด (2).
- ์์น: ์ธก์ ์๋ ํญ์ฃผ๋ง ๋ฌถ๊ณ , ์ฌ์ฉ์์ ์๋์ ์ํ์ ๋ง์ง ์๋๋ค. ์ฌ๋์ ํญ์ ์ธก ์์ ์๋ค.
12-C. (b) ํ์ดํ๋ผ์ธ ์ธ๋ถํ ๊น์ด โ ์ข
๋ฃ [๊ฒฐ์ ]
(2026-05-23)
๊ฒฐ์ : ๊น์ด = ์ด๋ฒคํธ ๊ฒฝ๊ณ๊น์ง.
- ์ฑํ(LLM): pre-run(๋ผ์ฐํ
ยท๊ธฐ์กด) + Job2(on-stop) + ํฌ๋ฆฌํฑ(on-completion).
- ๋ณด๋ฅ(LLM): Job1(per-checkpoint) โ ๋ฐ์ดํฐ ๊ฒ์ดํธ(๋ ๋ฒ1 stream-json ํ ํฐ ์ค์ธก + Job2 failed_attempts์ ๋๋ฆฌํํธ ๋น๋ ํ์ธ ํ ์ฑํ ํ๋จ).
- ๊ณ ์ (์ฝ๋): continuous(์ํยท์๋ฌ ๊ฐ์ง) + outer-bound(ํญ์ฃผ์นฉ).
๊น์ด ๊ธฐ์ค(์์น): LLM ํ๋จ์ ์ด์ฐ ์ด๋ฒคํธ ๊ฒฝ๊ณ์๋ง ๋๋ค. ์ฐ์ ๊ตฌ๊ฐ์ ๊ฒฐ์ ๋ก ์ ์ฝ๋๊ฐ ์์ . โ ํธ์ถ ๊ทธ๋ํ๋ฅผ ์ด๋ฒคํธ ์(์
์ ์๊ณ ๋๋ฌพ)๋ก ๋ฌถ์ด ๋น์ฉ์ ๊ฐ๋ .
๊ตฌํ ํต์ฐฐ: Job2(๋ฉ์ถค)์ ํฌ๋ฆฌํฑ(์๋ฃ)์ ๊ฐ์ supervisor ์ง์
์ ์ด ์ข
๋ฃ ์ํ๋ก ๋ถ๊ธฐํ๋ ๊ฒ โ ์ ์์ด์ ํธ 2๊ฐ๊ฐ ์๋๋ผ ์ด๋ฒคํธ ๊ตฌ๋ supervisor 1๊ฐ + ์ข
๋ฃ์ํ ๋ถ๊ธฐ. "worker ์ LLM 1๊ฒน"ยท๋น์ฌ๊ท ์ ์ง.
ํต์ฆ ์ฐ๊ฒฐ: โก(๋ฉ์ถฐ๋ ๋ด์ฉ ๋ถ์กฑ)=Job2, โข(๋ชป ์บ์นโ๋ฐ๋ณต ํ
์คํธ)=ํฌ๋ฆฌํฑ. โ (์์
์ค ์ค๋ฅ)์ ๋๋ถ๋ถ ์ฝ๋ monitor๊ฐ ๋ฌด๋ฃ ์ฒ๋ฆฌ, ์์ฌ๋ถ๋ง Job1(๋ณด๋ฅ).
Job1 ๋ณด๋ฅ ์ฌ์ : ๋ฐ์ ํ ๋ง ๋ด ๋งค ๊ตฌ๊ฐ goal/brief๋ฅผ ์ฌ์ญ์ทจ = ์ฐ์ ๊ตฌ๊ฐ์ LLM ์ฃผ์
โ ํธ์ถ ๊ทธ๋ํ ๊ณฑ์
. ์ถ์ธก์ผ๋ก ๋น์ผ ์ธต์ ๋จผ์ ๊น์ง ์์.
๋ฏธ๊ฒฐ ๊ฐฑ์ (12๋ฒ): ์ธ๋ถํ ๊น์ด = ํด์. ๋จ์ ๋ฏธ๊ฒฐ โ supervisor ํ๋์งํฉ ํ์ / CONTINUATION_STATE ํ๋ ํ์ / ํ ํฐ ์์ฐ ์ค์ธก / Job1 ์ฑํ(๋ฐ์ดํฐ ๊ฒ์ดํธ).
13. supervisor ํ๋์งํฉ ํ์ [๊ฒฐ์ : 8์ข
๋ช
๋ช
]
(2026-05-23)
๊ฒฐ์ : 8์ข
๋ช
๋ช
. (๋ฐ๋ ํธ๋ฆฌ๋ ํํ๊ณผ ๋ฌด๊ด โ activity_log ๊ฐ์ฌ ๊ฐ๋
์ฑ ์ํด ๋ช
๋ช
์ฑํ. 5์ข
ํ๋ผ๋ฏธํฐํ๋ ๊ตฌํ ์์ ๋์.)
8์ข
: accept / resume / retry / retry-with-fix / ์์ธ์
ํธ๋์คํ / ์ฌ๋ผ์ฐํ
/ ์ฌ์ฉ์์์ค์ปฌ๋ ์ดํธ / abort.
- ์ด์ 6์ข
๋๋น +accept(ํฌ๋ฆฌํฑ ์์ฑ ์ข
๊ฒฐ โ (b) ๊ท๊ฒฐ) +resume(์น์
5 resumeโํธ๋์คํ ๊ตฌ๋ถ, 12-A top-up).
๋ฐ๋ ํธ๋ฆฌ (์
๋ ฅ ๊ณ ์ : ์บํฌ transcript + brief + git):
1. ์ฑ๊ณต ์ฃผ์ฅ โ ํฌ๋ฆฌํฑ ๊ฒ์ฆ(git/ํ
์คํธ/goal) โ ํต๊ณผ=accept, ๋ฏธ๋ฌ=๊ฐญ ๋ค๊ณ ์๋๋ก.
2. ํจํด ์ฐจ๋จ(stallโฅ3 / ์ฐ์์คํจโฅ3 / ์ปจํ
์คํธ ํฝ์ฐฝ) โ ํฝ์ฐฝ=์์ธ์
ํธ๋์คํ, stallยท๋ฐ๋ณต์คํจ=์ฌ๋ผ์ฐํ
(๋์ ๆ) ๋๋ ์์ค์ปฌ๋ ์ดํธ(็ก).
3. ์ผ์ ์คํจ(env/tool)ยท์ ๊ทผ ์ ์ โ retry.
4. ์๋ ค์ง ๊ต์ ๆ โ retry-with-fix.
5. on-trackยทper-run ์์ฐ๋ง ์์ง โ ์ปจํ
์คํธ ์ฌ์ =resume(+์์ฐ, per-card ์ฒ์ฅ ๋ด) / ์์ง=์์ธ์
ํธ๋์คํ.
6. per-card ์ฒ์ฅ(top-up 3 / lifetime 100) โ ์์ค์ปฌ๋ ์ดํธ(์งํํ=top-up ์ ์ / ํจํดํ=ํธ๋์คํยทabort ๊ถ๊ณ ). [12-A/12-B ์ฐ๋]
7. ๊ฐ๋ง ์์ยท๋ฒ์ ๋ฐยท์์ ์๋ฐฐ โ abort(๋ณด๊ณ ๋๋ฐ).
์์น: ์์ค์ปฌ๋ ์ดํธ > abort (์ฌ๋์ด ํ ์ ์์ผ๋ฉด ์ฌ๋์๊ฒ). abort = ๋ช
๋ฐฑ ๊ฐ๋ง์์ยท์์ ์๋ฐฐ ๋๋ ์์ค์ปฌ๋ ์ดํธ ํ ์ฌ์ฉ์ ์ ํ.
์ถ๋ ฅ: ์ ํ๋ activity_log(actor=ai, mode=supervisor) ๊ธฐ๋ก; ์์ค์ปฌ๋ ์ดํธ=task_questions/notify ์ฌ์ฌ์ฉ; ์์ธ์
ํธ๋์คํ=์ ์นด๋ chain_id ์์(12-B).
๋ฏธ๊ฒฐ ๊ฐฑ์ : ํ๋์งํฉ = ํด์. ๋จ์: CONTINUATION_STATE ํ๋ / ํ ํฐ ์์ฐ ์ค์ธก / Job1 ์ฑํ.
15. CMDBOARD V2 โ SARA ๋ํ ๊ตฌ์กฐ์ ๋ด๋ถ ํ๋ค์ค ์ฌ์ ์ [ํ์ ยท ๋ค์ ์์
]
ํต์ฌ ๊ฒฐ์
- V2๋ ์ ๋ฉด ์ฌ๊ฐ๋ฐ์ด ์๋๋ผ ๊ธฐ์กด CMDBOARD ๋ณด์ ๊ฐ๋ฐ์ด๋ค.
- ์ ์ญ SARA ๋ํ๋ฐฉ์ ์ ์ฒด ์นด๋ ๊ด๋ฆฌ/๋น์ ์ญํ ๋ก ์ ์งํ๋ค.
- ์นด๋ ์์ธ๋ณ ๊ธฐ์กด ์ฑํฐ ๋ํ๋ฐฉ์ ํด๋น ์นด๋ ์์ ๋ด๋น SARA ๋ํ๋ฐฉ์ผ๋ก ํ์๋ช ๊ณผ ๊ฐ๋ ๋ง ์ ํํ๋ค.
- ๋ ๋ํ๋ฐฉ์ ํ๋๋ก ํตํฉํ์ง ์๋๋ค.
- ์ฌ์ฉ์๋ ๋ด๋ถ agent๋ค๊ณผ ์ง์ ๋ํํ์ง ์๋๋ค.
- ์ฌ์ฉ์-facing ๋ํ ์๋๋ ์ ์ญ์์๋ ์นด๋์์ธ์์๋ SARA๋ค. ๋จ, ์ปจํ ์คํธ ๋ฒ์๊ฐ ๋ค๋ฅด๋ค.
๋ํ๋ฐฉ ๊ตฌ๋ถ
์ ์ญ SARA ๋ํ๋ฐฉ = ์ ์ฒด ๋น์ / ์นด๋ ๊ด๋ฆฌ์
์นด๋ ์์ธ๋ณ SARA ๋ํ๋ฐฉ = ๊ธฐ์กด ์นด๋ ์์ธ ์ฑํฐ ๋ํ๋ฐฉ์ V2 ํ์๋ช
/ ํด๋น ์นด๋ ์์
์งํ ์ฐฝ๊ตฌ
๋ด๋ถ ํ๋ค์ค ์ญํ
SARA = ์ฌ์ฉ์-facing coordinator
PLANNER = ๊ธฐ์กด ์ฑํฐ์ ์ ์ญํ ๋ช
, ์์
๊ณ์ฝ์์ CODI ์ง์๋ฌธ ์์ฑ
CODI = ์ค์ ๊ตฌํ/ํ
์คํธ/์ปค๋ฐ/๊ฒฐ๊ณผ ๋ณด๊ณ
EVALUATOR = ๋
๋ฆฝ ๊ฒ์ฆ์ธต, ์ง์ ์ฝ๋ ์์ ๊ธ์ง
ROUTER = ๋ค์ ํ๋ ๊ฒฐ์ , silent block ์ฌ์ ๊ธฐ๋ก
๋ค์ ์์
CODI์๊ฒ Phase 0/1 ๊ฐ์ฌ ์ง์๋ฌธ์ ์ ๋ฌํ๋ค. CODI๋ ๋ฐ๋ก ๋๊ท๋ชจ ํจ์นํ์ง ๋ง๊ณ docs/cmdboard_v2_phase0_audit.md, docs/cmdboard_v2_naming_map.md, docs/cmdboard_v2_first_patch_plan.md๋ฅผ ๋จผ์ ์์ฑํ๋ค.
14. ์ฝ๋ ๊ฐ์ฌ ๊ฒฐ๊ณผ โ ์ฌ์ค ๋ฐ์ (CONTINUATION_STATE ์ฌ์ ์ด) [๊ฒ์ฆ ์๋ฃ]
(2026-05-23, ์ฝ๋ ์ ์ ๊ฐ์ฌ โ ๋ชจ๋ ํ์ ํ์ผ:๋ผ์ธ ๊ทผ๊ฑฐ. FINDINGS = cmdboard_supervisor_continuation_audit_FINDINGS.md ๋ก์ปฌ)
๋์ ์ ์ ์ : CONTINUATION_STATE๋ ์ ๊ท ์ค๊ณ๊ฐ ์๋๋ค. brief๋ ์ด๋ฏธ codi_result_v1 ๋ดํฌ(41ํค)๋ก ์กด์ฌ(tasks.py:7614-7656).
์ด๋ฏธ ์์(์ถ๊ฐ ๋ถํ์): done(changed_files / commit_sha / commit_subject / pushed), repo_anchor.branch, deploy_status/tests/healthcheck, summary/codi_report_markdown/num_turns/claude_run_id.
๋ดํฌ ๋ฏธํฌํจ์ด๋ ์ฆ์ join ๊ฐ๋ฅ(์ ์บํฌ 0): head_before/after, commit_hashes ๋ชฉ๋กยทcount, ํ ํฐ(input/output/total/usage_status), dirty_before/snapshot_id/restore โ ์ ๋ถ ์ธ์ ActivityLog(codi_run_started/completed, codi_commit_summary_recorded, agent_token_usage_recorded)์ ์ด๋ฏธ ์กด์ฌ. ๋ดํฌ๋ก๋ง ์ ํ๋ฌ์ด.
gated(์ ํ ํ์):
- failed_attempts(์ฝ๋) โ stream-json(๋ ๋ฒ1) ํ์ ํ์ . --output-format json์ terminal result๋ง stdout์ ์ค์ + exit_code=0 ํ๋์ฝ๋ฉ โ per-step ์คํจ/์ฌ์๋/๊ฑฐ๋ถ ์บํฌ ๊ตฌ์กฐ์ ๋ถ๊ฐ(codi_runner_cli.py:916-917 / 645 / 173).
- ์ฑํฐ rejected_optionsยท๋๊ตฌ๊ฒฐ๊ณผยทํ ํฐ โ claude_client.chat() ๋ณด๊ฐ. ํ์ฌ TextBlock+๋๊ตฌ์ด๋ฆ๋ง, ResultMessage/ToolResultBlock ๋ฏธ์ฒ๋ฆฌ(claude_client.py:173-180). max_turns=8(๋
ธ์
25 ์ ์ ๋ฏธ๋ฐ์).
- chain_context โ chain_id ์ ๊ท migration. chain_id/per-card/per-chain/top-up ์ ๋ฌด(grep 0๊ฑด). run ๋จ์ max_cycles(15)/max_tokens(200000)๋ง ์กด์ฌ.
- supervisor ๋ผ๋ฒจ โ mode enum์ 'supervisor' ์์ โ mode='sara' ์ฌ์ฌ์ฉ ๋๋ ALTER(004 ํจํด). (ยง13 ์ถ๋ ฅ ํ๊ธฐ mode=supervisor๋ ์ด ํญ๋ชฉ์ผ๋ก ์ ์ โ ํ์ฌ๋ 'sara')
ํ ํฐ ํํฉ ์ ์ : ์นด๋ ์นฉยทํค๋ ๊ฒ์ด์งยท์ฑํฐ ํ ํฐยทAgentRun.tokens_usedยทTokenUsage ํ
์ด๋ธ = mock/0(chati.py:374=0 ๊ณ ์ , _base.html:63 "๋ชฉ์
", TokenUsage INSERT ๋ถ์ฌ). ๋จ codi๋ ์ค์ธก ํ ํฐ์ ์บํฌํจ(agent_token_usage_recorded, usage_status='known' ๊ฐ๋ฅ) โ admin ํต๊ณ ์ ์ฉ, ์นด๋ ์นฉ(agent_runs.tokens_used)๊ณผ ๋จ์ .
์ ๊ท ๋ฐ๊ฒฌ 2 (๋
ธ์
๋ฏธ๋ฐ์):
- chati_instruction ์ํฐํฉํธ: ์คํค๋ง/์ ์ฅ๋ถ๊ธฐ ์กด์ฌํ๋ write ํธ์ถ ์์(๋ฏธ์ฌ์ฉ). goal/remaining์ ๊ฑฐ๊ธฐ ์์ โ Task.instruction + ์ฑํฐ ์ฒซ ๋ฉ์์ง ํ๋ฌธ MD์ ์กด์ฌ.
- escalate(asking ์นด๋) ๊ธฐ๋ณธ ๋นํ์ฑ(CHATI_ANSWER_CARDS_DISABLED=true, Phase 83). notify-step/done ์๋ํฌ์ธํธ๋ cmdboard์ ์์(์ธ๋ถ Telegram broker ๊ฐ๋
๋ง docs). โ ยง13 "์ฌ์ฉ์์์ค์ปฌ๋ ์ดํธ" ํ๋์ ์ฑ๋์ด ํ์ฌ ๊บผ์ ธ ์์ = ์ ํ๊ณผ์ .
revised codi_result_v2 = 2๊ณ์ธต:
- Tier A(์ฆ์ยท์ ์บํฌ 0): ์ธ์ ActivityLog join์ผ๋ก head/commits/ํ ํฐ/snapshot์ ๋ดํฌ์ ๋ณํฉ.
- Tier B(๊ฐ๊ฐ ์ gated).
๋ง์คํฐ ๊ฒ์ดํธ = ๋ ๋ฒ1(stream-json) โ failed_attempts(์ต๊ณ ๊ฐ์น) + ํ ํฐ ์ค์ธก + per-step ์บํฌ๋ฅผ ๋์ ํด๊ฒฐ. ๋
ธ์
๋ ๋ฒ ์์(๋ ๋ฒ1 ์ฐ์ )๊ฐ ์ฝ๋๋ก ์ฌํ์ธ๋จ.
15. 8์ข
๊ฐ์ฌ + D1/D2/D3 ์ค๊ณ ํ์ + ์ฑํฐ ๋ํ๋ฐฉ ๊ฐํธ [๊ฒฐ์ ]
(2026-05-25, codi 8์ข
๊ฐ์ฌ codi-autocycle-audit-8actions-report.md ๊ธฐ๋ฐ)
๊ฐ์ฌ ํต์ฌ: ๋ฌด์ธ์๋ฃ ํ๋ก(์ฑํฐ NEXT=done, chati.py:154)๋ ์ด๋ฏธ ์์ฑ. supervisor 8์ข
= 7์ข
audit-only ์ฃฝ์ ๊ฒฝ๋ก + escalate 1์ข
(ํ ๊ธ OFF ๊ธฐ๋ณธ). ์๋์ํ ๋ฏธ๋ฐ์ = ์ด์ ๋ํดํธ G1 ยท G2 OFF. ๋ฉ์ถค ๊ฒ์ดํธ G1~G15 ์ ์. codiโ์ฑํฐ์ฌ๋ถ์(tasks.py:8127)โdone์ด supervisor์ ๋
๋ฆฝ์ ์ผ๋ก ๋ซํ.
D1 โ supervisor ํ๊ธฐ: supervisor.py(591์ค) + codi.py:429-484(judge ํธ์ถ) + signal ๋น๋ ์ ๊ฑฐ. critic 4๊ธฐ์ค(commit / exit_code / summary / goal)์ CHATI_SYSTEM_PROMPT๋ก ํก์. ํก์ โ ๊ฒ์ฆ โ ์ญ์ ์. migration 015/016 ยท enum ยท ์ปฌ๋ผ์ ๋ณด์กด(D2 ์ฌ์ฌ์ฉ).
D2 โ ๊ฐ์
ํ ๊ธ ์ฌ์ ์: supervisor_signal_override โ "์ฌ๋ผยท์ฑํฐ ๊ฐ์
์ฌ๋ถ" 3-state(NULL=์ ์ญ / 1=์๋ / 0=์๋). ๋ฌผ๋ฆฌ ์ปฌ๋ผ ยท ์์ ฏ ์ฌ์ฌ์ฉ(๋ผ๋ฒจ๋ง ๋ณ๊ฒฝ, ๋ง์ด๊ทธ๋ ์ด์
0). G1 ยท G2 ํตํฉ. G3(์ด์์นด๋ ๊ฐ๋) ์ ๊ฑฐ + pfs ๋์ผ ํ ๊ธ ํตํฉ โ pfs ์ค์ ์์ (repo write / deploy-live / master push)์ Tier3 ํ๋์ฐจ๋จ์ด ์ ์ง. (๊ด์ฌ์ฌ ๋ถ๋ฆฌ: ์๋์ํ ์ฐธ์ฌ = ํ ๊ธ / ์ํ์์
์ฐจ๋จ = ํ๋์ธต)
D3 โ ๋ฌด์ธ์๋ฃ (8์ข
์ ๋ถ): ยง13 8์ข
์ ์ฑํฐ NEXT๋ก ๋งคํ. D3-a(accept/retry/retry-with-fix/escalate, ์ฆ์) / D3-b(resume ยท ์์ธ์
ํธ๋์คํ = ๋ ๋ฒ1 ์ฑํฐ transcript + continuation brief + chain_id + per-chain cap) / D3-c(์ฌ๋ผ์ฐํ
ยท abort terminal). ์ ์ง ํ์ฑํ(๊ฒ์ฆ์นด๋ per-card ON โ 10ํ PASS โ ์ ์ญ ON ๊ฒฐ์ ).
ํ๋ก ํธ (๋ฌถ์2.5): ๋์ = ์นด๋์์ธ ์ฐ์ธก "์ฑํฐ์ ๋ํ" ์ธ๋ก ํจ๋(์ฌ๋ผ ์ฌ์ด๋๋ฐ๋ ์ถํ). ์ํ ์์ ฏ 6์ข
๋ถ์ฐ โ ์์ถ ยท ์ ์ด์ ํตํฉ + ๊ฐ์
ํ ๊ธ ๊ต์ฒด + ์๋ ํธ๋ฆฌ๊ฑฐ ์ถ์ = 3-zone(๊ด์ฐฐ / ๋ํ / ๊ฐ์
). ๊ธฐ์กด ์ฐ์ธก ์ธ๋ก ์ปฌ๋ผ ํญ ยท ์์น ์ ์ง(๊ฐ๋ก ํ์ฅ ๊ธ์ง). ๋ชฉ์
์ผ๋ก ํ์ .
์ํ: 6๋ฌถ์(1 D1ํก์+D3-a / 2 D2 / 2.5 ํ๋ก ํธ / 3 D1์ญ์ / 4 D3-b / 5 D3-c โ ๋ฐฐํฌ). ๊ฐ :8003 ๊ฒ์ฆ, master push ๋ง์ง๋ง. ๋ฌถ์1 ์ต์ข
์์ฑ ์๋ฃ(codi-bundle1-d1-absorb-d3a.md).
ยง13 ์ ์ : 8์ข
์ ๋ผ๋ฒจ๋ง ์ ์๋๊ณ ์คํ ๋ก์ง ๋ฏธ๊ตฌํ์ด์์(๊ฐ์ฌ ํ์ธ) โ ์ฑํฐ NEXT๋ก ์ค์ ํก์๊ฐ D3.
16. ๋ฌถ์5 (D3-c ์ฌ๋ผ์ฐํ ยทabort) ๊ตฌํยท๊ฒ์ฆ [๊ฒ์ฆ ์๋ฃ โ abort ๊ท๋ช ]
์ค๊ณ โ NEXT 8๊ฐ ๋งคํ ๊ณ์ฝ (ยง13 ๊ธฐ๋ฐ)
8์ข ํ๋ โ ์ฑํฐ NEXT ๋งคํ: acceptโdone / resumeโresume / retryโcodi / retry-with-fixโcodi+draft / ์์ธ์ ํธ๋์คํโhandoff / ์ฌ๋ผ์ฐํ โreroute / ์ฌ์ฉ์์์ค์ปฌ๋ ์ดํธโholdยทmanual / abortโabort. D3-c๊ฐ ์ถ๊ฐํ๋ ์ ๊ท 2๊ฐ = rerouteยทabort. - reroute(progยทnext_mode=codiยทaction=chati_next_reroute): ํจํด์ฐจ๋จ(stallโฅ3/์ฐ์์คํจโฅ3)์ด๋ฉด์ ์๋ํ ๋ค๋ฅธ ์ ๊ทผ์ด ์์ ๋ ๋ค๋ฅธ ์ ๊ทผ์ผ๋ก ์ฝ๋ ์ฌ์ง์ . ์์ค์ปฌ๋ ์ดํธ๋ณด๋ค ์ฐ์ (์๋ ฅ ํด์ ์๋). codi์ ๋์ผํ๊ฒ autorun ๋ฐํ + codi_instruction_draft ๋๋ฐ. - abort(holdยทnext_mode=manualยทaction=chati_next_abort, terminal): ๊ฐ๋ง์์/๋ฒ์๋ฐ/์์ ์๋ฐฐ ๋๋ ์ฌ์ฉ์ ์ค๋จ ์ ํ. ์นด๋๋ฅผ hold๋ก ์ข ๊ฒฐํ๊ณ ์ฌ์ฉ์ ๊ฐ์ ๋๊ธฐ. task_question ์์ฑ ์ ํจ(์์ค์ปฌ๋ ์ดํธ์ ๊ตฌ๋ถ โ abort๋ ์กฐ์ฉํ ์ข ๊ฒฐ).
๊ตฌํ (bridge-test 3ํ์ผ + EC2-test tasks.py, ์ ๋ถ ๋ฐฑ์ ๋ณด์ )
- chati.py: _NEXT_RE ์ ๊ท์์
|reroute|abort, _VALID_NEXT 8๊ฐ, _NEXT_ROUTING์ reroute/abort ๋ผ์ฐํ . - chati_chat_consumer.py(์ค์ ์๋์ํ ๊ฒฝ๋ก โ Phase 2 ์ผ๋ฐ์ฑํ
): _NEXT_ALLOWED_VALUES 8๊ฐ, _NEXT_BRIEF_VALUES ๋ถ๋ณ(resumeยทhandoff๋ง), next_value_counts์ reroute/abort, dispatch์์ chati_next_detected payloadยทcodi-pending ํธ๋ฆฌ๊ฑฐ ๋ชจ๋
next_val in ("codi","reroute")๋ก ํ์ฅ(reroute๋ autorun) + reroute/next ๋ง์ปค. - persona.py: NEXT 8๊ฐ + reroute/abort ๋ฐ๋๊ธฐ์ค ๋ฌธ์ํ, codi_instruction_draft ๊ท์น์ next=codi ๋๋ reroute๋ก ํ์ฅ.
- EC2 tasks.py: code_map(L11291) rerouteโnext_codiยทabortโnext_hold. add_log ํธ๋ค๋ฌ(def L11176) resume/handoff ๋ถ๊ธฐ ๋ค
if next_val=='reroute':(audit) /elif next_val=='abort':(status=holdยทnext_mode=manualยทdetach_chati_pending_for_taskยทchati_next_abort auditยท_chati_progress(next_hold)).
๊ฒ์ฆ
- #1 ๋ฐฐ์ + #2 ๋จ์ (bridge-test): 32/32 ALL_PASS โ 8๊ฐ ์ ํฉ, reroute prog/codi, abort hold/manual, draft ๋ณด์กด, brief ๋ฌด์ํฅ, ๊ธฐ์กด 6๊ฐ ํ๊ท 0, dispatch ๋ฐฐ์ .
- #3 health: PASS โ :8003ยท:8766 healthy, py_compile OK, ์ด์ ๋ฌด์ ์ด.
- #4 EC2 ๋ฐํ์ (test_client): reroute PASS / abort FAIL โ reroute๋ auditยทstatusยทtask_question ์ ๋ถ ๊ธฐ๋๋๋ก. abort๋ง statusยทnext_mode ๋ฏธ๋ณ๊ฒฝ + chati_next_abort audit 0.
RESOLVED โ abort = ์ฝ๋ ๊ฒฐํจ ์๋ (2026-05-25 ๊ท๋ช )
๊ฒฐ๋ก : EC2-test ๋์คํฌ ์ฝ๋(L11378 if reroute / L11384 elif abort)๋ ์ ์์ด๋ฉฐ, fresh-process test_client ํธ์ถ์์ abort ๋ถ๊ธฐ๋ฅผ ์ ์ ์คํํ๋ค. ๊ทผ๊ฑฐ โ (1) ๊ธฐ์กด DB์ chati_next_abort ๊ฐ์ฌ๋ก๊ทธ ๋ค์ ์กด์ฌ = ๊ณผ๊ฑฐ ์ค์ ์ปค๋ฐ ์ฆ๋ช
, (2) ์ dbg ์นด๋ abort ์ฌํ ์ fresh/stale/rollback readback ๋ชจ๋ status=holdยทnext_mode=manualยทaudit=1, (3) ํ ํ๋ก์ธ์ค rerouteโabort ์ฐ์ ์คํ๋ ALL_PASS. MySQL REPEATABLE READ ๊ฐ์ค์ stale ์ธ์
๋ ๋ฐ์์ ๊ด์ธกํด ๊ธฐ๊ฐ. ์ด์ #4 "abort FAIL"์ ๋น์ ๊ฒ์ฆ ํ๋ค์ค ์ํฐํฉํธ(๋จ์ผ ์ฅ๊ธฐ ํ๋ก์ธ์ค ๋ด ํธ์ง ์ ๋ชจ๋ยทtest_client ์บ์ / create_app ๋ถ์ํจ๊ณผ)๋ก ํ์ . โ ๋ฌถ์5 ๊ฒ์ฆ ์๋ฃ.
(๊ตฌ ๊ธฐ๋ก) ๋ฏธํด๊ฒฐ โ abort ๋ฐํ์ ๋ฏธ์คํ
- EC2 add_log ๋ผ์ฐํธ๋ฅผ test_client๋ก ํธ์ถ ์ abort ๋ถ๊ธฐ(
elif)๋ง ๋ฏธ์คํ. reroute ๋ถ๊ธฐ(if)๋ ์ ์. POST 200 ๋ฐํ(outer try์ except ์์ โ ์์ธ์๋ค๋ฉด 500์ด์ด์ผ ํจ). - ๋ถ๊ธฐ ๋ก์ง์ ์ ์ ์ฆ๋ช ๋จ: ๋๋ฒ๊ทธ ์คํฌ๋ฆฝํธ๋ก (a) abort statements ์ง์ ์คํ (b) generic _log + code_map _chati_progress(next_hold) + abort ์ ์ฒด ์์ (c) _maybe_emit_autocycle_visible_progress ํฌํจ ํ์ ๋ธ๋ก๊น์ง ์ฌํ โ ์ ๋ถ status=hold/next_mode=manual/abort audit 1๋ก ์ ์ ์ปค๋ฐ.
- inert fixture(wait/chati)๋ก๋ abort๋ง FAIL โ ๋ฐฑ๊ทธ๋ผ์ด๋ ์์ปค ๋ ์ด์ค ์๋. repr์ ๋ค์ฌ์ฐ๊ธฐยท๋ฌธ์ ์ ์.
- ๊ฒฐ๋ก : ๊ฒฉ๋ฆฌ ์คํ์ ์ ์์ธ๋ฐ ์ค์ test_client ๋ผ์ฐํธ์์๋ง ๋ฏธ์คํ/๋กค๋ฐฑ โ ์์ธ ๋ฏธ๊ท๋ช
. ๋ค์ ์กฐ์ฌ ํ๋ณด: reroute
if์ abortelif์ฌ์ด ์ฐจ์ด๋ฅผ ๋ง๋๋ ์์ / test_client create_app() ๋ถ์ํจ๊ณผ / ํธ๋ค๋ฌ ๋ก๋ ์ฝ๋์ ๋์คํฌ ์ฝ๋ ๋ถ์ผ์น.
์ด์ ํจ์ (์ด ์ธ์ ํ์ )
- SSM ๋น๋ํํ ์คํ = AWS-StartNonInteractiveCommand ๋ฌธ์ ์ฌ์ฉ(AWS-RunShellCommand๋ IAM ๊ถํ ์์).
bash -lc "..."๋ก ์ ธ ์ฐ์ฐ์ ๋ํ, ssm-userโubuntu ํ์ผ์sudo -H -u ubuntu, ํฐ/ํ๊ธ ์คํฌ๋ฆฝํธ๋ base64(JSON ASCII) ์ ์ก. - EC2-test import: app.create_app / app.db.SessionLocal,engine / app.models.Task,ActivityLog,TaskQuestion. add_log ๋ผ์ฐํธ =
POST /api/tasks/<task_code>/log. detach_chati_pending_for_task(db,task,*,source,hold=False,done=False).
ยง UI ์ ๋ฉด ์ ๋ฆฌ โ ์นด๋์์ธ + ๊ด๋ฆฌ์ 6ํ์ด์ง (2026-05-27)
๋ฐฐ๊ฒฝยท๋ชฉํ
ํ์ฌ ์์คํ
์์ ๋ณ๊ฒฝ๋์ด ๋ ์ด์ ํ์ ์๋ ๋ชจ๋ํฐ๋งยท๊ธฐ๋ฅ UI๋ฅผ ํ๊ธฐํ๊ณ ์ ๋ฐ ๊ฐ์ . (1) ๊ด๋ฆฌ์ 6ํ์ด์ง ๋จ์ผ /admin+์ข์ธก ์ฌ์ด๋๋ฉ๋ด ํตํฉ (2) ์นด๋์์ธ ๋ชจ๋ํฐ๋ง ์ ๋ฆฌยท๋ชฉ์
์ญ์ ยท3-zone(๊ด์ฐฐ/๋ํ/๊ฐ์
) ์ฌ๋ฐฐ์น.
์งํ ๋ฐฉ์ (์ฌ์ฉ์ ๋ชจ๋)
์ฑํฐ๊ฐ ๊ณํโํ์ธ์ง๋ฌธโ์ฝ๋ ์ง์๋ฌธ(.md) ์์ฑ. ์ง๋จ/์ฝ๋ฉ/SSM์ ์ฝ๋ ์์. ์ฝ๋ read-only ๊ฐ์ฌ ์ ํ์ผ๋ก ํ์ด์ง๋ณ ํญ๋ชฉ ์ ๋ฐ ์๋ณ.
๊ฒฐ์ ์ฌํญ
- ๊ด๋ฆฌ์ ํตํฉ = ๋จ์ผ
/admin+ ์ข์ธก ์ฌ์ด๋๋ฉ๋ด(6โ1, ์น์ ๋ถ๋ฆฌ, JS island). - ์นด๋์์ธ = ๋ฌถ์2.5 3-zone ์ฌ์ค๊ณ. zone ๊ทธ๋ฃน ๊ฒฝ๊ณ๋ง ๋์ (์์ ์ ์ง).
- ๊ธฐ์กด 9 URL ์ ๋ถ alias ์ ์ง(redirect โ /admin#์น์ ).
- ํ ํฐ ๊ฒ์ด์ง(D-1): '์ค์ธก ๋ฏธ์ฐ๊ฒฐ' ๋ผ๋ฒจ ์ ์ง(์ ๊ฑฐ ์ ํจ).
- chati-continue-row(User#1): UI ์ญ์ ํ๋ endpointยทํ ์คํธ ์ ์ง.
- supervisor ๋ผ๋ฒจ: ์๋โ์ฌ๋ผ, ์๋โ์ฌ์ฉ์ (DB๊ฐ ๋ฌด๋ณ๊ฒฝ).
๋ฌถ์ ๋ถํดยท์ํ
- ๋ฌถ์A(์๋ฃ, :8003): D-2/D-3/D-10 ์ฒญ์ + User#1 UI์ ๊ฑฐ + F-4 ๋ผ๋ฒจ์นํ. ์ปค๋ฐ742f454. โป์ฝ๋๊ฐ master push๊น์ง ์งํ(์ด์ ํธ๋ฆฌ๊ฑฐ), SSM๋ฐฐํฌ Failed๋ก EC2 ๋ฏธ์ ์ฉ.
- ๋ฌถ์B(์งํ์ค, :8003): ๋จ์ผ/admin 6์น์ ํตํฉ. ๋ธ๋์น feat/admin-unify-bundleB f06bc76(๊ฐ๋ ์ ์, master ๋ฏธ๋ฐ์). ๋จ์=๋ธ๋ผ์ฐ์ ์ค๋์ ์ฌ์ฉ์ ํ์ธ.
- ๋ฌถ์C(์งํ์ค): ์นด๋์์ธ 3-zone + ์ ๊ท 'ํ๋ก์ธ์ค ์ํ ๋ชจ๋ํฐ๋ง ํผ๋'(activity_logs ์์ฐ์ด ๋ณํ, ํ์ด๋ธ๋ฆฌ๋ T1/T2/T3, raw ๋ฐฑ๊ทธ๋ผ์ด๋+๋ณต์ฌ). ๋ค์=payload ๊ฐ์ฌ(codi-bundleC-pre-feed-audit.md, read-only) ๊ฒฐ๊ณผ ์๋ นโT๊ฒฝ๊ณ ํ์ โํผ๋ ๋ชฉ์ โ๊ตฌํ ์ง์๋ฌธ.
๋ฏธ๊ฒฐ
- ํ๋ก์ธ์ค ํผ๋ ๋ฐ์ดํฐ ์์ค(activity_logs ๋จ๋ vs agent_runs/codi_sessions ์กฐ์ธ)๋ payload ๊ฐ์ฌ ํ ํ์ .
- ์์ฐ์ด ๋ณํ ์ค์๊ฐ์ฑ(ํด๋ง ์ฃผ๊ธฐ ๋ฑ)ยทํผ๋ ์์น(๊ด์ฐฐ zone ์ ํจ๋) ๋ฏธํ์ .
- ๋ฐฐํฌ ์ํฌํ๋ก ์ด์/ํ ์คํธ ๋ถ๋ฆฌ(์ถํ).
์ฐ์ถ ๋ฌธ์ (๋ก์ปฌ C:devcmdboard)
- docs/cmdboard_ui_cleanup_audit.md (๊ฐ์ฌ ๋ณด๊ณ ์)
- codi-bundleA-cleanup-labels.md / codi-bundleB-admin-unify.md / codi-bundleC-pre-feed-audit.md (์ฝ๋ ์ง์๋ฌธ)
- docs/cmdboard_activity_feed_audit.md (์์ โ ์ฝ๋ ์์ฑ)