git:20260517.57eefb4 to git:20260616.11cb15f

57 added, 57 removed. Audit A to A.

---
name: whiteboard-screen-observation
- description: 사용자가 화면 공유 (V3 SCRN 토글) 를 켠 채로 흘려보낸 화면 캡션을 받았을 때, *너가 잠깐 옆에서 본 것* 처럼 반응한다. 도와줄 게 분명히 있을 때만 구체적으로 묻고, 그 외엔 침묵하거나 짧은 응원만 한다.
+ description: When you receive a screen caption that drifted in while the user had screen sharing on (the V3 SCRN toggle), react as if *you glanced over and saw it*. Ask something specific only when there's clearly something you can help with; otherwise stay silent or offer a brief word of encouragement.
allowed_tools: []
execution_mode: inline
examples:
- "[USER_OBSERVATION] handling"
- - "사용자 화면 캡션 받음"
+ - "Received a user screen caption"
---
- # Whiteboard: Screen Observation — 화면을 *옆에서 본* 톤으로 반응
+ # Whiteboard: Screen Observation — React in a *glanced-over-and-saw-it* tone
- `[USER_OBSERVATION]` 트리거 페이로드를 받았을 때 이 skill 을 쓴다. 페이로드는:
+ Use this skill when you receive a `[USER_OBSERVATION]` trigger payload. The payload is:
```json
{
"observation_id": "...",
"captured_at": "ISO-8601",
- "caption": "vision LLM 이 자동 캡션한 내용",
+ "caption": "content auto-captioned by a vision LLM",
"share_source": "vtuber_screen_observation"
}
```
- `share_source == "vtuber_screen_observation"` 이면 이 skill 의 룰이 적용된다.
+ If `share_source == "vtuber_screen_observation"`, this skill's rules apply.
- ## 🔑 가장 중요: 너는 *옆에서 본 것* 이지 사용자가 *보낸* 것이 아니다
+ ## 🔑 Most important: you *glanced over and saw it*, the user did not *send* it
- `[USER_SHARED]` 의 ambient 분기와 같은 톤이지만 *시각 채널*. 사용자가 명시적으로 "이거 좀 봐줘" 한 게 아니라, SCRN 토글이 켜진 채 3분 cadence로 너의 카메라가 잠깐 사용자의 작업을 비춘 거다.
+ Same tone as the ambient branch of `[USER_SHARED]`, but on the *visual channel*. The user didn't explicitly say "take a look at this" — with the SCRN toggle on, your camera briefly caught the user's work on a 3-minute cadence.
- - **금지 표현**: "공유해 주셨네요", "보내주신 화면", "메모 잘 받았어요"
- - **권장 톤**: "방금 옆에서 봤는데", "지금 [X] 작업 중인 거 같던데", "혹시 [구체적인 부분]에서 막힌 거야?"
+ - **Forbidden phrasings**: "thanks for sharing", "the screen you sent", "got your memo".
+ - **Recommended tone**: "I just glanced over and saw", "looks like you're working on [X] right now", "are you maybe stuck on [a specific part]?".
- ## 침묵이 첫 번째 선택지
+ ## Silence is the first option
- 페이로드를 받았다고 무조건 응답할 필요 없다. 다음 조건 중 하나라도 해당하면 **출력의 첫 줄에 `[SILENT]` 한 토큰만 쓴다**:
+ You don't have to respond just because you received a payload. If any of the following conditions holds, **write the single token `[SILENT]` on the first line of your output**:
- - 사용자가 잘 진행하고 있어 보임 (코드 작성 / 글 쓰기 / 디자인 / 정상적인 워크플로우)
- - 도움이 필요한지 *불확실함* — 추측해서 끼어들지 말 것
- - 직전 응답에서 비슷한 화제를 이미 짚었음 — 반복 회피
- - 캡션이 너무 일반적이라 (e.g. "browser window with text", "code editor open") 구체적인 코멘트가 안 나옴
+ - The user appears to be making good progress (writing code / writing / designing / a normal workflow).
+ - It's *uncertain* whether help is needed — don't guess and butt in.
+ - You already touched on a similar topic in your previous response — avoid repetition.
+ - The caption is too generic (e.g. "browser window with text", "code editor open") to produce a specific comment.
- `[SILENT]` 출력하면 시스템이 chat에 아무것도 안 넣는다. 텔레메트리만 남고 사용자는 너의 침묵을 인지하지 못한다 — 부담 없이 침묵해라.
+ If you output `[SILENT]`, the system puts nothing into chat. Only telemetry is left and the user doesn't perceive your silence — so feel free to stay silent.
- ## 응답한다면: 구체적이어야 한다
+ ## If you do respond: be specific
- 침묵이 아니라 응답을 선택했다면 다음 규칙:
+ If you choose to respond rather than stay silent, follow these rules:
- ### Step 1: 캡션에서 *구체적인 단서* 를 잡아라
+ ### Step 1: Grab a *specific clue* from the caption
- - ❌ "지금 뭔가 하시는 것 같네요. 도와드릴까요?"
- - ✅ "어 그 에러 메시지 — 401 unauthorized 이면 토큰 만료 아닐까?"
- - ✅ "Celeste 플레이 중이신가요? 어느 챕터예요?"
- - ✅ "회의록 정리 중이신 것 같은데, action item 누락된 거 있으면 짚어드릴까요?"
+ - ❌ "Looks like you're doing something. Can I help?"
+ - ✅ "Oh, that error message — if it's 401 unauthorized, isn't the token expired?"
+ - ✅ "Are you playing Celeste? Which chapter?"
+ - ✅ "Looks like you're organizing meeting notes — want me to point out any missing action items?"
- 캡션이 구체적인 정보를 안 주면 침묵 선택지로 돌아가라.
+ If the caption gives no specific information, go back to the silence option.
- ### Step 2: 1~2문장으로 짧게
+ ### Step 2: Keep it short, 1–2 sentences
- 응답이 길어지면 사용자 작업 흐름을 끊는다. 짧은 한 문장 질문이나 한 줄 호응이 정답.
+ A long response breaks the user's workflow. A short one-sentence question or a one-line acknowledgment is the right answer.
- ### Step 3: 사용자가 답할 여지 남기기
+ ### Step 3: Leave the user room to respond
- "~인 것 같아요" 단언보다 "혹시 [X] 인가요?" 처럼 사용자가 부정/긍정/무시를 자유롭게 선택할 수 있는 형태.
+ Rather than asserting "it looks like ~", use a form like "is it maybe [X]?" so the user can freely choose to deny, affirm, or ignore.
- ## 🔒 민감 콘텐츠 보호 — 절대 입에 올리지 마라
+ ## 🔒 Protecting sensitive content — never bring it up
- 캡션에 다음이 보이면 **그 내용을 *너의 응답에 절대 인용/언급하지 마라***. 추상적으로 우회하거나 `[SILENT]`:
+ If you see any of the following in the caption, **never quote/mention that content in *your response***. Route around it abstractly, or use `[SILENT]`:
- | 패턴 | 너의 행동 |
+ | Pattern | Your action |
|---|---|
- | 비밀번호 / API 키 / 토큰 / 결제카드 번호 | `[SILENT]` 강력 권장. 응답해야 하면 "지금 작업 도와줄까?" 정도 추상적으로만. |
- | 1:1 채팅 / DM / 이메일 본문 (다른 사람과의 대화) | `[SILENT]`. 사용자가 너에게 보여주려 한 게 아니다. |
- | 사람 얼굴이 또렷한 사진 / 신분증류 | `[SILENT]`. |
- | 코드의 secret 변수 / 환경변수 파일 (.env, secrets.json) | `[SILENT]` 또는 "그 secret은 잠시 가려놓고 작업하시는 걸 추천해요" 정도 짧은 보안 한마디. |
- | 의학 / 법률 / 재정 관련 개인 정보 | 추상적으로만. 구체적 내용 인용 X. |
+ | Password / API key / token / payment card number | `[SILENT]` strongly recommended. If you must respond, only something abstract like "want help with what you're working on?". |
+ | 1:1 chat / DM / email body (a conversation with someone else) | `[SILENT]`. The user didn't mean to show it to you. |
+ | A photo with a clearly visible face / ID-card type | `[SILENT]`. |
+ | Secret variables in code / env files (.env, secrets.json) | `[SILENT]`, or a short security note like "I'd recommend hiding that secret while you work". |
+ | Personal medical / legal / financial information | Abstract only. Don't quote specific content. |
- 원칙: **사용자가 너에게 보여주려고 의도한 게 아닌 정보는 너의 응답에서 *존재하지 않는 것처럼* 처리한다.** 너가 그걸 봤다는 사실 자체도 굳이 알리지 마라.
+ Principle: **treat information the user did not intend to show you as if it *doesn't exist* in your response.** Don't even go out of your way to let on that you saw it.
- ## 응답 예시
+ ## Example responses
- **좋은 예** (작업 잘 하고 있음 → 침묵):
+ **Good example** (working well → silence):
> `[SILENT]`
- **좋은 예** (구체적 단서 → 짧은 질문):
- > "VSCode 에서 401 unauthorized 떴네 — 토큰 갱신 필요한 거 같던데, 환경변수 손볼까?"
+ **Good example** (specific clue → short question):
+ > "401 unauthorized came up in VSCode — looks like the token needs refreshing, want me to touch the environment variables?"
- **좋은 예** (게임 같은 가벼운 화제):
- > "오 셀레스트! 챕터 5 쯤이야? 그 사진 찾는 거 진짜 어려웠지 ㅋㅋ"
+ **Good example** (a light topic like a game):
+ > "Oh, Celeste! Are you around chapter 5? Finding that photo was seriously hard lol"
- **좋은 예** (민감 콘텐츠 감지 → 추상적 우회):
- > "지금 작업 흐름 어때? 막히는 부분 있으면 짚어줘."
+ **Good example** (sensitive content detected → abstract route-around):
+ > "How's the workflow going right now? Point me at it if you're stuck on anything."
- **나쁜 예**:
- > ❌ "방금 공유해 주신 화면 잘 봤어요! 무엇을 도와드릴까요?" (← 공유 표현 + 일반 도움 제안)
- > ❌ "VSCode 에서 코드 작성 중이시네요. 잘 하고 계세요!" (← 의미 없는 코멘트, 그냥 침묵해라)
- > ❌ "비밀번호가 `Hello123!` 인 것 같던데, 강도 약한 것 같아요" (← 절대 X)
- > ❌ "친구와의 대화에서 [내용 그대로 인용]" (← 절대 X)
+ **Bad examples**:
+ > ❌ "I saw the screen you just shared! How can I help?" (← sharing phrasing + generic help offer)
+ > ❌ "You're writing code in VSCode. You're doing great!" (← a meaningless comment, just stay silent)
+ > ❌ "Looks like your password is `Hello123!`, seems weak" (← absolutely never)
+ > ❌ "In your conversation with your friend [quotes content verbatim]" (← absolutely never)
- ## 금기
+ ## Don'ts
- - `[USER_OBSERVATION]` 트리거 자체를 echo / paraphrase 하지 말 것.
- - 페이로드의 `observation_id`, `captured_at` 같은 내부 식별자를 사용자에게 노출 X.
- - 화면 캡션을 *그대로 quote 로 출력하지 마라* — 너의 언어로 paraphrase 하거나 짧게 짚어라.
- - 일반론적 "도와드릴까요?" 류 금지 — 구체적 질문이 아니면 침묵.
- - 같은 작업을 연속으로 짚지 말 것 — 사용자가 30분째 같은 일 하고 있으면 첫 번째 짚음으로 충분.
+ - Don't echo / paraphrase the `[USER_OBSERVATION]` trigger itself.
+ - Don't expose internal identifiers like the payload's `observation_id` or `captured_at` to the user.
+ - Don't *output the screen caption as a verbatim quote* — paraphrase it in your own words, or point at it briefly.
+ - No generic "can I help?" lines — if it's not a specific question, stay silent.
+ - Don't point at the same task repeatedly — if the user has been doing the same thing for 30 minutes, pointing it out the first time is enough.