학습된 기본 설정
GET / POST /v1/preferences: 사용자 대화에서 추출한 기본 설정을 나열, 확인, 승인, 거부 및 사용 중단합니다.
기본 설정 진화 시스템은 대화에서 지속적인 사용자 기본 설정(예: “밈 코인은 절대 거래하지 않음”, “간결하게 답변”, “캔들보다 온체인 데이터를 선호”)을 추출하고, 효력이 생기기 전에 상태 머신을 거치게 합니다.
M1은 읽기 전용 엔드포인트를 제공했습니다. M2는 approve / reject / deprecate 변경 작업과 목록 엔드포인트의 total 필드를 추가했습니다. M3는 undo 엔드포인트와 hard_constraint 행의 도구 수준 적용을 추가했습니다.
M4는 브리지를 추가합니다. active로의 모든 전환은 기본 설정을 관련 다운스트림 저장소에 기록합니다. 유효한 11차원 태그를 이름으로 가진 하드 제약은 user_tags에, 모든 personal_style 행은 memories 미러에(스타일 힌트를 FTS 색인), 시나리오 대상 behavioral_preference 행은 scenario-classifier 부스트에, methodology ID 대상 행은 방법론 우선순위 승수에 기록됩니다. active에서 벗어나는 전환(deprecate / reject)은 각 쓰기를 되돌립니다. 브리지 쓰기는 최선 노력 방식이며 상태 전환을 차단하지 않습니다. 실패는 learning/preference-bridge가 포함된 로그를 통해 나타납니다. 전체 쓰기 경로 다이어그램은 자기 개선 시스템을 참조하세요.
각 기본 설정에는 세 가지 분류 축이 있습니다.
kind:personal_style,behavioral_preference,hard_constraint중 하나입니다.dimension:risk,chain,asset_class,timing,methodology,style,constraint중 하나입니다.state:proposed,active,deprecated,rejected중 하나입니다.
전체 수명 주기는 ~/.claude/plans/autoclaw-agent-agent-lazy-lollipop.md의 프로젝트 계획을 참조하세요.
GET /v1/preferences
선택적 필터로 기본 설정을 나열합니다.
| 메서드 | GET |
| 경로 | /v1/preferences |
| 인증 | GATEWAY_AUTH_TOKEN 설정 시 Authorization: Bearer <token> 필요 |
| 쿼리 | state, dimension, kind, limit(기본 100, 최대 500) |
| 카테고리 | learning |
응답 200:
{
"ok": true,
"data": {
"items": [
{
"id": "pref_a1b2c3d4e5f6",
"user_id": "default",
"dimension": "asset_class",
"kind": "hard_constraint",
"statement": "Never trade meme coins",
"structured": { "operator": "exclude", "subjects": ["meme_coin"], "scope": ["buy", "swap"] },
"evidence": null,
"source": "manual",
"state": "active",
"confidence": 0.65,
"times_observed": 4,
"times_violated": 0,
"dedup_key": "asset_class:hard_constraint:never trade meme coins",
"bridges_user_tag": null,
"approved_at": "2026-04-15T08:00:00Z",
"last_ask_at": null,
"created_at": "2026-04-13T10:00:00Z",
"updated_at": "2026-04-15T08:00:00Z"
}
],
"count": 1,
"total": 1
}
}count는 이 페이지의 행 수(≤ limit)이고, total은 전체 테이블에서 필터와 일치하는 행 수입니다. count == limit && total > limit이면 필터를 좁히거나 더 작은 limit 값으로 페이지를 나누어 나머지를 확인하세요.
state, dimension, kind 또는 limit이 잘못되면 응답 422를 반환합니다.
GET /v1/preferences/:id
ID로 단일 기본 설정을 가져옵니다.
| 메서드 | GET |
| 경로 | /v1/preferences/:id |
| 인증 | GATEWAY_AUTH_TOKEN 설정 시 Authorization: Bearer <token> 필요 |
| 카테고리 | learning |
응답 200: 위 items[] 요소와 같은 행 형태입니다.
ID가 없으면 응답 404를 반환합니다.
POST /v1/preferences/:id/approve
proposed 행을 active로 승격합니다. 아직 설정되지 않았다면 approved_at를 설정합니다. REPL /preferences approve 명령과 minara preferences approve <id>와 같습니다.
| 메서드 | POST |
| 경로 | /v1/preferences/:id/approve |
| 인증 | GATEWAY_AUTH_TOKEN 설정 시 Authorization: Bearer <token> 필요 |
| 본문 | 선택적 { "reason": "..." }(감사 추적, ≤ 500자) |
| 카테고리 | learning |
응답 200: 표준 봉투의 업데이트된 기본 설정 행입니다.
ID를 찾지 못하면 응답 404.
응답 409: 잘못된 전환(예: 행이 이미 rejected) 또는 다른 작성자가 먼저 기록한 경우(CAS lost: 현재 상태를 보려면 다시 GET)입니다.
POST /v1/preferences/:id/reject
proposed(기존 기본 설정을 은퇴할 때는 active)를 rejected로 승격합니다. 형태는 위 approve와 같습니다. rejected는 종료 상태이며 행은 감사 추적으로 보존되지만 다시 표시되지 않습니다.
| 메서드 | POST |
| 경로 | /v1/preferences/:id/reject |
| 인증 | GATEWAY_AUTH_TOKEN 설정 시 Authorization: Bearer <token> 필요 |
| 본문 | 선택적 { "reason": "..." } |
| 카테고리 | learning |
POST /v1/preferences/:id/deprecate
active를 deprecated로 승격합니다. 기본 설정은 더 이상 시스템 프롬프트에 주입되지 않지만 행은 보존되므로 유사성 게이트가 재제안을 중복으로 감지하고 다시 묻지 않을 수 있습니다. 유사 문장 일치로 다시 돌아오지 않게 하려면 reject를 사용하세요.
| 메서드 | POST |
| 경로 | /v1/preferences/:id/deprecate |
| 인증 | GATEWAY_AUTH_TOKEN 설정 시 Authorization: Bearer <token> 필요 |
| 본문 | 선택적 { "reason": "..." } |
| 카테고리 | learning |
POST /v1/preferences/:id/undo
구성된 되돌리기 기간 내에 강한 신호로 자동 활성화된 hard_constraint를 되돌립니다(기본 24시간, PREFERENCE_HARD_UNDO_WINDOW_HOURS 참조). 행은 deprecated로 전환되고 도구 수준 적용은 즉시 중지되며 감사 추적(auto_activated_at 타임스탬프, 원래 문장)은 보존됩니다. M3에 도입되었습니다.
다음 중 하나라면 deprecate를 사용하세요. (a) 기본 설정이 수동 승인되어 auto_activated_at가 null인 경우 또는 (b) 기간이 만료된 경우입니다.
| 메서드 | POST |
| 경로 | /v1/preferences/:id/undo |
| 인증 | GATEWAY_AUTH_TOKEN 설정 시 Authorization: Bearer <token> 필요 |
| 본문 | 선택적 { "reason": "..." }(≤ 500자) |
| 카테고리 | learning |
응답 200: 행이 사용 중단되었습니다.
응답 404: ID를 찾지 못했습니다.
응답 410 Gone: 행은 자동 활성화됐지만 되돌리기 기간이 만료됐습니다. deprecate를 사용하세요.
응답 413: 본문이 4 KB를 초과했습니다.
응답 422: 행이 수동 승인됐습니다(auto_activated_at 없음). deprecate를 사용하세요.
응답 409: CAS lost(다른 작성자가 먼저 행을 변경) 또는 잘못된 구조 전환입니다.