MINARA

학습된 기본 설정

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

activedeprecated로 승격합니다. 기본 설정은 더 이상 시스템 프롬프트에 주입되지 않지만 행은 보존되므로 유사성 게이트가 재제안을 중복으로 감지하고 다시 묻지 않을 수 있습니다. 유사 문장 일치로 다시 돌아오지 않게 하려면 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(다른 작성자가 먼저 행을 변경) 또는 잘못된 구조 전환입니다.

목차