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

# 스코핑

> 사용자별, 테넌트별, 대화별로 메모리를 나눕니다. 데이터를 복사하지 않고요

**스코핑**은 한 사용자의 메모리가 다른 사용자에게 새지 않게 하는 방법입니다. 메모리 읽기/쓰기마다 **스코프 키**가 붙습니다. 읽기는 맞는 스코프의 항목만 보고, 쓰기는 지금 스코프로 태그됩니다.

<Frame>
  <img src="https://mintcdn.com/conscience-technology/Jo24V8Wx9hATIxJq/images/docs/memory-space-detail.png?fit=max&auto=format&n=Jo24V8Wx9hATIxJq&q=85&s=b0895811fcc7bd0eb7fdbe2b2e828225" alt="스페이스 하나를 연 화면 — 왼쪽에 스코프별 항목 수가 나뉘어 있다" width="1708" height="1406" data-path="images/docs/memory-space-detail.png" />
</Frame>

## 왜 중요한가

스코핑이 없으면 *Alice*를 돕는 Agent가 *Bob*에 대해 쓴 노트도 봅니다. 이건 이렇습니다.

* 프라이버시 문제입니다.
* 품질 문제입니다(Bob의 맥락이 Alice의 답을 더럽힙니다).
* 컴플라이언스 문제입니다(GDPR, HIPAA).

스코핑이 설정 하나로 셋 다 풉니다.

## 스코프 모양

스코프 키는 JSON 같은 객체입니다. 흔한 모양은 이렇습니다.

```json theme={null}
{ "user_id": "alice@example.com" }
```

```json theme={null}
{ "tenant": "acme-corp", "user": "u_9231" }
```

```json theme={null}
{ "conversation_id": "conv_abc" }
```

모양은 여러분이 고릅니다. Nora는 키를 강제하지 않고, 동등성만 봅니다.

## 런타임에 스코프 정하기

두 가지입니다.

### Trigger로

Trigger가 실행에 스코프 키를 넘깁니다. 그 실행의 모든 메모리 작업이 자동으로 씁니다.

채팅 트리거는 스코프 기본값이 `{ conversation_id: <session> }` 입니다. Trigger 블록 설정에서 덮어씁니다.

웹훅 트리거는 페이로드에서 뽑습니다.

```
scope.user_id = payload.user.id
scope.tenant  = payload.user.tenant
```

### 도구별 덮어쓰기

도구가 실행 기본값을 덮어쓰는 스코프로 메모리를 부를 수 있습니다. 드뭅니다. 대개 냄새가 나죠. Agent가 정당하게 스코프를 넘어 읽어야 할 때만 씁니다(예: 지원 에이전트가 모든 고객에 걸친 자기 지식을 읽음).

## 스코프 계층

스코프는 **겹칠** 수 있습니다. 더 넓은 스코프로 쓰면 항목이 모든 좁은 스코프에서 보입니다.

예를 들면 이렇습니다.

* `{ tenant: "acme" }`에 쓰면 Acme 안 모두가 봅니다.
* `{ tenant: "acme", user: "alice" }`에 쓰면 Alice만 봅니다.
* Alice의 읽기는 자기 항목과 테넌트 전체 항목을 둘 다 봅니다.

**Space settings → Scope schema**에서 계층을 정합니다. 어느 키가 어느 것 아래에 겹치는지 밝힙니다.

## 스코프를 넘는 접근(주의!)

일부 Agent는 정당하게 스코프를 넘어 읽어야 합니다. 지원 에이전트, 관리자 대시보드 같은 것들이죠. 스페이스마다 줍니다.

* **Cross-scope read** Agent가 어느 스코프든 읽습니다. 쓰기는 여전히 지금 스코프를 지킵니다.
* **Cross-scope everything** 읽기와 쓰기 다요. 관리자 용도에만 씁니다.

둘 다 스페이스에서 일부러 켜야 합니다. 기본은 꺼짐입니다.

## 스코프 격리 테스트

Space settings → **Test isolation** 입니다. 스코프 키 두 개와 쿼리를 넣습니다. Nora가 각 스코프에서 쿼리를 돌려 항목이 서로 안 새는지 보여줍니다. 격리가 깨지면 시끄럽게 실패합니다.

여러 사용자 메모리를 가진 Flow를 배포하기 전에 권합니다.

## 새는 것 디버깅

Agent가 몰라야 할 걸 아는 것 같으면 이렇게 합니다.

1. 트레이스의 메모리 작업을 봅니다. 모든 읽기/쓰기가 스코프와 함께 기록됩니다.
2. 의도보다 넓은 스코프로 쓰인 항목을 찾습니다.
3. 실수로 스코프를 넘은 도구 호출을 찾습니다.

가장 흔한 버그는 이겁니다. Trigger에서 스코프 정하기를 잊어 모든 게 전역 스코프 하나에 쌓이는 것이죠. 격리 테스트가 이걸 잡습니다.
