# 기능

> 채팅창 하나로 무엇까지 시킬 수 있나. 그리고 그중 둘이 체감을 바꿨습니다.

- 수치: 11종
- 사람이 보는 화면: https://aitryed.com/ko/built/loki/commands/
- 반대 언어: https://aitryed.com/en/built/loki/commands/index.md
- 이 사이트 안내(AI용): https://aitryed.com/ko/llms.txt

---

**채팅창 하나로 어디까지 시킬 수 있나. 기능이 11가지인데, 그중 둘이 실제 체감을 바꿨습니다.**

## 할 수 있는 일들

| 무엇 | 하는 일 |
|---|---|
| **대화** | 그냥 말 걸면 답함 |
| **긴 작업** | 몇 시간짜리 작업을 걸어 두고 **진행 상황이 대화에 흘러옴** |
| **예약** | 매일·매주·한 번. **컴퓨터를 껐다 켜도 안 잊어버림** |
| **목표 챙김** | 묵은 목표를 **먼저 찔러 줌** |
| **AI 교체** | 어떤 AI를 쓸지 바꿈 |
| **체크리스트** | **누가 체크하면 모두에게 보임** |
| **조직 설정** | 누가 무엇까지 쓸 수 있는지 |
| **자동 듣기** | 정해진 곳에서는 **이름 안 불러도** 답함 |
| **기능 추가** | 파일 하나 = 명령 하나 |
| **자기 감시** | **죽으면 5분 안에 스스로 되살아남** |
| **사용량** | 90일치 통계 |

## 체감을 바꾼 것 하나 — 「어제 하던 얘기를 오늘 이어서」

처음에 이상한 점이 있었습니다. **답글로 이어가는 대화는 잘 이어지는데, 1:1 대화는 매번 처음부터** 시작됐습니다.

원인을 찾아보니, 대화를 구분하는 **열쇠를 «메시지 한 통의 고유번호»로** 잡고 있었습니다.

답글은 **원래 글의 번호를 공유**하니까 이어집니다. 그런데 1:1 대화의 새 메시지는 **매번 새 번호**입니다. 그래서 **매번 새 대화**가 됐습니다.

<strong>「어제 하던 얘기를 오늘 이어서 못 한다」</strong>는 건 생각보다 큰 불편입니다. 매번 배경 설명을 다시 해야 하니까요.

열쇠를 바꿔서 **1:1 대화는 계속 이어지게** 했습니다.

## 체감을 바꾼 것 둘 — 「체크리스트를 왜 직접 만들었나」

슬랙에 **체크박스 기능이 이미 있습니다.** 그런데 따로 만들었습니다.

이유가 하나입니다.

> **슬랙 기본 체크박스는 «각자 자기 것»이라, 내가 체크한 걸 남이 못 봅니다.**

혼자 쓸 거면 상관없는데, **여럿이 같은 목록을 보며 일할 때는 이게 치명적**입니다. 누가 어디까지 했는지 모르니 목록의 의미가 없습니다.

그래서 **누가 체크하면 보는 사람 전원에게 반영되는** 것으로 직접 만들었습니다.

→ **기본 기능이 있다고 다 쓸 수 있는 게 아닙니다.** 「있나」가 아니라 <strong>「내 상황에서 성립하나」</strong>를 봐야 합니다.

## 「찔러 주는 기능」은 한 단어를 두 방향으로 씁니다

목표를 챙겨 주는 기능이 있는데, 같은 이름으로 **두 가지 다른 동작**을 합니다.

| 방향 | 무엇 | 부작용 |
|---|---|---|
| **당김** | 제가 물어보면 추천을 만들어 줌 | **없음** |
| **밀기** | **먼저** 1:1로 찔러 줌 | 있음 — 그래서 **쉬는 시간을 둠** |

밀기 쪽에는 쉬는 시간을 뒀습니다. 이유는 하나입니다. **먼저 말을 거는 기능은 조금만 잘못 만들어도 잔소리가 되고**, 잔소리가 되는 순간 **사람은 그 기능을 꺼 버립니다.**

그래서 **한 번 찌르면, 한동안 조용합니다.**

## 그리고 무엇을 안 남기는가

사용 기록이 90일치 남는데, **대화 내용은 안 적습니다.**

남는 것: **언제, 누가, 얼마나 걸렸는지.**

이게 중요한 이유는 — **기록은 나중에 지우기 어렵다**는 것입니다. 「일단 다 남기고 나중에 정리하자」는 대개 정리가 안 됩니다. **처음부터 안 남기는 게 유일하게 확실한 방법**입니다.

## 여기부터는 자세한 기록입니다

| 무엇 | 명령 | 하는 일 |
|---|---|---|
| 대화 | — | DM은 이어지고, 스레드는 스레드끼리 따로. 채널 최상위는 세션을 안 만든다 |
| 긴 작업 | `!jobs` `!cancel` `!stop` | 동시 2개, 같은 스레드는 순서대로. 몇 시간짜리 파이프라인의 진행이 스레드에 흐른다 |
| 예약 | `!schedule` | 매일·매주·1회. 재부팅하면 반복은 다음 차례로 밀고 1회짜리는 즉시 |
| 목표·넛지 | `!goal` `!nudge` | 묵은 목표(72시간), 같은 이유 3연속 실패, 고른 두뇌 응답 불가 — 셋을 감시해 DM으로 찌른다 |
| 두뇌 교체 | `!provider` | 이 PC에 이미 로그인된 CLI를 스폰한다 |
| 체크리스트 | `!check` | 눌러서 체크하면 보는 사람 전원에게 동기화된다 |
| 조직 | `!org` | 파일 한 장 = 조직 하나. 멤버·채널·읽을 폴더·쓸 명령·시간당 상한 |
| 자동 청취 | `!listen` `!exit` | 정한 구역 안에선 멘션 없이 답한다 |
| 플러그인 | — | `plugins/` 에 파일 하나 = 명령 하나 |
| 감시 | `doctor` | 죽으면 5분 안에 되살린다. 심장박동이 멎은 것도 죽음으로 친다 |
| 사용량 | `!usage` | 90일치. 메타데이터만 남기고 대화 본문은 안 적는다 |

## 세션을 어디에 묶느냐

처음엔 세션 키가 **메시지 자기 식별자**였다. 그래서 스레드는 멀쩡한데 **DM 최상위가 매번 새 대화**로 시작했다. 어제 하던 얘기를 오늘 이어서 못 한다는 뜻이다.

지금은 셋으로 갈렸다.

- **DM** — 이어진다. 유휴 시간이 지나면 만료된다
- **스레드** — 스레드마다 따로. 다른 스레드와 안 섞인다
- **채널 최상위** — 세션 없음

마지막 하나는 기능이 아니라 **방어**다. 채널에서는 여러 사람이 쓰는데, 거기에 세션을 붙이면 **다른 사람의 대화가 내 맥락에 섞인다.** 편의를 하나 포기하고 그 경로를 아예 막았다.

여기에 딸린 함정도 있었다. 잡 큐의 직렬화 키를 세션 키로 바꾸지 않으면, **연속으로 온 DM 두 건이 같은 세션을 동시에 재개한다.** 세션을 이어 붙이는 순간 큐도 같이 손봐야 한다.

## 체크리스트를 왜 직접 만들었나

슬랙에 체크박스가 기본으로 있는데도 따로 만들었다. 이유가 하나다 — **네이티브 체크박스는 사용자별 입력이라 동기화가 안 된다.** 내가 체크한 걸 다른 사람이 볼 수 없다.

그래서 버튼 라벨을 통째로 다시 그리는 방식으로 만들었다. 누가 누르면 메시지 자체가 갱신돼서 **보고 있는 전원에게 같은 상태가 보인다.**

말로도 토글된다. 버튼을 못 누르는 상황이 있어서다.

## 목표를 감시하는 것과 알리는 것

넛지는 한 명사를 두 방향으로 쓴다. **당김**은 부작용 없이 추천 프롬프트를 만들고, **밀기**는 쿨다운을 두고 DM으로 찌른다.

감시 대상 셋을 고를 때 기준이 있었다 — **아무것도 이해할 필요가 없을 것.**

- 목표가 72시간째 안 움직였다
- 같은 이유로 3연속 실패했다
- 고른 두뇌가 응답을 못 한다

셋 다 세는 것으로 판정된다. 대화 내용을 읽고 "이거 헛돌고 있는데?"를 판단하는 방식은 [기각했다](/ko/built/loki/silent-failures/index.md).

## 사용량은 메타데이터만 남긴다

90일치 기록이 남는데 **대화 본문은 안 적는다.** 언제, 누가, 얼마나 걸렸는지만.

프라이버시에는 유리하고 **감사에는 불리하다.** "그때 무슨 지시를 내렸냐"에 답할 수 없다. 이건 트레이드오프고, 개인 도구라 앞쪽을 골랐다. 팀에 배포한다면 뒤집어야 할 결정이다.
