Skip to content

Releases

Closiro v2.47.0

Choose a tag to compare

@closedsi-engineering closedsi-engineering released this 06 Nov 18:55
d1bd0fd

Closiro v2.47.0

호스트가 모델의 작업을 멈추던 지점들을 고치고, 작업별로 모델이 건너뛰던 검증 절차를 호스트 도구로 제공하며, SWE-bench Lite 공식 하네스를 추가한 버전입니다. 모든 호스트 변경은 SNAILER_FIX_*=0 스위치로 이전 동작으로 되돌릴 수 있습니다.

고친 것

  • 셸 명령의 대기 시간과 프로세스 수명을 분리했습니다 (W1). bash_run/run_cmd의 wait_ms는 이번 호출이 기다리는 시간(최대 900 s)이고, 프로세스를 끝내는 시점은 모델이 runtime_limit_ms로 정한 때뿐입니다. 대기가 끝나면 아무것도 죽이지 않고 Running 상태와 run_id, 출력 커서, 활동 기록(바이트, 자식 프로세스, 마지막 변화 이후 시간)을 돌려줍니다. 이전에는 모델이 어림잡은 timeout에 빌드와 서버가 죽었습니다(TB 2.1에서 호스트가 죽인 프로세스 전부가 이 경우). SNAILER_FIX_WAIT_LIFETIME=0.
  • 요구사항 원장이 같은 말의 반복을 진행으로 세지 않습니다 (W4). 파일이 바뀌었거나 검사가 다시 돌았을 때만 진행이고, 모델에게 세 번 물은 항목은 열린 채로 둡니다. 코드 블록의 언어 태그를 명령의 일부로 읽던 문제(bash python3 …를 39회 요구)와 126/127로 끝나는 호출을 의무로 삼던 문제를 고쳤습니다.
  • 변경 금지 범위를 문장 구조로 읽습니다 (W6a). "데이터 파일은 수정하지 말 것" 같은 금지는 그 목적어(콜론 뒤 목록이나 문장 주어)에만 걸리고, 확장자와 디렉터리로 시작 파일과 대조합니다. 소스 수정 211건이 잘못 거부되던 두 작업에서 소스 편집은 허용되고 데이터·읽기 전용 파일은 계속 거부됩니다.
  • 일시적인 모델 장애는 같은 입력으로 한 번 다시 보냅니다 (W8). 응답 시간 초과, 멈춤, 빈 본문, 끊긴 스트림은 예산과 시간이 허락할 때 한 번 재제출합니다. 거절과 인증·결제 오류는 재시도하지 않습니다. SNAILER_FIX_TRANSIENT_FAULT_RETRY=0.
  • 서비스 준비 판정을 종료 시점에 다시 하고, 소유 근거가 있을 때만 넘깁니다 (W2). 이 실행이 띄운 pid가 듣고 있거나 서비스 시작 전에 비어 있던 포트일 때만 "준비됨"이고, 아니면 "미확정"으로 기록합니다. 준비 대기 상한 900 s. SNAILER_FIX_SERVICE_RECHECK=0.
  • 정체 안내는 한 번만 (W3b). 바뀐 것 없는 작업 공간에서 같은 호출이 세 번째일 때 한 줄, 파일 읽기 안내는 파일당 한 번. SNAILER_FIX_STAGNATION_NOTE=0.
  • 재현 검사는 리다이렉트 대상에서도 기대 문자열을 찾고, 끝나지 않는 명령은 복사본에서 다시 돌리지 않습니다 (W5).
  • 완료 전 한 번의 확인 라운드 (W6/W7). 이 실행이 설치한 패키지를 가져오는 산출물, 요청이 이름 붙인 경로를 잃은 실행 중 서비스, 답변이 "잠정"·"미확인"으로 표시한 값(P5)은 완료 직전에 한 번 짚습니다. SNAILER_FIX_COMPLETION_ADVISORY=0, SNAILER_FIX_TENTATIVE_ADVISORY=0.
  • 잘못된 가설 선언이 명령 실행을 막지 않습니다 (W3a). 디버그 케이스 밖에서는 명령을 실행하고 결과에 한 줄 안내를 붙입니다. SNAILER_FIX_HYPOTHESES_ADVISORY=0.
  • 재시도하지 않은 일시 장애 뒤 산출물이 없으면 "있는 것을 쓰라"는 초안 턴을 한 번 줍니다 (P6). SNAILER_FIX_DRAFT_TURN=0.

새로 생긴 것

  • 그레이더 뷰. 요청문에서 검사 가능한 문장(달라질 수 있는 입력, 없어야 하는 것, 수치, 점수 기준, 구조, 산출물)을 시작 시 한 번 인용하고 각각을 검사하는 방법을 붙입니다. 마감 안내는 절반 지점에서 아직 없는 산출물을 이름으로 부릅니다. SNAILER_FIX_GRADER_VIEW=0.
  • 방법 도구 10개. 모델이 원칙으로만 알고 건너뛰던 절차를 호스트가 계산합니다. 호스트는 모델이 준 값으로만 계산하고 아무것도 결정하지 않습니다: convergence_check(Richardson 차수와 허용오차의 h*), relation_check(두 실행의 출력·파일·수치 비교), absence_check(모든 산출물에서 금지 문자열·정규식), boundary_sweep(매개변수 조합 전체 실행과 최악값), structure_scan(디렉터리의 import·호출·텍스트 스캔), fixed_point(수렴 반복), detection_limit(Currie L_C·L_D), gap_report(목표까지의 격차와 실현 가능성), spec_coverage(명세 규칙 대 테스트), case_ledger(케이스 상태와 부분 점수). 요청에 검사 가능한 조건이 있을 때만 모델의 기본 도구 집합에 더해 제공됩니다. SNAILER_FIX_METHOD_TOOLS=0.
  • SWE-bench Lite 공식 하네스 (swebench_lite/closiro/). 문제마다 SWE-bench 공식 Docker 이미지 안에서 closiro를 돌리고 공식 채점기로 바로 채점해 리더보드 제출 형식(all_preds.jsonl, logs/, trajs/)을 만듭니다. 병렬 워커, 재개, 이미지 정리, 제공자 429 시 자동 일시정지를 포함합니다. 실행 결과는 저장소에 넣지 않습니다.

확인한 것

  • 호스트 변경과 방법 도구는 단위 테스트로 확인했습니다(새 테스트 20 + 방법 도구 11 + 에이전트 3, 대상 모듈 351개 중 350 통과, 1개는 알려진 TUI 이벤트 버스 병렬 플레이크). 벤치마크로 다시 측정하지는 않았습니다. 변경의 근거가 된 측정은 2026-11-05 TB 2.1(21개)·TB 4.0(15개) 기록으로, 호스트가 죽인 프로세스가 전부 모델이 고른 마감이었다는 사실입니다.
  • SWE-bench Lite: 무작위 12문제 시범 실행에서 GPT-6 Astra(high)로 7/12 resolved(공식 채점, $25.99). 전체 300문제 실행은 진행 중이며 깨끗하게 끝난 104문제 기준 86 resolved입니다(django 비중이 커 전체 점수보다 높게 읽어야 함).

알아 둘 것

  • 스위치는 전부 환경 변수이며 기본은 켜짐입니다. 이전 동작이 필요하면 해당 SNAILER_FIX_*=0.
  • SWE-bench 하네스는 Docker Desktop(containerd 이미지 저장소)에서 --platform linux/amd64 이미지를 쓰므로 이미지 삭제는 ID로 강제 삭제해야 공간이 돌아오고, matplotlib 계열 이미지는 한 장 5–7 GB입니다. 하네스가 이를 처리하지만 VM 디스크 여유는 20 GB 이상 두는 것이 좋습니다.
  • 제공자 429(플랜 한도)의 영향을 받은 실행은 결과로 세지 않고 다시 돌립니다.

Closiro v2.46.1

Choose a tag to compare

@closedsi-engineering closedsi-engineering released this 02 Nov 21:05
d1bd0fd

Closiro v2.46.1

모델 사용량이 계정 사용량 미터(closiro.ai/account/usage, closiro usage)에 잡히지 않던 문제를 고쳤습니다. 이전 버전은 호출마다 이 컴퓨터의 원장에는 사용량을 적었지만, 서버는 그 사용 이벤트를 모두 거절하고 있었고 CLI는 그 거절을 보이지 않게 버렸습니다. 그래서 작업을 해도 미터가 0%로 남았습니다.

고친 것

  • 서버가 모델 호출 사용량을 받습니다. 사용 이벤트의 outcome 필드에 비용 근거를 넣어 보내서 서버가 모든 모델(Claude, GPT, Grok, Gemini)의 이벤트를 invalid_outcome으로 거절하고 있었습니다. 비용 근거는 이제 이 컴퓨터에만 남기고 서버에는 보내지 않습니다. 이전 버전이 보내지 못하고 남겨 둔 이벤트도 다시 보낼 때 같은 방식으로 정리됩니다.
  • ChatGPT 로그인으로 쓰는 GPT 사용량을 보냅니다. 이 경로는 사용 이벤트를 아예 만들지 않았습니다.
  • 사용량은 서버가 답할 때까지 디스크에 남습니다. 이전에는 다음 전송 때까지 메모리에만 있어서, 데몬의 실행이 끝나거나 앱이 데몬을 종료하면 사라질 수 있었습니다. 데몬은 시작할 때와 30초마다 남은 사용량을 보냅니다.

새로 생긴 것

  • closiro usage doctor: 모델별로 이 컴퓨터의 사용량, 서버에 보낸 것, 서버가 받은 것과 거절한 것(이유 포함), 아직 보내지 못한 것을 서버 미터와 나란히 보여 주고, 사용량이 어디서 멈추는지 한 줄로 알려 줍니다. --days N, --json.
  • 서버의 답은 설정 폴더의 usage-receipts.jsonl에, 마지막 전송 결과는 usage-flush-status.json에 남습니다. 서버가 거절한 이벤트는 경고 로그로 보입니다.

확인한 것

  • 실제 계정에서 grok-4.7과 gpt-6.1-sol로 짧은 작업을 돌려, 고치기 전에는 Grok 이벤트 4건이 모두 거절되고 GPT 이벤트는 0건이던 것이, 고친 뒤에는 7건 모두 접수되고 서버 미터가 0에서 올라가는 것을 확인했습니다.
  • 모델 목록의 모든 모델이 실제 엔드포인트의 응답 형식에서 가격이 붙은 사용 이벤트를 하나 만드는지 테스트로 확인합니다.

알아 둘 것

  • 이전 버전에서 서버가 이미 거절한 사용량은 다시 보내지 않으므로 미터에 소급되지 않습니다.
  • Claude는 이번에 실제 계정으로 확인하지 못했습니다. 같은 방식으로 이벤트를 만들기 때문에 같은 수정이 적용됩니다.

Closiro v2.46.0

Choose a tag to compare

@closedsi-engineering closedsi-engineering released this 02 Nov 05:22
d1bd0fd

Closiro v2.46.0

데몬에서 돌던 실행이 죽어도 지시 없이 이어 가고, 정해 둔 시각에 실행을 시작할 수 있습니다. 긴 대화는 한도에 닿기 전에 미리 접어 두고, 다중 에이전트 계획은 실행 전에 구조를 검사합니다. 크레딧 소진 안내와 로그인 코드 만료도 고쳤습니다. 벤치마크 프로필에서는 이번 변경이 모두 꺼져 있어 Terminal-Bench 조건은 그대로입니다.

죽은 실행 이어 가기 (데몬)

  • 데몬 대화는 도구 호출마다 실행 전 의도와 실행 후 결과를 저널에 남깁니다. 실행 중 데몬이 죽은 대화를 다시 열면 저널로 열린 호출을 닫습니다. 결과가 기록된 호출은 그 결과를 쓰고, 읽기 전용 호출은 다시 실행하고, 부작용이 있는데 시작된 호출은 "중단됨", 시작하지 않은 호출은 "실행 안 됨"으로 남깁니다. 그다음 원래 작업과 이어 가기 안내로 실행을 다시 시작합니다.
  • 죽기 전에 띄운 명령이 아직 돌고 있거나, 실행이 본 파일을 다른 사람이 바꿨거나, 자동 이어 가기가 두 번 연달아 있었으면 저절로 이어 가지 않고 사용자가 이어 가도록 저장만 합니다. 두 번째 자동 이어 가기도 죽으면 실패 기억에 남기고 다음 이어 가기에 한 줄 교훈을 붙입니다.
  • conversation.interrupted로 프로젝트의 죽은 대화 목록을 볼 수 있습니다. 한 번 실행하고 끝나는 CLI와 벤치마크 실행은 새로 기록하는 것이 없습니다.

예약 실행

  • closiro schedule add --at <시각> --budget <달러> "<작업>" (또는 --after <run-id>), list, cancel. 시각은 시간대를 포함해야 하고, 미래이며 30일 이내여야 합니다. 비용 상한은 필수입니다.
  • 데몬이 15초마다 확인해 때가 된 예약을 한 번만 시작합니다. 데몬이 다시 켜져도 같은 예약을 두 번 시작하지 않고, 실행 중 죽은 예약 실행은 위의 규칙으로 이어 갑니다. 2분 넘게 늦게 시작하면(컴퓨터 잠자기, 데몬 꺼짐) 결과에 그 사실을 적습니다.
  • 결과는 다음에 터미널에서 CLI를 열 때 한 번 보여 주고, macOS 알림으로도 알립니다. 실패한 예약은 같은 작업의 다음 예약에 한 줄 교훈을 붙입니다.

긴 대화 미리 접기

  • 1단계 접기를 한도보다 먼저 백그라운드에서 준비해 두고, 한도에 닿으면 그대로 바꿔 끼웁니다. 그사이 대화가 바뀌어 범위가 맞지 않으면 버리고 그 자리에서 접습니다. 모델 호출이 없어 비용이 들지 않습니다.
  • 접은 뒤에도 처음 메시지, 원래 작업과 완료 조건은 원문 그대로, 최근 메시지도 원문 그대로 남습니다. Claude 도구 호출과 결과의 짝을 깨지 않습니다.
  • SNAILER_EARLY_COMPACTION=off|sync|on.

기억 자동 떠올리기 (선택)

  • .snailer/settings.json에서 memory.auto_recall을 켜면, 입력과 내용어가 두 개 이상 겹치는 저장된 기억을 입력 바로 앞에 짧게 붙입니다(최대 5개, 1,500자). 기본값은 꺼짐입니다.
  • closiro memory remember <키> <내용>, forget <키>, list로 직접 기억을 저장합니다. 이어 간 대화에서 같은 기억을 두 번 붙이지 않습니다.

다중 에이전트 계획 검사

  • 작업을 나누기 전에 계획을 검사합니다. 순환, 순서 없이 같은 파일을 쓰는 두 노드(경로는 대소문자 무시 비교, macOS·Windows), 확인 단계가 없는 작업 노드, 동시 8개 초과, 깊이 2 초과를 잡습니다. 통과하지 못하면 최대 두 번 다시 계획하고, 그래도 안 되면 이유를 출력하고 에이전트 하나로 실행합니다.
  • 나누는 항목 수는 4~8개입니다. 3개 이하는 에이전트 하나로 실행합니다.

기본 스킬

  • 바이너리에 스킬 7개가 들어 있습니다: webapp-testing, security-audit, systematic-debugging, test-driven-development, golang-/python-/rust-testing. 프로젝트와 작업이 맞을 때만 읽습니다(웹 프로젝트, 버그 수정·실패 테스트, 테스트 작업의 언어). security-audit은 명시적으로 요청했을 때만, 예상 비용과 실행 비용 상한을 보여 준 뒤 읽습니다.
  • SNAILER_BUNDLED_SKILLS=off로 끌 수 있습니다. closiro skills validate-findings <findings.json>은 Node 없이 결과 파일을 검사합니다.

큰 데이터 출력 요약 (Headroom)

  • SNAILER_HEADROOM이 켜진 실행(debug-case)에서 길게 나온 CSV, JSON, JSON Lines, YAML 출력을 모양으로 줄여 보여 줍니다. CSV는 헤더, 앞쪽 행, 가운데 표본, 열마다 요약을 보여 줍니다. JSON·YAML은 구조와 배열 길이, 첫 두 항목과 마지막 항목을 보여 줍니다. 오류 줄과 마지막 8줄은 그대로 둡니다.
  • 원본은 .snailer/headroom/에 저장하고 결과에 경로를 적습니다. 다른 실행에서는 꺼져 있습니다.

크레딧과 로그인

  • 크레딧이 떨어졌을 때 "요청이 너무 많습니다"가 아니라 사용 한도 안내가 나옵니다. 업그레이드(closiro.ai/account/billing)와 크레딧 구매(closiro.ai/account/usage?topup=1)를 따로 고를 수 있습니다. 실행 중 크레딧 소진 안내와 /boost가 크레딧 구매 화면을 열고, 안내 문구는 화면 언어를 따릅니다.
  • 승인 전에 만료된 로그인 코드는 새 코드로 바꿔 다시 보여 줍니다(최대 다섯 번).

문서

  • README에 Terminal-Bench 점수 그래프를 넣었습니다.

Closiro v2.45.1

Choose a tag to compare

@closedsi-engineering closedsi-engineering released this 31 Oct 04:04
d1bd0fd

Closiro v2.45.1

v2.45.0의 변경을 실제 설치 파일과 함께 내보내는 릴리즈입니다. v2.45.0은 공개 릴리즈에 설치 파일이 올라가지 않아, npm으로 설치하면 바이너리를 내려받지 못했습니다. 코드는 v2.45.0과 같습니다.

v2.45.0에서 바뀐 것 (이번에 함께 나갑니다)

  • closiro login으로 계정을 연결합니다. closiro connect도 같은 동작을 하고, 기존 closiro --connect도 계속 동작합니다.
  • 기기 로그인 화면 제목이 **"Closiro Account • Device Login"**이고, 로그인 링크는 closiro.ai를 가리킵니다.
  • 계정이 없거나 로그인이 만료됐을 때의 안내가 closiro login을 알려 줍니다.
  • 화면 문구, 리뷰·리포트 제목, 명령 안내가 Closiro 이름을 쓰고, 계정·요금제·가입·문서 링크가 closiro.ai를 가리킵니다.
  • --auth-server closiro.ai처럼 closiro.ai를 인증 서버로 지정해도 연결됩니다.
  • 새 체크포인트는 [Closiro Checkpoint]로 기록합니다. 이전의 [Snailer Checkpoint]도 목록에 나오고 복구할 수 있습니다.

그대로인 것

  • 설정과 기록 위치(~/.snailer/, 프로젝트의 .snailer/), 환경 변수 이름(SNAILER_*), 기존 로그인은 그대로 씁니다.
  • 지원 메일은 team@snailer.ai입니다.

release

Choose a tag to compare

@closedsi-engineering closedsi-engineering released this 31 Oct 02:24
d1bd0fd

release2.45.0

Closiro v2.44.0

Choose a tag to compare

@closedsi-engineering closedsi-engineering released this 30 Oct 19:41
bd2d4a6

Closiro v2.44.0

긴 작업에서 모델 응답이 잘리거나 끊겨도 실행이 엉뚱하게 끝나지 않도록 응답 처리와 비용 예약을 다시 짰습니다. 모든 모델 호출은 실제로 보내는 요청을 기준으로 미리 예약하고, 다음 요청이 예산에 들어가지 않을 때 마무리를 시작합니다.

잘린 응답과 끊긴 스트림

  • 모델별 출력 한도를 정하고 기록합니다. 출력 한도에서 잘린 응답은 답으로 받아들이지 않고 복구합니다.
  • 생각만 하다 잘린 응답은 한도를 늘리지 않고 한 번만 다시 묻습니다. 추론 강도를 한 단계 낮추고(max→xhigh→high→medium→low) 호스트 메모를 붙입니다. 다음 요청은 원래 강도로 돌아갑니다. 같은 사건에서는 한 번만 복구하고, 끊긴 스트림이나 거절에는 쓰지 않습니다.
  • HTTP 200 뒤에 끊긴 스트림("error decoding response body")은 과금 여부를 알 수 없는 오류로 분류하고, 실행당 최대 3번 같은 모델에 다시 보냅니다(2초, 4초, 8초 뒤, 매번 비용 예약을 거칩니다).
  • 도구 결과는 항상 모델에 전달되거나 종료 기록에 남습니다. 모든 루프 종료에 사유가 붙습니다.

비용 예약과 마무리

  • 모든 호출을 보내는 요청 그대로 예약합니다. 입력 전체를 캐시 쓰기 가격(×1.25)으로, 출력은 요청에 실린 한도만큼 잡습니다. 이전 응답이 5분 넘게 스트리밍되어 캐시가 만료된 경우에도 상한을 넘지 않습니다.
  • 마무리는 다음 작업 요청이 한도째로 들어가지 않을 때 시작합니다. "가장 큰 호출 × 1.5" 규칙은 없앴습니다. 마무리는 턴 사이에서만 시작하며, 보고 요청에는 마무리 안내가 함께 실려 예약됩니다.
  • 보고 호출조차 들어가지 않으면 호스트가 실행 기록으로 보고서를 씁니다(바뀐 파일, 최근 명령과 결과, 남은 확인). 모델 호출은 하지 않습니다.
  • 결과 검토 호출의 비용을 작업 비용과 따로 기록합니다. 검토를 끝낼 수 없을 때는 코딩 모델에 할 수 없는 지시를 보내지 않고 verification_unavailable로 검증 없이 끝냅니다.

셸과 프로세스

  • 자식 프로세스가 많은 명령을 Interrupted로 멈추지 않습니다.
  • 셸 실행이 끝나기 전에 받은 쓰기 요청을 처리하고, 그 실행이 나중에 바꾼 파일을 알려 줍니다.
  • 다른 호출의 중단 신호에 서비스가 같이 멈추지 않습니다. 좀비만 남은 프로세스 그룹은 끝난 것으로 봅니다.

테스트를 요구하는 요청

  • 테스트를 쓰라는 요청이면 테스트 설계 의무가 생깁니다. 상태를 바꾸는 동작마다 여섯 가지(함께 바뀌는 상태, 반대 동작, 같은 동작 반복, 경계값, 중간 실패, 동시 요청)를 따져 시나리오를 만들고, .snailer/test_obligations.json에 시나리오별 테스트와 그 테스트가 잡아야 할 코드 변경(돌연변이)을 적습니다.
  • 호스트가 테스트가 정말 그 성질을 검사하는지 확인합니다. 적힌 테스트가 실제로 있는지, 테스트 명령이 지금 코드에서 통과하는지, 돌연변이마다 실패하는지 확인합니다. 돌연변이는 하나씩 적용하고 매번 원래대로 되돌립니다. 테스트가 잡지 못한 돌연변이가 있으면 작업이 끝나지 않은 것으로 봅니다. 예: 취소를 두 번 했을 때 인원이 두 번 줄어도 통과하는 테스트는 걸러집니다.
  • 테스트 폴더 변경이 금지된 요청이면 새 테스트를 다른 폴더에 두라고 안내합니다. SNAILER_TEST_OBLIGATIONS=0으로 끌 수 있습니다.

실행이 띄운 서버

  • 정리 책임자를 정한 실행 계약 아래에서는 에이전트가 계속 실행하겠다고 띄우고 준비를 확인한 서버를 요청 문구와 관계없이 넘깁니다. "set up a server on port 8080"처럼 "keep it running"이 없는 요청에서 준비된 서버를 종료 시 꺼 버리던 문제를 고쳤습니다(Terminal-Bench 2.1 네 과제). 계약이 없는 대화형 실행은 지금처럼 아무것도 남기지 않습니다.

명령 시간 제한

  • timeout_sec은 초 단위이고 최대 21,600초(6시간)입니다. 30000처럼 밀리초로 보이는 값은 실행하지 않고 "약 8.3시간입니다. 밀리초라면 30을 쓰세요"라고 알려 줍니다. 기본 시간(600초)에 멈춘 명령에는 그 사실과 다음 방법을 붙입니다.

벤치마크 프로필

SNAILER_PROFILE=benchmark(Terminal-Bench 어댑터가 켭니다)에서만 달라지는 동작입니다. 대화형 사용은 그대로입니다.

  • 채점용 과제에 필요 없는 도구(편집기 열기, 앱 마법사, 계획 모드, 워크트리, 리서치·기억 도구)를 빼고, 시스템 프롬프트 끝에 완료 점검표를 붙입니다.
  • 시간과 예산을 25% 넘게 남기고 "완료"하면 점검표를 확인하도록 실행을 이어갑니다. 최대 3번이고, 직전 이어가기에서 아무 작업도 하지 않았으면 멈추며, 다음 요청이 비용 상한 안에 들어갈 때만 합니다.
  • 수정 금지 조건 때문에 판단할 수 없는 명령이나 쓰기는 실행을 끝내지 않고 진행합니다. 보호 파일은 끝날 때 그대로 비교합니다. 결과 검토를 할 수 없을 때도 시간이 남아 있으면 점검표 이어가기로 넘어갑니다.
  • 모델이 작업 요청을 거절하면 격리된 벤치마크 환경이라는 사실을 덧붙여 한 번만 다시 묻습니다. 다시 거절하면 끝냅니다.
  • 시간의 50%, 75%, 90%에 남은 시간을 한 줄로 알립니다.
  • 생각만 하다 잘린 응답이 복구 뒤 또 나오면, 예산이 절반 넘게 남아 있을 때 실행당 한 번 더 복구합니다.

실행 종료 사유

  • 제공자 계정의 잔액·한도 부족("credit balance is too low", insufficient_quota)은 model_error가 아닌 provider_billing으로 끝납니다.

Terminal-Bench

  • 전체 실행 스크립트가 BENCH=4.0으로 Terminal-Bench 4.0을 돌립니다. GPU, 네트워크 없는 채점, 호스트보다 많은 CPU가 필요한 과제는 모델 호출 전에 빼고 0점으로 셉니다.
  • Harbor 어댑터가 verification_unavailable(종료 코드 3)을 채점하고, 과제의 skills_dir을 받아들이며, 과제당 비용 상한 없이 돌릴 수 있습니다.
  • 실행 스크립트: 크레딧이 떨어지면 새 시행을 멈추고 재실행 목록을 남깁니다. RESUME=<이전 실행 폴더>로 실행되지 않았거나 환경 문제로 끝난 과제만 같은 빌드로 다시 돌려 한 점수로 합칩니다. 시작 전에 Mac 50 GB, Docker 20 GB 여유를 확인하고, 실행 중 공간이 모자라거나 Docker가 응답하지 않으면 멈춥니다. 과제 이미지를 미리 받고, 환경 문제로 끝난 시행은 끝난 뒤 한 번 자동으로 다시 돌립니다. aarch64 빌드 스크립트를 추가했고, TB 2.1은 aarch64 빌드 없이 시작하지 않습니다.
  • 내부 1회 실행(Opus 5.5 high, 과제당 상한 없음): TB 2.1은 에이전트가 실제로 작업한 68과제 중 53개(77.9%), 89과제 전체 기준 59.6%입니다. 나머지 21개는 API 크레딧 소진(17)과 aarch64 빌드 없음(4)으로 실행되지 않았습니다. TB 4.0은 일부만 실행했습니다(23과제 중 7개 해결).

Closiro v2.43.0

Choose a tag to compare

@closedsi-engineering closedsi-engineering released this 28 Oct 01:55
bd2d4a6

Closiro v2.43.0

터미널에서 closiro만 치면 다시 코딩 에이전트가 뜹니다. 코딩 에이전트 모드에서 명령이 남긴 프로세스를 끝까지 추적해 정리하고, 요청에 적힌 수정 금지 조건을 작업 시작 시점의 파일 기준으로 판단하도록 바꿨습니다.

바뀐 실행 방법

  • closiro = 코딩 에이전트. 인자 없이 closiro를 실행하면 코딩 에이전트의 대화 화면이 열립니다(closiro agent와 같습니다). v2.38.0부터 이 자리에 있던 사건 작업 화면은 closiro debug를 인자 없이 실행하면 열립니다. 터미널이 아닐 때 closiro debug는 예전처럼 사용법을 출력합니다.

명령이 남긴 프로세스

  • 프로세스를 pid와 시작 시각으로 추적합니다(Linux /proc, macOS libproc). 재사용된 pid에 신호를 보내지 않습니다. Linux에서는 가디언이 subreaper가 되어, setsid나 이중 fork로 떨어져 나간 자손도 놓치지 않습니다.
  • 명령이 끝나면 아직 살아 있는 자손을 모두 멈추고 결과의 children_stopped에 이름을 남깁니다. 정리 확인(cleanup_confirmed)은 리더가 회수되고, 프로세스 그룹이 사라지고, 남은 소유 프로세스가 없을 때만 참입니다. 확인되지 않은 실행은 호스트가 5초 동안 다시 확인하며, 확인된 프로세스에만 신호를 보내고 시도를 모두 기록합니다.
  • 동작 변경: 일반 명령에서 &, nohup, setsid로 띄운 프로세스는 이제 명령이 끝날 때 함께 멈춥니다. 계속 떠 있어야 하는 서버는 bash_run의 background_policy: "service"와 준비 조건(readiness: 포트·확인 명령·시간 제한)으로 띄웁니다. 이번 실행이 띄운 프로세스가 그 포트를 듣고 있을 때만 준비된 것으로 봅니다.
  • 실행이 끝난 뒤 서비스 넘기기: 정리 책임자를 정한 실행 계약(SNAILER_HANDOFF_CONTRACT=harness)이 있고, 요청이 계속 실행을 원하며, 실행이 완료됐거나 예산·시간을 다 썼을 때만 준비된 서비스를 넘깁니다. 넘긴 기록은 .snailer/handoffs.json에 남습니다. 취소·실패·충돌한 실행은 아무것도 넘기지 않고, 서비스는 계약의 마감 시각을 넘기지 않습니다.

수정 금지 조건 읽기

  • 콜론 뒤 목록을 금지 대상으로 읽습니다. "Do not modify the following files:" 다음 목록이 대상이고, 빈 줄이나 목록이 아닌 줄에서 목록이 끝납니다. 그래서 이어지는 "Create solution.sql"은 금지 대상에 들어가지 않습니다.
  • 대상이 잘린 금지는 전체 금지로 읽지 않습니다. 모든 쓰기를 보류하고 묻습니다. "Do not modify."처럼 대상이 없는 문장은 그대로 전체 금지입니다.
  • "그 데이터베이스 파일" 같은 지칭은 작업 시작 때 있던 파일만 가리킵니다. 명사로 범위를 좁힙니다(database → *.db). 작업 중에 새로 만든 파일은 막지 않습니다.
  • "기존 파일"은 작업 시작 시점의 파일입니다. 작업이 만든 출력 파일은 다시 쓸 수 있고, 지웠다가 다시 쓴 보호 파일은 여전히 보호됩니다. mv/rm/touch/mkdir의 대상도 쓰기로 셉니다.
  • 조건을 모두 따져 봅니다. 거부가 질문보다 앞서고, 요청이 출력으로 지정한 파일을 동시에 보호하면 constraint_conflict로 알립니다. 쓰기 대상을 읽을 수 없는 명령은 나중에 확인할 수 있으면 실행하고, 확인할 수 없으면 보류합니다.
  • 대답할 사람이 없는 실행(--auto-approve 또는 비대화형)에서 결정할 수 없는 쓰기를 만나면 같은 질문을 반복하지 않고 constraint_unresolved로 한 번에 끝냅니다.
  • Terminal-Bench 2.1 시행 두 건(constraints-scheduling, query-optimize)에서 과제가 요구한 파일을 막던 오판을 고쳤습니다.

모델 응답 기록

  • 거부된 응답의 종료 사유를 tool_protocol_error 대신 provider_refusal, output_limit_reached, empty_response, unhandled_stop_reason으로 나눠 보여 줍니다. 실패 분류와 종료 코드(1)는 그대로입니다.
  • SNAILER_DUMP_RESPONSES를 켜면 response-outcomes.jsonl에 요청 ID, HTTP 상태, 스트림 완료 여부, stop_reason, 사용량을 남깁니다(본문은 가립니다).
  • --prompt 값이 -로 시작해도 받아들입니다.

Terminal-Bench 2.1

experiments/terminal-bench-21/에 공식 하니스(Harbor)용 어댑터와 리더보드 규칙(89과제 × 5회, 배수·자원 조정 없음, ATIF 궤적)에 맞춘 전체 실행 스크립트를 넣었습니다. v2.42.1로 89과제를 한 번씩 돌린 결과는 66/89(74.2%), $54.75입니다. 2.1 리더보드는 현재 커뮤니티 제출을 받지 않습니다.

Closiro v2.42.1

Choose a tag to compare

@closedsi-engineering closedsi-engineering released this 22 Oct 22:43
bd2d4a6

Closiro v2.42.1

디버그 사건의 정확도를 지키면서 비용을 줄이는 변경, 코딩 에이전트 모드의 쓰기 차단 오판 수정, Closiro Desktop의 fine-tune을 에이전트 쪽에서 쓰는 기능을 담았습니다.

r1hard 8과제 라이브 측정(claude-sonnet-5-5, 사건당 예산 $5, 비용 모드):

빌드 통과 거짓 검증 사건당 비용 사건당 시간
v2.42.0 (10-21) 7/8 1 $0.81 5.0분
이 릴리스 (10-22) 7/8 0 $1.03 6.4분

이 릴리스의 미통과 1건은 숨은 테스트 실패가 아니라 아래의 예산 배분 결함으로 멈춘 것이며, 이 릴리스에서 고쳤습니다(수정 후 미측정). 비용은 v2.42.0보다 높게 나왔습니다. 사건당 실행 수가 늘었기 때문인데, 과제당 한 번씩 잰 결과라 원인이 어느 변경인지는 가려지지 않았습니다. 측정 기록: experiments/r1hard-live/2026-10-18/feasibility.md §5k–§5p.

디버그 사건

  • 긴 명령 출력은 Headroom으로 압축합니다. 테스트·빌드 출력이 62줄을 넘으면, 대화 기록에 들어가기 전에 Headroom 로그 압축기(github.com/headroomlabs-ai/headroom, Apache-2.0)를 거칩니다. 마지막 62줄만 남기던 이전 방식과 달리 출력 전체에서 에러, 실패, 스택, 요약을 남깁니다. 압축기가 빠뜨린 실패 줄(Go의 --- FAIL 아래 메시지 등)은 원본에서 찾아 다시 붙입니다. 원본은 작업 폴더의 .snailer/headroom/에 저장되고, 압축마다 사건 폴더의 headroom.jsonl에 기록이 남습니다. 지난 측정의 실제 출력 240개로 비교하면 모델이 보는 분량이 57% 줄었습니다. 디버그 실행에서 기본으로 켜지고(SNAILER_HEADROOM=1), 다른 모드에서는 꺼져 있습니다.
  • 앞 단계로 돌아온 사건이 예산 부족으로 멈추지 않습니다. 조사 중 더 좁은 증상 기준을 제안하면 사건이 문제 확인 단계로 돌아가는데, 그 단계의 몫(사건 예산의 5%)을 이미 써 버려 멈추는 일이 있었습니다. 이제 이미 도달했던 단계까지의 몫을 씁니다.
  • 프롬프트에 인용된 단어가 쓰기를 막지 않습니다. 사건 프롬프트가 이전 실행의 보고("읽기 전용 지시를 어겼다")를 인용하면, 그 단어를 이번 실행의 금지로 읽어 테스트 파일을 쓰지 못하는 일이 있었습니다. 디버그 실행의 쓰기는 이제 호스트의 셸 범위가 정합니다.
  • 실행 간 캐시 접두사를 공유하도록 프롬프트 순서를 바꿨습니다. 고정 규칙과 호스트 명령을 앞에, 사건 기록을 뒤에 두고, 시스템 프롬프트에서 실행마다 다른 작업 트리 경로를 뺐습니다. 도구 호출 사이에 설명 글을 쓰지 말고, 독립적인 도구는 한 번에 부르라는 규칙도 넣었습니다.

모든 에이전트 실행

  • ponytail을 기본으로 적용합니다. github.com/DietrichGebert/ponytail(MIT)의 "가장 작고 완전한 변경" 규칙이 시스템 프롬프트의 고정 섹션에 들어갑니다. SNAILER_PONYTAIL=lite|full|ultra|off로 단계를 고르며, 기본은 full입니다.
  • 예외 목록을 허용 목록으로 읽습니다. "Do not modify files outside a.rs, b.rs", "a.rs 외의 파일은 수정하지 마", "Only edit a.rs" 같은 요청에서 이전에는 나열한 파일을 보호 대상으로 읽어, 고치라는 파일만 막고 나머지는 열어 두었습니다. 이제 나열한 경로만 쓸 수 있고, 나머지는 거부하면서 허용 목록을 알려 줍니다. 경로를 특정할 수 없는 예외("parser 모듈 밖")는 거부하지 않고 묻습니다.

Fine-tune

  • closiro finetune status|models|ask, MCP fine_tune_ask/fine_tune_status, 데몬 finetune.* 메서드로, Closiro Desktop이 이 Mac에서 서비스하는 fine-tune을 에이전트 쪽에서 씁니다(~/.snailer/finetune.json). 일이 fine-tune과 분명히 맞고 점수가 충분할 때만 로컬 모델이 명령을 쓰고, 아니면 클라우드 모델로 넘깁니다. 계약: docs/FINETUNE_ENDPOINT_CONTRACT.md.
  • 엔드포인트가 꺼져 있으면 ask가 앱과 같은 시작 절차로 서버를 켜고 다시 묻습니다. 이렇게 켠 서버는 명령이 끝나면 15초 안에 스스로 꺼집니다. CLOSIRO_FINETUNE_AUTOSTART=0으로 끕니다.

서드파티 고지

Headroom의 로그 압축기와 크기 조정기 두 파일을 src/aci/headroom_log/에 옮겨 왔습니다. headroom-core 크레이트 자체는 tree-sitter 0.27을 고정해서 요구해, 이 저장소의 tree-sitter와 함께 링크할 수 없습니다. ponytail의 SKILL.md는 src/agent/ponytail/에 라이선스와 함께 들어 있습니다. 고지는 THIRD-PARTY-NOTICES에 있습니다.

Closiro v2.42.0

Choose a tag to compare

@closedsi-engineering closedsi-engineering released this 21 Oct 17:36
bd2d4a6

Closiro v2.42.0

보이는 테스트만 통과한 수정안을 "검증 완료"로 닫던 문제를 고치고, 사건당 비용을 1/3로 줄였습니다. r1hard 8과제(숨은 수락 테스트가 운영 조건을 검사하는 과제) 라이브 측정, claude-sonnet-5-5:

빌드 통과 거짓 검증 사건당 비용 사건당 시간
v2.41.0 (기준선, 10-18) 2/8 5/8 — —
조건 게이트 (10-20) 11/12 1/12 $2.47 22분
비용 모드 (10-21) 8/8 0/8 $1.81 6.5분
이 릴리스 (10-21) 7/8 1/8 $0.81 5.0분

마지막 거짓 검증 1건은 아래 "관측은 결함과 지켜야 할 동작으로 나뉩니다"로 막았고, 그 변경은 아직 라이브로 재지 않았습니다. 측정 기록: experiments/r1hard-live/2026-10-18/feasibility.md.

원인별 조건 검증

  • 원인이 필요로 하는 조건을 전부 만드는 명령은 그 원인의 시험입니다. 노드가 워커 여러 개, Stop 없는 재시작, 시계 어긋남 같은 조건을 만드는 테스트를 돌리면 호스트가 판정합니다. 예전에는 증상 기준·개입 실험·텍스트 검색만 판정 대상이어서 "연결되지 않음"으로 거부했습니다. 만든 조건은 출력에 적힌 문구(created_shown_by)로 확인합니다.
  • 열린 원인마다 재현 테스트가 있어야 수정으로 넘어갑니다. 수정 근거가 생겨도, 다른 열린 원인에 repro --cause 테스트가 없으면 호스트가 "cover" 작업 트리에서 에이전트를 돌려 원인별 테스트를 쓰고 등록하게 합니다. 기준 코드에서 실패하는 테스트는 모든 수정안이 통과해야 하고, 모두 통과한 테스트는 "이 조건에서는 나타나지 않았습니다(배제 아님)"로 남습니다. 여러 테스트를 repro --many <spec.json>으로 한 번에 등록할 수 있습니다.
  • 증상을 줄인 개입 실험은 그 원인이 관여했다는 증거입니다. 실험 명세에 creates가 비어 있어도 29/29 → 0/29 같은 감소는 판정합니다. 기준 코드에서 실패하는 원인별 재현 테스트도 수정 근거가 됩니다.
  • 사람이 본 것마다 실패하는 테스트가 있어야 수정으로 넘어갑니다. 조사 시작 때 에이전트가 증상에서 관측 항목을 기록하고(closiro debug observables <id> "<본 것>" …), 재현 테스트를 등록할 때 단언하는 항목을 적습니다(repro … --observes O1,O2). 단언한다고 적은 관측은 기준 코드 실패 출력에 그 id가 있어야 인정됩니다.
  • 관측은 결함과 지켜야 할 동작으로 나뉩니다. 기본은 결함이고, 지켜야 할 동작은 기록할 때 --holds "<동작>"으로 적습니다. 결함 관측은 기준 코드에서 실패하는 등록 테스트만 덮고, 통과하는 테스트는 기록만 됩니다. 한 원인을 고친 뒤 "리포트가 에러 없이 성공한다"는 불평을 통과 테스트로 "결함 아님" 처리해 숨은 조건(중간에 끊긴 다운로드)이 그대로 남았던 구멍을 막습니다.
  • closiro debug check <id>: 증상 기준과 등록된 모든 테스트를 한 번에 돌려 ✓/✗로 보여 줍니다. 수정 실행은 테스트를 하나씩 돌리는 대신 이것을 씁니다.
  • 상태 화면과 결과에 원인별 재현 테스트, 관측 항목, 그 판정이 표시됩니다.

출발점 보고서

  • 조사와 수정 실행의 프롬프트에 호스트가 만든 <locate> 절이 들어갑니다: 첫 실패 출력의 스택 프레임, 증상의 조건 단어(워커·재시작·시계·타임아웃·캐시·배치 …), 최근 커밋, 읽은 파일에서 점수를 매긴 출발 위치 목록입니다. 모델 호출은 없고 closiro debug locate <id> [--json]으로 볼 수 있습니다. 켬/끔 비교에서 요청 −28%, 시간 −29%, 거짓 검증 0이었습니다. CLOSIRO_LOCATE=0으로 끕니다.

비용 모드와 속도 모드

  • --mode cost|speed. 빠진 원인·관측 테스트를 cost 모드는 한 실행이 차례로 쓰고(무료·Pro 기본), speed 모드는 노드가 동시에 씁니다(Team·Enterprise 기본). 동시 cover는 사건 시간을 22분에서 9분으로 줄였지만 노드마다 문맥을 다시 읽어 비용이 30% 늘었습니다.
  • 디버그 실행은 실행 끝의 의미 리뷰(SNAILER_OUTCOME_REVIEW=0)와 감독 브리프의 LLM 정제(SNAILER_SUP_BRIEF=off)를 끄고 돕니다. 사건의 판정은 호스트가 하므로 두 호출은 비용(합쳐 27%)만 냈습니다. 관측 마스킹은 기본으로 켜지 않습니다: 마스킹 한 번마다 캐시 접두사가 깨져 다음 요청이 문맥 전체를 다시 썼습니다. 사람이 환경 변수를 직접 주면 그 값이 우선합니다.
  • 디버그 실행의 프롬프트는 한 번만 보냅니다. 이전에는 사건 프롬프트(약 25k자)가 시스템 프롬프트의 task_brief, 사용자 메시지, 그 뒤의 task_brief 블록에 세 번 들어가 첫 요청이 26k 토큰을 캐시에 쓰고 모든 뒤 요청이 그만큼을 읽었습니다. 이제 첫 요청은 약 12k 토큰입니다(측정: 요청당 캐시 읽기 30–40k → 17–24k).
  • --max-runs 기본값이 고정 12회에서 예산 달러당 5회(최소 12)로 바뀌었습니다. 한 사건이 예산을 절반 남긴 채 실행 상한에서 멈춰 resume이 필요했습니다.
  • closiro debug view metrics <id>에 요청 수·출력·캐시 쓰기/읽기 토큰·비용·모델/도구 시간이 실행별로 나옵니다.

운영 결함 수정

  • 한 원인에 여러 재현 테스트를 유지합니다(두 번째 테스트가 첫 테스트를 밀어내 관측이 테스트를 잃던 문제).
  • 원인이 둘 이상 열려 있으면 같은 거부가 반복돼도 조사 파동이 이어집니다.
  • 수정안 실패로 조사에 돌아온 사건은 남은 예산을 쓸 수 있습니다(파동 몫에 막히지 않음).
  • 오케스트레이터는 열린 원인이 셋 이상일 때만 돕니다.

요금제

  • 사건 기본 모델 예산을 $3에서 $5로, 무료 요금제의 사건당 예산을 $1에서 $4로 올렸습니다. 서버가 보내는 debug_case_budget_cents가 있으면 그 값이 우선합니다.

Closiro v2.41.0

Choose a tag to compare

@closedsi-engineering closedsi-engineering released this 18 Oct 10:03
bd2d4a6

Closiro v2.41.0

디버깅 작업이 엉뚱한 이유로 수정안을 버리거나 예산을 헛되이 쓰던 문제를 고쳤고, 화면에 남아 있던 내부 표기를 쉬운 말로 바꿨습니다.

수정안 판정

  • 수정 전부터 실패하던 테스트는 탈락 사유가 아닙니다. 원래 코드와 수정안에서 기존 테스트를 돌린 출력을 비교해, 수정안이 새로 깬 테스트가 있을 때만 탈락시킵니다. 원래부터 실패하던 테스트만 실패하면 "수정 전부터 실패하던 N개만 실패"로 보여 줍니다. pytest, go test, cargo test, node --test(TAP), Jest·Vitest 출력을 읽습니다. 실패한 테스트 이름을 읽을 수 없으면 지금처럼 탈락이고, 왜 비교하지 못했는지 사유에 적습니다.
  • 수정안의 diff를 그대로 보관해, 마지막 줄이 빈 줄인 수정안을 반영할 때 git apply가 거부하던 문제를 고쳤습니다.

원인 찾기와 예산

  • 원인 후보와 그 반대 가설을 한 노드에서 같은 실험으로 확인합니다. 원인 세 개에 노드 여섯 개가 뜨던 일이 없어집니다.
  • 노드마다 최소 예산을 보장합니다. 노드가 첫 요청에 예산을 다 써서 실험 없이 끝나던 문제를 막습니다. 남은 예산으로 일부 노드만 돌릴 수 있으면 그만큼 먼저 돌리고 나머지는 다음 차례로 넘깁니다.
  • 연결에 실패해 보내지도 못한 요청은 비용 0으로 셉니다.
  • Sonnet 4.x와 Haiku 4.5의 캐시 비용을 실제 요금으로 셉니다. 예전에는 약 3.7배로 셌습니다.
  • 이미 있거나 이미 제안한 확인 방법을 다시 제안하지 않습니다.

화면

  • 원인 후보와 메모를 증상과 같은 언어로 씁니다.
  • 실행 기록 상세에 내부 표기(template_base, exit 1 · … ⏎ …) 대신 무엇을 돌렸고 어떻게 끝났는지를 쉬운 말로 보여 줍니다. 시각은 내 컴퓨터 시각입니다. 프로그램 출력은 "그대로"라고 표시해 보여 줍니다. Claude Code(MCP) 답변도 같은 말을 씁니다.