스캐폴드 작업(scaffold job)이 미완성 상태로 놓여 있을 때, 기차 터널이 노트북 연결을 몇 분 동안 끊었습니다. 에디터에는 아직 저장되지 않은 노트, 개인 환경 파일, 그리고 이전 라운드의 패치가 남아 있었습니다. 무료 원격 서버가 다른 로컬 재시도보다 저렴해 보였지만, 페이로드는 여전히 자격 증명 경로(credential path)를 지정하고 있었습니다. 누군가 지연 시간(latency)이나 0원 청구서(zero invoice)를 비교하기 전에 그 경로를 보호하는 것이 좌석 선택에 필수적이었습니다.
로컬 우선 배치(Local-first placement)는 작업 세트(working set)를 파일, 비밀 정보, 에디터 상태를 이미 가지고 있는 기계에 유지합니다. 하지만 페이로드가 비(非)비밀이고, 노트북의 열적 제약(thermally constrained)이 있으며, 연결 추정치가 정확하다면 클라우드 좌석도 여전히 승리할 수 있습니다. 운영자는 MonkeyCode를 오픈 소스 프로젝트라고 설명하며 무료 모델 접근과 무료 서버 옵션을 제시합니다.
공개 고지: 이 기사는 MonkeyCode의 제품 아웃리치(product outreach)의 일환으로 작성되었습니다.
이러한 가용성 참고 사항들은 토큰 상한선, 하드웨어 프로필, 리전(region), 또는 제공되는 혜택이 변하지 않을 것이라는 약속을 명시하지 않습니다. 실시간 숫자가 필요한 독자는 기본 페이지를 확인하기 전까지 모든 블로그 수치를 미검증으로 간주해야 합니다. 따라서 이 초안은 좌석 결정에 대해 가르치며, 할당 산술(allotment arithmetic)은 의도적으로 기사 본문 밖에 남겨둡니다. 제품 이름이 모두 제거되더라도 좌석 워크플로우는 로컬 우선 독자에게 여전히 유용합니다.
좌석 결정이 보호하는 것들
여기서 지연 시간(Latency)이란 도구 요청부터 검토 가능한 diff까지의 대기 시간을 의미하며, 여기에는 전송 및 사람의 일시 정지 시간이 포함됩니다. 원격 좌석은 뜨거운 노트북을 아껴줄 수 있지만, 연결이 끊어질 때 실패하는 왕복 경로를 추가합니다. 비밀 정보(Secrets)에는 토큰, 개인 키, 고객 샘플, 그리고 신규 게시되지 않은 패치 등이 포함되며, 이는 신뢰 경계(trust boundary)를 넘어서는 안 됩니다. 오프라인(Offline)이라는 것은 동일한 작업이 수면, 터널 손실 또는 제공되지 않는 서버 이후에도 재개되어야 함을 의미합니다.
무료 서버는 페이로드가 공개 스캐폴드(public scaffold)이고 링크가 전체 왕복 시간 동안 지속될 수 있을 때만 성공합니다. 청구서가 0으로 유지되더라도, 비밀 정보가 조금이라도 동반되는 순간 그 자리는 사라집니다. 무료 좌석을 기본 컴파일러로 취급하는 것은 로컬 우선(local-first) 작업에서 가장 중요한 실패를 숨깁니다. 그 실패란 업로드 완료 후 팀 누구도 기억할 수 없는 게시된 번들입니다.
5단계 좌석 워크플로우
1단계 — 작업 세트 목록화 (Inventory the working set)
첫 번째 단계는 원격 호출을 고려하기 전에 작업 세트를 목록화합니다. 해당 작업이 실제로 읽게 될 소스 파일, 환경 파일, 프롬프트 텍스트, 도구 출력을 나열합니다. 각 항목에 대해 파일 이름 추측보다는 리포지토리 정책을 사용하여 공개(public), 내부(internal), 또는 비밀(secret)로 표시합니다. 정확하고 완전한 결과를 위해 비밀 항목이 필요하다면 원격 경로를 중단시킵니다.
2단계 — 링크 및 열 예측 (Estimate the link and the heat)
두 번째 단계는 이미 파일을 보유하고 있는 노트북에서 링크와 열 예산을 추정합니다. 기기가 배터리 상태인지, 절전 모드(sleep)가 예상되는지, 그리고 마지막 유사한 이동이 너무 느꼈는지 기록합니다. 대기하는 동안 절전 모드나 터널 손실이 다음 이벤트로 예상된다면 작업을 로컬에 유지합니다. 무료 원격 좌석은 애초에 에디터에서 나간 적 없는 로컬 diff를 재구성할 수 없습니다.
3단계 — 스캐폴드 텍스트와 비밀 분리 (Split scaffold text from secrets)
세 번째 단계는 프롬프트가 조립되기 전에 스캐폴드 텍스트를 비밀을 포함하는 컨텍스트로부터 분리합니다. 스캐폴드 텍스트는 자격 증명이나 고객 샘플을 포함하지 않는 공개적인 보일러플레이트(boilerplate), 게시된 인터페이스, 테스트를 다룹니다. 비밀을 포함하는 컨텍스트에는 연결 문자열(connection strings), 개인 키(private keys), 고객 샘플, 그리고 아직 출시되지 않은 소스 패치 등이 포함됩니다. 이 분리가 끝난 후에도 원격 좌석이 고려되는 경우에만 스캐폴드 레인(scaffold lane)을 전송합니다.
4단계 — 분류기 레코드 (Record the classifier lane)
네 번째 단계에서는 다음 섹션의 로컬 분류기(local classifier)를 실행하고 그 결과를 작업 노트(job note)에 기록합니다. 라인이 remote_ok이고 검토자(reviewer)가 마스킹(redaction)을 확인한 경우에만 원격 좌석(remote seat)을 수락하십시오. 그렇지 않은 경우에는, 해당 루프가 더 느리더라도 모델 루프 또는 에디터 루프를 노트북에서 유지하십시오. 환경 파일, 새로운 픽스처(fixtures), 또는 조립된 프롬프트 텍스트를 수정하는 모든 편집 후에는 매니페스트(manifest)를 재분류하십시오.
5단계 — 적용 전 재생 (Replay before apply)
다섯 번째 단계는 어떤 hunk가 적용되기 전에 원격 결과(remote result)를 로컬 트리(local tree)에 대해 재생합니다. 대기하는 동안 로컬 트리가 변경되었다면 패치(patch)를 거부하십시오. 왜냐하면 오버랩(overlap)은 좌석 선택과는 별개의 결함이기 때문입니다. 나중에 검토할 때 해당 좌석이 허용된 이유를 알 수 있도록 분류 기록을 패치 옆에 저장하십시오. 녹색의 원격 응답(green remote response)을 로컬 재생 확인 단계를 건너뛰어도 된다는 권한으로 간주하지 마십시오.
라인 테이블 (Lane table)
아래 표는 라이브 플릿(live fleet)에서 수집된 벤치마크가 아니라 세 가지 라인에 대한 검토 제안입니다. 여기서는 모델, 토큰 제한, 지역, 서버 크기에 대한 사실을 명시하지 않았는데, 왜냐하면 그러한 사실들은 여기서 검증되지 않았기 때문입니다. 독자들은 현재 프로젝트 문서를 할당 및 하드웨어 주장의 유일한 출처로 간주해야 합니다. 이러한 숫자를 고정하는 블로그 노트는 공급업체 제안이 변경되는 주에는 틀릴 것입니다.
| 라인 | 지연 시간 압력 (Latency pressure) | 비밀 클래스 (Secret class) | 링크 가정 (Link assumption) | 좌석 (Seat) |
|---|
| local_required | 모든 경우 (Any) | 비밀 또는 알 수 없음 (Secret or unknown) | 모든 경우, 오프라인 포함 (Any, including offline) | 노트북 전용 (Laptop only) |
| ... | | | | |
드릴을 위한 로컬 분류기 (A local classifier for the drill)
아래 Python 샘플은 실행되지 않은 저장소 훅(repository hook)에 대한 제안이며, 공급업체 명령이 아닙니다. 원격 API를 호출하지 않으며, MonkeyCode 지연 시간이나 용량을 측정한다고 주장하지도 않습니다. 단지 운영자가 이미 충분히 신뢰하여 훅으로 입력할 수 있는 매니페스트만 분류합니다. 접미사 규칙(Suffix rules)은 정직한 인간의 비밀 레이블을 대체하는 것이 아니라 의도적인 안전장치입니다.
#!/usr/bin/env python3
"""제안된 로컬 좌석 분류기. 공급업체 CLI 아님. 미실행 샘플."""
...
샘플은 JSON을 출력한 후 항상 0으로 종료되므로, 프로세스 상태 대신 lane 필드를 읽는 확인 절차가 필요합니다. local_required에서 빌드에 실패하는 래퍼(wrapper)는 분류를 게이트(gate)로 만들 것이며, 이 초안에서는 이를 요구하지 않습니다. 게이트가 필요한 팀은 오탐(false-positive) 비용을 검토한 후 자체 래퍼에 해당 정책을 추가해야 합니다. 스크립트 자체는 리포터(reporter) 역할을 유지하므로, 노트북 드릴이 실수로 에디터 세션을 차단할 수 없습니다.
두 개의 피처와 명령어들
secret-leaning 피처는 manifest_secret.json에 속해야 하며, 해당 파일의 모든 저장된 값은 가상의 것이어야 합니다. 환경 파일 내의 내부 클래스는 소프트 레이블만으로 충분하다고 생각하는 검토자들을 위한 함정입니다. sleep 플래그와 불안정한 링크가 존재하는 이유는 피처가 여러 이유로 실패하도록 하기 위함입니다. 단일 이유의 피처는 나중에 드릴을 수행할 때 한 조건이 수정될 경우 논리 버그를 숨길 수 있습니다.
{
"files": [
{"path": "src/app.ts", "class": "public"},
...
대조적인 public 피처는 manifest_public.json에 배치하여 파일이 어떤 종류의 민감한 파일명도 포함하지 않도록 해야 합니다. 해당 파일의 모든 플래그는 제안된 훅(hook)이 특별한 케이스 없이 remote_ok에 도달할 수 있도록 설정되어 있습니다. 플래그 중 어느 하나를 변경해도 lane은 무료 서버에서 멀어지게 되어야 하며, 이것이 대조의 요점입니다. 팀원에게 드릴을 시연하는 동안 두 피처 모두에 실제 리포지토리 경로를 붙여넣지 마십시오.
{
"files": [
{"path": "src/app.ts", "class": "public"}
...
첫 번째 샘플 매니페스트는 환경 파일이 민감한 이름 규칙과 일치하기 때문에 local_required로 분류되어야 합니다. 내부(internal)라는 사람의 레이블은 이 제안된 local 훅 설계 내에서 해당 민감한 이름 규칙을 무효화하지 못합니다. 두 번째 매니페스트는 모든 플래그가 public 및 stable 케이스와 일치할 때만 remote_ok로 분류되어야 합니다. 이러한 확인 절차들은 의도된 훅 동작을 명시하며, 여기에서는 실제 서비스에 대해 실행되지 않았습니다.
임시 디렉터리를 생성하고 스크립트를 seat_classifier.py로 저장한 다음, 각 피처(fixture)를 고유한 이름으로 저장합니다. 아래 두 명령어를 실행하고 훅을 체크에 연결하기 전에 레인(lane)이 사양과 일치하는지 확인하십시오. 피처에는 실제 자격 증명(credentials)을 포함하지 말고, 파일 이름만 사용하여 스크립트에서 민감한 이름 규칙(sensitive-name rule)을 테스트합니다. 드릴 작업이 끝날 때 임시 디렉터리를 삭제하여 샘플 이름이 실시간 비밀 정보로 오인되지 않도록 합니다.
python3 seat_classifier.py manifest_secret.json
python3 seat_classifier.py manifest_public.json
src/app.ts가 공개(public)이고 .env.local이 서두른 리뷰어에 의해 내부(internal)로 표시된 매니페스트를 고려해 봅시다. 이름 규칙은 여전히 local_required를 강제합니다. 왜냐하면 내부 표시는 파일을 업로드할 수 있는 허가가 아니기 때문입니다. 이러한 결과는 의도적이며, 무료 서버가 항상 스캐폴드 작업(scaffold work)을 흡수해야 한다고 믿는 사람들을 짜증나게 할 것입니다. 이 짜증스러움은 짧은 공개 데모가 끝난 후 유출된 연결 문자열(connection string)을 설명하는 것보다 저렴합니다.
두 번째 실패는 노트북이 이미 터널에 진입한 후에 어제 stable_link를 복사할 때 발생합니다. 분류기(classifier)는 이 플래그를 신뢰하므로, stable_link를 설정한 사람이 그 주장의 정확성을 소유하게 됩니다. 훅은 네트워크를 핑(ping)하지 않는데, 성공적인 핑이 나중에 실패하는 업로드보다 앞설 수 있기 때문입니다. 이 플래그에 분류 실행과 같은 분에 촬영된 새로운 관찰 기록을 쌍으로 연결하십시오.
작업 노트가 포함해야 할 내용
각 분류 실행은 리뷰어가 모델 트랜스크립트(model transcript)를 열어보지 않고도 읽을 수 있는 짧은 노트를 남겨야 합니다. 레인, 매니페스트 해시, 시계 시간, 그리고 공개 스캐폴드 플래그를 설정한 사람을 기록하십시오. 노트가 나중에 티켓으로 복사될 수 있으므로 프롬프트 본문과 비밀 값(secret values)은 제외합니다. 노트가 누락되었다는 것은 디프(diff)가 그럴듯해 보이더라도 원격 결과(remote result)를 검토되지 않은 것으로 간주해야 함을 의미합니다.
무료 서버가 더 나은 자리가 되는 경우
무료 서버는 분류기(classifier)가 remote_ok를 반환하고 노트북이 부족한 자원일 때 더 나은 자리입니다. 공용 보일러플레이트, 긴 포맷팅 패스, 그리고 고객 데이터가 없는 테스트 스캐폴드(test scaffold)는 그 경로에 적합합니다. 현재 조건이 예상되는 좌석을 포함한다면, 유료 로컬 가속기 없이도 무료 모델 접근으로 해당 패스를 커버할 수 있습니다. 이점은 노트북이 이미 오늘 제공하는 것보다 더 넓은 신뢰 경계가 아니라 열과 비용입니다.
무료 서버는 작업에 결과를 깨뜨리지 않고 마스킹(redact) 할 수 없는 파일이 필요할 때 손해를 봅니다. 또한 터널이 실제 네트워크일 때, 또는 에디터가 트리를 계속 변경할 때는 손해를 봅니다. 팀이 조립된 프롬프트 텍스트를 업로드할 권한을 가진 사람의 이름을 지정할 수 없을 때도 다시 손해를 봅니다. 이러한 경우 느린 로컬 루프(local loop)가 당황스러운 엔지니어링 대체재가 아니라 올바른 결과입니다.
한계점 및 사용하지 말아야 할 팀
이 체크리스트는 임의의 바이너리 고정 장치(binary fixtures)나 이름이 변경된 데이터베이스 덤프 파일 안에 숨겨진 비밀을 발견하지 못합니다. 응답이 클라이언트로 돌아온 후 원격 제공업체가 아무것도 보유하지 않는다는 것을 증명하지도 않습니다. 페이로드에 규제되거나, 계약적이거나, 고객 소유의 데이터가 포함된 경우 법률 검토를 대체하지 못합니다. 이 체크리스트는 사람이 희망을 분류 결과로 취급하지 않고 공용 스캐폴드 플래그(public scaffold flag)를 설정할 수 있다고 가정합니다.
레이블링 작업을 수행할 인력이 없는 팀은 할 수 있을 때까지 모든 에이전트 루프를 노트북에서 유지해야 합니다. 보장된 용량 수치, 지정된 모델 또는 고정된 무료 기간이 필요한 사람은 다른 곳을 찾아봐야 합니다. 할당 크기(Allotment size), 하드웨어 및 기간은 오래되어졌고 주요 문서와 비교되지 않았기 때문에 생략되었습니다. 운영자는 사용 전에 현재 MonkeyCode 프로젝트 페이지를 열어 무료 모델 접근과 무료 서버 조건을 확인해야 합니다.