> ## Documentation Index
> Fetch the complete documentation index at: https://docs.myrmagent.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# 목표관리

> 예산 관리, 승인 기준 및 자율 실행을 통해 장기 목표를 정의합니다.

# 목표관리

목표는 Myrm을(를) 채팅 도우미에서 자율적인 작업자로 변화시키는 것입니다. 목표를 정의하고 제약 조건을 설정하고 에이전트가 여러 차례에 걸쳐 독립적으로 작업하도록 하세요.

## 목표 만들기

### GUI에서

1. 메시지 입력 영역에서 **골 모드**를 토글합니다. (오른쪽 하단 토글 버튼)
2. 구성 패널은 다음 섹션으로 확장됩니다.
   * **예산** — `max_tokens`, `max_usd`, `max_time_seconds` 및 `max_turns`의 조합을 설정합니다.
   * **수락 기준** — 에이전트가 통과해야 하는 셸 명령 및 의미 검사를 정의합니다.
   * **제약조건** — 에이전트가 실행 중에 따라야 하는 규칙
   * **보호된 경로** — 에이전트가 수정해서는 안 되는 파일의 Glob 패턴(예: `*.env`, `migrations/**`)
   * **고급** — `loop_on_pause`, `convergence_window`, **각 단계 후 일시 중지**(todo별 체크포인트)
3. 메시지 상자에 목표를 입력하고 전송합니다. 에이전트가 계획 및 실행을 시작합니다.

### 채팅에서

복잡한 작업을 자연어로 간단히 설명하세요. 에이전트는 지속적인 노력이 필요함을 감지하고 목표를 만들겠다고 제안합니다.

## 목표 수명주기

```
QUEUED → ACTIVE → PAUSED / WAIT / BUDGET_LIMITED / NEEDS_HUMAN_REVIEW → COMPLETE / CANCELLED
           ↑                            ↓
    PENDING_APPROVAL ←───────── (resume)
```

| State                | Description                                                                                                                                                       |
| -------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `QUEUED`             | Waiting for the current active goal to finish                                                                                                                     |
| `ACTIVE`             | Agent is actively working toward the objective                                                                                                                    |
| `PENDING_APPROVAL`   | Waiting for user to approve the execution plan                                                                                                                    |
| `PAUSED`             | Temporarily halted by user or convergence detection                                                                                                               |
| `WAIT`               | Agent is blocked and needs user input or an external event (e.g., background job, user credentials), or the goal is determined unachievable without user guidance |
| `BUDGET_LIMITED`     | Budget exhausted — requires user to add budget and resume                                                                                                         |
| `NEEDS_HUMAN_REVIEW` | Verification failed — requires human review and feedback                                                                                                          |
| `COMPLETE`           | Objective met and verified                                                                                                                                        |
| `CANCELLED`          | Explicitly cancelled by user                                                                                                                                      |

## 예산 통제

모든 목표에는 4가지 예산 차원이 있습니다.

| Dimension          | Description                   | Example       |
| ------------------ | ----------------------------- | ------------- |
| `max_tokens`       | Maximum total tokens consumed | 500,000       |
| `max_usd`          | Maximum dollar spend          | \$5.00        |
| `max_time_seconds` | Maximum wall-clock time       | 3600 (1 hour) |
| `max_turns`        | Maximum agent turns           | 30            |

예산 소진으로 인해 진행 상황을 체계적으로 요약하여 목표를 일시 중지합니다. 언제든지 추가 예산을 사용하여 목표를 **재개**할 수 있습니다.

## 승인 기준

"완료"가 어떻게 보이는지 정의하십시오.

```
All tests pass, code coverage > 80%, no new linting errors
```

에이전트는 **이중 엔진 확인**을 사용합니다.

1. **셸 확인** — 테스트 명령(예: `pytest`, `npm test`)을 실행하고 결과를 확인합니다.
2. **의미론적 검증** — 승인 기준에 대한 LLM 기반 평가

목표가 완료로 표시되려면 두 엔진 모두 동의해야 합니다.

### 고급: 논리적 일관성 검증

긴 문서 작업의 경우 의미론적 검증을 통해 전체 출력이 논리적으로 일관되는지 확인합니다.

```
Verify all sections are logically coherent: data and claims introduced earlier are addressed in later sections with no contradictions or omissions
```

에이전트가 쓰기를 마친 후 LLM은 전체 출력을 읽고 논리적 일관성을 판단합니다. 실패하면 에이전트가 자동으로 문제를 해결합니다(최대 3번 재시도한 후 사람의 검토를 위해 일시 ​​중지).

## 제약

상담원이 따라야 하는 엄격한 규칙은 다음과 같습니다.

```
Do not modify the database schema
Do not introduce new dependencies
Keep all changes backward compatible
```

제약 조건은 매 턴 에이전트의 프롬프트에 "제약(반드시 위반하지 않아야 함)" 블록으로 주입되며 의미론적 판단자는 완료 확인 중에 준수 여부를 평가합니다.

## 14층 데드루프 실드

매 턴이 끝날 때마다 14레이어 가드 체인이 에이전트를 계속할지 여부를 결정하여 폭주 실행, 비용 초과, 토큰 낭비, 목표 드리프트 및 샌드박스 조사를 방지합니다.

| #  | Guard Layer                     | What it does                                                                                                                                                                      |
| -- | ------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 1  | **User cancellation**           | Immediate stop via `CancellationToken`                                                                                                                                            |
| 2  | **4D budget limits**            | Tokens / USD / wall-clock time / turns — any dimension exhausted triggers pause                                                                                                   |
| 3  | **Steering token**              | Pauses when a new user message is pending, ensuring user input takes priority                                                                                                     |
| 4  | **Tool completion check**       | Detects if tools already reported the goal as done                                                                                                                                |
| 5  | **Sandbox boundary HITL**       | 3× consecutive `PERMISSION_DENIED` → graceful PAUSE (not hard crash) + red alert in GoalStatusCard for human review                                                               |
| 6  | **Goal drift detection**        | Every 5 turns, LITE\_MODEL scores trajectory drift 0–10. Score ≥3 → nudge message injected; ≥7 → PAUSE for human review. Fail-open on LLM error                                   |
| 7  | **Per-todo checkpoint**         | Opt-in mode: auto-PAUSE after each todo completion, waits for user confirmation before continuing. Ideal for high-risk multi-step tasks (deployments, migrations, data pipelines) |
| 8  | **Semantic judge (LLM)**        | Evaluates whether the objective is met based on conversation context                                                                                                              |
| 9  | **Constraint compliance**       | Checks acceptance criteria and protected-file rules                                                                                                                               |
| 10 | **Zero-progress pause**         | No tool calls in a turn → auto-pause to prevent "talks but does nothing"                                                                                                          |
| 11 | **Judge parse circuit-breaker** | 3 consecutive unparseable judge outputs → pause (saves tokens on bad models)                                                                                                      |
| 12 | **Verification fuse**           | 3 consecutive verification failures → pause (prevents verify-retry loops)                                                                                                         |
| 13 | **Convergence detection**       | K turns without progress → auto-complete (`convergence_window`)                                                                                                                   |
| 14 | **Graceful wrap-up**            | On budget exhaustion, injects a wrap-up prompt for a final summary turn — no mid-sentence cutoffs                                                                                 |

또한 동적 잔여 USD 주입 및 **4계층 컨텍스트 창 오버플로 보호**를 갖춘 **점진적 예산 저하**(경고 → 마무리)는 미들웨어 수준에서 작동하여 엣지 케이스가 가드 체인에 도달하기 전에 이를 포착합니다.

### 판사 피드백 루프

의미론적 판단에서 목표가 **아직 완료되지 않았습니다**라고 판단하면 구체적인 이유를 제공합니다(예: "5개 차트 중 3개만 생성됨"). 이 이유는 다음 차례의 프롬프트에 자동으로 삽입되므로 에이전트는 해결해야 할 공백이 무엇인지 정확히 알 수 있으므로 중복된 재분석을 제거하고 불필요한 차례가 줄어듭니다.

### Todo별 체크포인트

할 일별 체크포인트 모드를 활성화하려면 고급 설정에서 \*\*"각 단계 후 일시 중지"\*\*를 활성화하세요. 활성화되면 에이전트는 각 작업 항목을 완료한 후 자동으로 일시 중지하고 계속하기 전에 사용자의 확인을 기다립니다.

**작동 방식:**

1. 에이전트는 `todo_write`을 통해 할 일 항목이 완료된 것으로 보고합니다.
2. 가드 체인은 새로운 완료를 감지하고 목표를 일시 중지합니다.
3. GoalStatusCard에는 **계속** 버튼을 사용하여 방금 완료된 단계가 표시됩니다.
4. 결과를 검토한 후 **계속**을 클릭하여 다음 단계로 진행합니다.

**최적의 용도:**

* **프로덕션 배포** — 진행하기 전에 각 마이그레이션 단계를 확인하세요.
* **데이터 파이프라인** — 각 단계에서 데이터 무결성을 확인합니다.
* **복잡한 리팩터링** — 코드 변경 사항을 단계별로 검토합니다.
* **학습** — 에이전트가 각 단계에서 수행하는 작업을 이해합니다.

이는 선택 사항이며 기본값은 꺼짐입니다. 비활성화되면 에이전트는 평소처럼 중단 없이 실행됩니다.

## 칸반 목표 모드

목표는 채팅에만 국한되지 않습니다. 자율적인 다중 턴 실행을 위해 모든 **Kanban 작업 카드**에서 목표 모드를 활성화할 수 있습니다.

### 목표 모드 활성화

1. 새 Kanban 작업을 생성할 때 작업 생성 양식에서 **목표 모드**를 전환합니다.
2. 선택적으로 **최대 회전수**를 설정합니다(지정되지 않은 경우 시스템 목표 예산이 기본값으로 설정됨).
3. 작업 설명이 목표 목표가 됩니다. 에이전트는 여러 차례에 걸쳐 해당 작업을 수행합니다.

### 작동 방식

목표 모드 작업이 전달되면:

1. `KanbanTaskRunner`은 전체 목표 엔진을 재사용하여 `GoalRegistry`를 통해 `GoalProvider`을 생성합니다(채팅 목표와 동일한 인프라).
2. `StreamExecutor`은 자율 루프(의미론적 판단, 14계층 가드 체인, 예산 제어, 수렴 감지)를 구동합니다. 모두 적용됩니다.
3. 완료 시: `GoalStatus.COMPLETE` → `COMPLETED`로 표시된 작업; 예산 소진 → 구조화된 요약으로 `FAILED`로 표시된 작업

### 왜 사용해야 할까요?

| Scenario          | Without Goal Mode                         | With Goal Mode                                          |
| ----------------- | ----------------------------------------- | ------------------------------------------------------- |
| Research report   | Single-turn partial output, manual re-run | Multi-turn deep research until acceptance criteria pass |
| Code review audit | One pass, misses follow-up items          | Iterative review → fix → verify cycle                   |
| Data analysis     | Incomplete if data is complex             | Continues until all metrics extracted and validated     |

### 시각적 표시기

* **작업 카드** — 목표 모드가 활성화된 카드에는 "목표 모드" 배지가 나타납니다(설정된 경우 최대 회전 수 표시).
* **작업 서랍** — 세부정보 섹션에 목표 모드 상태가 표시됩니다.

### 예산 및 안전

4가지 예산 차원(토큰, USD, 시간, 턴)이 모두 적용됩니다. 14층 데드 루프 실드는 매 턴마다 실행되어 폭주 실행, 비용 초과 및 목표 드리프트를 방지합니다. 이는 채팅 목표와 동일한 보호 기능입니다.

## 우선순위 대기열

여러 목표를 만들면 자동으로 대기열에 추가됩니다.

* 첫 번째 골은 즉시 실행됩니다.
* 후속 목표는 `QUEUED` 상태가 됩니다.
* 활성 목표가 완료되면 대기 중인 다음 목표가 자동으로 시작됩니다.
* GUI에서 드래그 앤 드롭 재정렬

대기 중인 목표에 대한 승인 단계를 건너뛰도록 `auto_approve: true`을 설정하면 목표 체인의 완전 무인 실행이 가능해집니다.

## Saved Agent 프로필 연속성

목표가 자동 재개(큐 dequeue, 백그라운드 WAIT resume, loop restart)될 때 Myrm은 chat에 바인딩된 Saved Agent profile을 로드합니다: `agent_id`, `user_instructions`(Team Leader protocol + locale suffix), `subagent_ids`, `agent_skill_ids`, 도구 마운트 및 보안 설정. 긴 Goal에서도 한국어 **합니다체** 등 격식이 turn 2+에서 유지됩니다. 구현: `goal_stream_trigger.py`.

**검증(2026-08):** Goal Chrome E2E **2/2** 통과(실 WebUI + MCP + 라이브 LLM, pytest 본문 \~3분).

## 적응형 컨버전스 및 Loop-on-Pause

목표는 에이전트가 작업을 완료한 시기를 자동으로 감지하고 사람의 개입 없이 지속적인 실행을 처리할 수 있습니다.

### 수렴 감지

에이전트가 도구 호출 없이 `convergence_window` 연속 턴을 진행하면 목표는 자동으로 수렴(완료)으로 표시됩니다. 이렇게 하면 에이전트가 더 이상 할 일이 없을 때 토큰을 유휴 상태로 낭비하는 것을 방지할 수 있습니다.

| Parameter            | Description                                  | Default    |
| -------------------- | -------------------------------------------- | ---------- |
| `convergence_window` | Turns of no progress before auto-convergence | (disabled) |

### 일시 정지 시 루프

활성화되면 수렴으로 인해 일시 중지된 목표가 구성 가능한 최대 다시 시작 횟수까지 새로운 컨텍스트로 자동으로 다시 시작됩니다. 이는 장기 실행 모니터링 또는 반복적인 개선 작업에 이상적입니다.

| Parameter           | Description                                   | Default |
| ------------------- | --------------------------------------------- | ------- |
| `loop_on_pause`     | Automatically restart after convergence pause | `false` |
| `max_loop_restarts` | Maximum number of automatic restarts          | 0       |

### 이력서 안전

일시 중지된 목표를 수동으로 재개하면 모든 런타임 카운터(`no_progress_streak`, `loop_restarts`, `consecutive_judge_parse_failures`)가 자동으로 0으로 재설정됩니다. 이를 통해 에이전트는 즉각적인 재수렴이나 잘못된 자동 일시 중지를 트리거하지 않고 새로운 기회를 얻을 수 있습니다.

### 판사 실패 회로 차단기

의미론적 판단 모델이 구문 분석할 수 없는 출력(유효하지 않은 JSON)을 **3회 연속** 반환하는 경우 잘못 구성된 판단에서 토큰 소각을 방지하기 위해 목표가 자동으로 일시 중지됩니다. 이는 다음으로부터 보호합니다.

* JSON 응답 계약을 따를 수 없는 약한 모델 사용
* 임시 모델 성능 저하로 인해 쓰레기 출력이 발생함
* 무한 재시도 루프로 인한 토큰 예산 낭비

구문 분석 실패로 인해 목표가 일시 중지되면 이유 필드에 무슨 일이 일어났는지 명확하게 설명하고 더 유능한 판단 모델로 전환할 것을 제안합니다. 목표를 재개하면 실패 카운터가 재설정되므로 구성을 수정한 후 다시 시도할 수 있습니다.

API/network 오류는 이 임계값에 포함되지 **않습니다**. 콘텐츠 수준 구문 분석 오류만 회로 차단기를 트리거합니다.

### 서버 재시작 복구

목표가 활성화된 동안 서버가 다시 시작(업그레이드, 충돌 또는 컨테이너 일정 변경)되면 고아 목표가 자동으로 감지되고 명확한 이유와 함께 일시 중지됩니다.

* 시작 시 서버는 목표를 구동하는 실행 엔진 없이 여전히 ACTIVE로 표시된 목표를 검색합니다.
* 각각의 분리된 목표는 "서버가 다시 시작되었습니다. 준비되면 재개"라는 이유로 **일시중지됨**으로 전환됩니다.
* 목표가 일시 중지되었음을 알리는 시스템 알림
* 영향을 받은 채팅을 열어 일시 중지된 상태를 확인하고 준비되면 원클릭 재개

이를 통해 중단된 작업을 추적하는 일이 없도록 하면서 자동 토큰 낭비(동의 없이 자동 재개 없음)를 방지할 수 있습니다.

### 프런트엔드 상태

목표 상태 카드에는 다음과 같은 다양한 상태가 표시됩니다.

* **수렴** — 수렴 감지를 통해 목표 완료
* **다시 시작 중(#N)** — 목표는 일시정지 루프를 통해 다시 시작됩니다(다시 시작 횟수 표시).

## 글로벌 목표 추적

컨텍스트를 전환하지 않고도 모든 페이지에서 모든 활성 목표를 모니터링할 수 있습니다.

* **NavBar 배지** — 실시간 배지는 활성 목표 수를 표시합니다. 목표가 완료되거나 대기열에서 제외되면 서버 전송 이벤트를 통해 즉시 업데이트됩니다.
* **백그라운드 작업 팝오버** — 배지를 클릭하면 모든 세션의 모든 활성 목표(목표, 상태, 소비된 토큰 및 경과 시간)를 볼 수 있습니다.
* **빠른 작업** — 팝오버에서 직접 목표를 일시 중지, 재개 또는 취소할 수 있습니다. 건배는 행동을 확인합니다.
* **탐색** — "세션으로 이동" 버튼을 누르면 자세한 내용을 볼 수 있는 목표 채팅으로 바로 이동합니다.
* **OS 알림** — 목표가 완료되면(완료, 실패 또는 일시 중지) 브라우저 탭이 백그라운드에 있어도 시스템 알림을 받습니다.

이는 로컬 WebUI, Tauri 데스크톱 앱, 클라우드 호스팅 샌드박스 등 **모든 배포 모드**에서 작동합니다.

## 동적 하위 목표

실행 중에 에이전트를 중단하지 않고 새 목표를 추가할 수 있습니다.

1. 활성 목표의 세부정보 패널을 엽니다.
2. 하위 목표를 추가합니다(예: "새 모듈에 대한 단위 테스트도 추가")
3. 하위 목표는 가장 높은 우선순위로 에이전트의 컨텍스트에 주입됩니다.

하위목표는 의미판단의 완성기준에 포함된다.

## IM 슬래시 명령

모든 IM 채널(Slack, Feishu, Telegram, WhatsApp 등)에서 목표를 완전히 관리하세요.

| Command                   | Description                                        |
| ------------------------- | -------------------------------------------------- |
| `/goal set <objective>`   | Create a new goal                                  |
| `/goal status`            | View active goal status, constraints, and subgoals |
| `/goal pause`             | Pause the active goal                              |
| `/goal resume`            | Resume a paused goal                               |
| `/goal clear`             | Cancel and clear the active goal                   |
| `/goal budget <amount>`   | Add budget to the active goal                      |
| `/goal constraint <text>` | Add a hard constraint the agent must not violate   |
| `/goal constraint`        | View all current constraints                       |
| `/goal constraint clear`  | Remove all constraints                             |
| `/subgoal add <text>`     | Add a dynamic subgoal                              |
| `/subgoal list`           | List all subgoals                                  |
| `/subgoal remove <index>` | Remove a subgoal by index                          |
| `/subgoal clear`          | Clear all subgoals                                 |

IM을 통해 추가된 제약 조건은 "제약 사항(반드시 위반하지 않아야 함)"으로 에이전트의 프롬프트에 주입되고 완료 확인 중에 의미론적 판단에 의해 시행됩니다. 이는 GUI 정의 제약 조건과 동일한 동작입니다.

## 객관적인 핫 편집

실행 도중 목표 방향을 변경합니다.

1. 활성 목표의 세부정보 패널을 엽니다.
2. 목표 텍스트 편집
3. 변경 사항은 조정 메시지로 주입됩니다. 에이전트는 진행 상황을 잃지 않고 과정을 조정합니다.

## 실행 요약

완료 후 모든 목표는 다음과 같은 `GoalExecutionSummary`을 생성합니다.

* 수정된 파일(diff 링크 포함)
* 토큰 사용 내역
* 모델별 비용 분석
* 경과된 시간
* 턴 카운트
* 완료 이유

이 요약은 GUI 및 API을 통해 확인할 수 있습니다.

## IM 완료 알림

IM 채널(`/goal set`을 통해)에서 목표가 시작되면 완료 결과가 자동으로 원래 대화 스레드로 푸시되며 폴링이 필요하지 않습니다.

| Feature                    | Details                                                                                      |
| -------------------------- | -------------------------------------------------------------------------------------------- |
| Thread-precise delivery    | Replies land in the exact IM thread where `/goal set` was issued                             |
| Localized messages         | Notification language matches the user's locale at goal creation time (en, zh-CN, ja, zh-TW) |
| Deeplink button            | "Continue in browser" button opens the full Goal detail in WebUI                             |
| Success & failure coverage | Both completed and failed goals trigger a notification                                       |
| Consistent with `/btw`     | Uses the same delivery infrastructure as background task notifications                       |

### 예

Feishu에서 목표를 시작하세요:

```
/goal set Analyze Q3 sales data and generate a summary report
```

몇 시간 후, 동일한 Feishu 스레드에서:

```
✅ Goal completed: "Analyze Q3 sales data and generate a summary report"
8 turns · 31.2 min · 3 files changed
[Continue in browser]
```

## 제공 가능한 번들

목표가 완료되고 **2개 이상의 아티팩트**(문서, 스프레드시트, 프리젠테이션 등)가 생성되면 Myrm은(는) 자동으로 이를 **제공 가능한 번들** 카드에 집계합니다.

* **자동 수집** — 목표 세션 중에 생성된 모든 아티팩트는 수동 조치 없이 수집됩니다.
* **원클릭 ZIP 다운로드** — 전체 번들을 단일 ZIP 아카이브로 다운로드
* **파일별 미리보기** — 개별 결과물을 클릭하면 형식 인식 렌더링을 통해 Artifact Portal에서 열 수 있습니다.
* **파일 이름 중복 제거** — 여러 아티팩트가 동일한 이름을 공유하는 경우 고유 식별자가 자동으로 추가됩니다.

### 채팅에서 클릭 가능한 전달 경로

번들 카드 외에도 상담원이 응답에 인라인 코드가 포함된 결과물을 인용하면 WebUI는 해당 결과물을 **클릭 가능한 링크**로 렌더링합니다.

* `` `workspace/reports/brief.md` `` — 작업공간 상대 경로; 탭 한 번으로 Artifact Portal 미리보기가 열립니다.
* `` `@file_001` `` — 짧은 파일 ID를 활용합니다(에이전트가 내부적으로 사용하는 것과 동일한 별칭). 아티팩트 SSE이 동기화되면 클릭 가능

**얻을 수 있는 이점:** Finder 또는 Explorer에 경로를 복사할 필요가 없습니다. OpenWorker Cowork는 `[Title](artifact:path)` 마크다운과 별도의 Right Rail을 기대합니다. Myrm은 기존 포털을 재사용합니다. 채팅에서 경로를 클릭하세요.

> 참고: 고정된 `deliverable_discipline` 프롬프트 블록은 에이전트에게 파일을 작성하고 경로를 인용하도록 가르칩니다. 파일 생성은 아티팩트를 자동 등록하며 SSE에는 `short_file_id`이 포함될 수 있습니다.

### 사용 사례: 풀체인 오피스 딜리버리

사전 구축된 **"Office Full-Chain Delivery"** 에이전트 템플릿을 사용하여 한 번의 대화로 완전한 문서 세트를 생성하세요.

1. 에이전트 선택기에서 "Office Full-Chain Delivery" 에이전트를 선택합니다.
2. 결과물을 설명하세요(예: "분기별 보고서 준비: Excel 데이터 + PPT 프리젠테이션 + 단어 요약")
3. 에이전트는 목표 모드로 실행하여 모든 문서에서 데이터 일관성을 유지합니다.
4. 완료되면 다운로드할 준비가 된 모든 파일과 함께 제공 가능한 번들 카드가 나타납니다.

### API 액세스

REST API을 통해서도 결과물을 사용할 수 있습니다.

* `GET /api/goals/{goal_id}/status` — 아티팩트 ID 및 파일 이름이 포함된 `deliverables` 배열을 반환합니다.
* `POST /api/files/download-bundle` — 여러 아티팩트를 ZIP 아카이브로 다운로드합니다.

## 작업 흐름 예시

```
User: "Migrate the API from Express to Fastify"

Goal created:
  Objective: Migrate Express → Fastify
  Criteria: All existing tests pass, no API contract changes
  Constraints: Don't modify the database layer
  Budget: max_turns=50, max_usd=$10

Agent:
  Turn 1-3: Plans migration, identifies 12 affected files
  Turn 4-15: Rewrites route handlers
  Turn 16-20: Updates middleware
  Turn 21-25: Fixes failing tests
  Turn 26: All tests pass, semantic judge confirms completion
  
Goal COMPLETED — 26 turns, $3.47 spent
```

## 프로젝트 마일스톤(교차 세션 목표)

목표는 단일 세션 내에서 작동하지만 **프로젝트 마일스톤**은 여러 세션에 걸쳐 있습니다. 이를 통해 전체 프로젝트에 대한 전략적 목표를 정의할 수 있으며 에이전트는 모든 대화에서 이를 자동으로 인식합니다.

### 작동 방식

1. 사이드바 패널에서 **마일스톤 생성**(프로젝트 내)
2. **에이전트 자동 삽입** — `ProjectRoadmapMiddleware`은 해당 프로젝트의 모든 대화에 압축 로드맵 컨텍스트(최대 100개 토큰)를 삽입합니다.
3. **진행 상황 추적** — 자동 진행 상황 계산을 위해 마일스톤이 Kanban 보드에 연결됩니다.

### 마일스톤 만들기

사이드바에서 프로젝트로 이동하여 **마일스톤** 섹션을 찾으세요.

* 새 마일스톤을 추가하려면 `+` 버튼을 클릭하세요.
* 각 마일스톤에는 **제목**, 선택적 **설명** 및 **수락 기준**이 있습니다.
* 인라인으로 이름을 바꾸려면 마일스톤 제목을 **두 번 클릭**하세요.
* 목표가 달성되면 이정표를 완료로 표시합니다.

### 실시간 진행 상황 시각화

각 마일스톤에는 연결된 Kanban 작업의 완료율을 보여주는 간단한 진행률 표시줄이 표시됩니다.

* 마일스톤에 관련 작업이 있으면 제목 아래에 **3px 진행률 표시줄**이 나타납니다.
* **작업 개수**가 표시됩니다(예: "6/8") - 수동 계산이 필요하지 않습니다.
* 작업이 완료되면 진행 상황이 자동으로 업데이트됩니다.
* `batch-progress` API은 단일 요청으로 모든 활성 마일스톤 완료율을 가져옵니다(N+1 쿼리 없음).

### 자동 컨텍스트 삽입

마일스톤이 있는 프로젝트 내에서 채팅하면 에이전트는 다음과 같은 컨텍스트를 받습니다.

```
Project: Q3 Product Upgrade — Complete core feature iteration
Current Focus: Finish milestone system and ship to production

Active Milestones:
  - [active] MVP Release (criteria: All core APIs pass integration tests)
  - [active] Beta Launch

Completed: Technical Research
```

이는 자동으로 발생하므로 명령이 필요하지 않습니다.

### 평가 가져오기(원클릭 보고서 → 작업)

에이전트가 평가 보고서 또는 검토 문서(아티팩트)를 생성하면 한 번의 클릭으로 이를 마일스톤 및 작업으로 변환할 수 있습니다.

1. 사이드바에서 **마일스톤 패널 확장**
2. **최근 후보가 자동으로 나타납니다** — 시스템은 각 아티팩트를 조사하여 가져올 수 있는 작업이 포함되어 있는지 확인합니다(가져오기 엔진과 동일한 파서를 사용하는 의미론적 검증). 이미 가져온 아티팩트는 가져오기 원장을 통해 자동으로 감지되고 비활성화된 것으로 표시됩니다.
3. **후보를 클릭**하여 가져오거나 이슈 ID를 수동으로 입력하세요.
4. **즉각적인 피드백** — 성공하면 영수증이 표시됩니다(이정표 + 생성된 작업). 실패는 명확한 이유를 보여줍니다(예: "이미 가져옴", "실행 가능한 작업 없음")

**주요 보장 사항:**

* **멱등성** — 동일한 아티팩트 버전을 동일한 프로젝트로 두 번 가져올 수 없습니다(불변 원장).
* **원자** — 가져오기가 중간에 실패하면 부분적으로 생성된 모든 마일스톤/작업이 롤백됩니다.
* **관찰 가능** — 제품 분석을 위해 가져오기 유입경로 지표(이유 및 트리거별 시도, 성공, 실패)를 추적합니다.
* **값 종료** — 패널에 가져온 후 작업 완료율이 표시되므로 가져온 작업의 실제 영향을 확인할 수 있습니다.

### 목표 및 마일스톤

| Aspect    | Goal                            | Milestone                              |
| --------- | ------------------------------- | -------------------------------------- |
| Scope     | Single session                  | Cross-session (project-level)          |
| Lifecycle | QUEUED → ACTIVE → COMPLETE      | active → completed → archived          |
| Execution | Agent executes autonomously     | Strategic direction, manual completion |
| Budget    | Yes (tokens, cost, turns, time) | No budget — purely organizational      |
| Use case  | "Migrate API to Fastify"        | "Q3: Ship v2.0 to production"          |
