GitHub 저장소 도시에 · 커밋 고정 정적 분석

xfx — fx의 러스트 이식본을 코드로 확인한 기록

모델 카탈로그를 스스로 갖지 않기로 한 코딩 에이전트. 프로바이더를 로컬 데몬에 통째로 위임한 결과가 무엇을 가능하게 하고 무엇을 옮겨 놓는지, 고정된 커밋의 소스에서 확인한다.

대상 github.com/2lab-ai/xfx · 고정 커밋 f1913a6be24fcc0c8ade6c460686f89d231a4f37 · 캡처 2026-08-26 · 정적 전용(빌드·실행·설치 없음)

01 — 출처와 범위

이 문서가 무엇을 보고 무엇을 보지 않았는가

원본 URL
https://github.com/2lab-ai/xfx
정규 URL
https://github.com/2lab-ai/xfx
객체 종류
repository (저장소 루트) · 2lab-ai/xfx
요청 ref
not supplied
분석 ref
main (메타데이터가 확인한 기본 브랜치)
고정 커밋
f1913a6be24fcc0c8ade6c460686f89d231a4f37
루트 트리
be7fd420a1b4d0f8a6a075cbf6cc79998d869b94
해시 알고리즘
sha1
ref 드리프트
없음 — 캡처 시작·종료 시점의 main이 같은 커밋
캡처 구간 (UTC)
2026-08-26T03:58:02Z → 2026-08-26T04:06:25Z
저장소 공개 범위
public
수집 인증
authenticated (REST는 로컬 gh 자격으로 호출 · Git은 무인증 bare clone)
콘텐츠 민감도
clear
게시 판정
allow
동적 메타 기준시각
2026-08-26T04:06:25Z (별·이슈 상태 등 변하는 값)
수집 방법
GitHub REST 2022-11-28 · clone --bare --filter=blob:none · cat-file blob

이 저장소의 소유자는 이 문서를 요청한 사람 본인(Zhuge Hyuk / 2lab.ai)이다. 그 사실은 판정을 완화하는 근거가 되지 않는다 — 아래의 모든 결론은 고정 커밋의 파일과 줄에서만 나왔고, README를 포함한 저장소 텍스트는 사실이 아니라 주장으로만 취급했다.

02 — 읽기 전에

10분 안에 잡아야 할 그림

핵심 질문 하나. 코딩 에이전트가 "어떤 모델을 쓸 수 있는가"를 자기 코드에서 지우면 무엇이 남는가?

멘탈 모델. xfx는 모델 목록을 모른다. 그 자리에 Provider 추상화 하나와 백엔드 두 개만 있다 — Vercel AI Gateway(기본), 그리고 이 기계의 loopback에서 도는 llmux 데몬. llmux를 고르면 xfx가 아는 것은 GET /models가 돌려준 배열뿐이고, 어떤 모델이 거기 있는지는 xfx 밖에서 결정된다. 그래서 "claude·gpt·grok을 쓸 수 있다"는 xfx의 기능이 아니라 xfx가 포기한 결정의 결과다.

선행 개념(모르면 막히는 것만). ① Anthropic Messages 와이어 — llmux 백엔드가 말하는 프로토콜. ② loopback 전용 엔드포인트 정책 — 자격증명이 없기 때문에 원격이 금지된다는 역방향 논리. ③ 프로파일 전용 키(profile-only) — 공유되는 저장소 파일이 모델·권한·엔드포인트를 바꾸지 못하게 하는 설정 계층.

읽기 순서. 10분이면 03(판단) → 04(구현) 두 절. 30분이면 05(아키텍처) → 09(위험)까지. 기여자라면 11(주장 원장) → 13(수집 한계)에서 이 문서가 보지 않은 것을 먼저 확인하라.

다 읽고 답할 수 있어야 하는 세 가지

  1. xfx의 컴파일된 기본 모델은 무엇이고, 그것이 llmux 카탈로그와 만나면 어떤 규칙으로 바뀌는가?
  2. README가 "없다"고 적은 기능 중 고정 커밋의 코드에 실제로 존재하는 것은 무엇이며, 프로젝트는 그 충돌을 어떤 규칙으로 해소하기로 했는가?
  3. llmux 백엔드에서 자격증명이 새지 않는 이유와, 그럼에도 디스크에 평문으로 남는 것은 무엇인가?
03 — 채택 판단

한 문장과, 그 문장을 지탱하는 등급

한 문장. xfx는 upstream fx의 "짐을 지는 루프"만 러스트로 다시 만든 5일 된 단독 실험이며, 모델 선택이라는 결정을 로컬 llmux 데몬에 통째로 넘긴 대가로 키 없는 loopback 실행을 얻었다 — 도구로 채택할 물건이 아니라, 설계 결정 하나를 읽으러 갈 물건이다.

맞는 경우
이미 llmux 데몬이 도는 기계에서 터미널 코딩 에이전트를 키 없이 돌려보고 싶을 때. 러스트로 쓴 에이전트 루프·권한 정책·세션 저널의 실물 구현을 읽고 싶을 때.
맞지 않는 경우
업무 도구가 필요할 때(5일 이력, 기여자 1명, 외부 리뷰 0건). Windows. MCP·스킬·서브에이전트·이미지가 필요할 때 — docs/parity.md에 39행이 deferred로 적혀 있다.
성숙도
실험 단계. 안정 태그는 v0.1.0 하나(2026-08-24), 프리뷰 프리릴리스 8개.
유지보수
측정 불가. 저장소 생성 2026-08-21, 캡처 시점 5일차, 기여자 1명(125커밋), PR 10건 전부 같은 계정이 열고 머지, 비저자 응답 0건.
채택 준비도
읽기·실험 목적 한정. 프로덕션 채택의 전제(외부 리뷰·응답 이력·OS 샌드박스) 중 어느 것도 존재하지 않는다.
Evidence trustB
Implementation confidencemedium
Runtime confidenceunknown
Maintenance coveragelow
Security / privacy confidencemedium

등급 근거. B — 불변 신원(커밋·트리 고정)과 완전한 인벤토리(132엔트리, truncated=false)를 확보했고, 문서·매니페스트·소스·테스트·CI를 대표 표본으로 30파일 16,878줄 읽었으며, 모든 출처에 재현 가능한 해시가 있고, 실행 주장을 하나도 하지 않았다. A가 아닌 이유는 명확하다: src/tui 24개 모듈 중 22개, 테스트 8개 중 6개, src/session/store.rs(103 KB)를 열지 않았다. runtime은 아무것도 빌드·실행하지 않았으므로 정의상 unknown이다.

요청자가 말한 다섯 가지를 코드에 대조하면

요청자 진술(USER claim)과 고정 커밋의 정적 증거
요청자 진술정적 판정실제로 코드가 말하는 것
Vercel fx의 러스트 포팅이다supportedupstream vercel-labs/fx@580a0c5d에 핀된 독립 재구현. Zig 소스는 복사하지 않았다고 UPSTREAM.md가 명시하고, src/config.rs:30-32는 기본 모델의 근거로 upstream 파일·줄을 인용한다.
모델 프로바이더는 2lab-ai/llmux다partially-supportedllmux는 둘 중 하나다. src/provider/mod.rs:101-110ProviderId::ALL = [Gateway, Llmux]이고 컴파일된 기본값은 Gateway다(:171-173). llmux는 xfx setup llmux가 프로파일에 기록해야 켜진다.
claude(Agent SDK)·gpt-5.6-sol·grok-4.6를 모두 쓸 수 있다partially-supported쓸 수 있는 모델 목록에 해당하는 상수나 배열이 xfx에 없다(README도 없는 기능으로 적는다). grok·claude 문자열 자체는 선택한 30파일 중 8개에 있지만 전부 목록이 아니다 — 이 빌드에서 도달 불가라고 주석이 못 박은 와이어 태그(src/provider/mod.rs:33,48), 테스트 픽스처(src/provider/model.rs:510-513), 문서·주석(src/cli.rs:309)이다. 카탈로그는 GET {base}/models 응답이 유일한 출처다(src/llmux/setup.rs:246-249). 즉 이 주장은 xfx가 아니라 llmux의 속성이다.
OpenRouter의 ox alpha 무료 모델을 디폴트로 쓸 수 있다partially-supportedopenrouter·ox 문자열 0건. xfx의 컴파일 기본 모델은 zai/glm-5.2다(src/config.rs:32). 임의 모델이 디폴트가 되는 경로는 정확히 하나 — 설정된 모델이 데몬 카탈로그에 없으면 catalog.first()가 그대로 채택된다(src/llmux/setup.rs:282-289). 무엇이 first인지는 llmux가 정한다.
경량 fx가 훌륭해서 필요한 기능을 넣어 실험적으로 쓰려 한다supportedREADME가 스스로 "Experimental"이라 적고, Cargo.toml:9publish = false다. 원장 분포는 implemented 48 / partial 6 / deferred 39 — 기능 동등이 아니라 선별 이식이라는 진술과 일치한다.
04 — 실제로 구현된 것

진입점부터 핵심 경로까지, 줄에 고정해서

이 절이 이 문서의 지면 대부분을 쓴다. README는 주장이고 코드가 사실이므로, 아래 각 항목은 고정 커밋의 permalink로 확인할 수 있다.

상태 구분

verified
백엔드는 정확히 두 개src/provider/mod.rs:101-110. 와이어는 각각 Wire::VercelGatewayWire::AnthropicMessages로 갈린다(:164-165).
verified
모델 카탈로그가 없다 — 선택한 30파일 전체에서 모델 이름 상수는 DEFAULT_MODEL = "zai/glm-5.2" 하나뿐이며, 그 주석 자체가 upstream src/builtins/gateway.zig:40과 맞춘 값이라고 적는다: src/config.rs:30-32.
verified
모델 선택 규칙은 두 줄로 끝난다 — 설정된 모델이 데몬 카탈로그에 id나 alias로 있으면 유지, 없으면 catalog.first(): src/llmux/setup.rs:275-290. 이 한 함수가 "어떤 모델이 디폴트가 되는가"의 전부다.
verified
데몬 신원 확인이 설정 기록보다 먼저다GET /가 정확히 llmux를 답하고 GET /models가 비어 있지 않은 카탈로그를 답해야 한 글자라도 기록한다: src/llmux/setup.rs:232-261. 완성(completion) 요청은 보내지 않는다.
verified
원격 llmux는 https라도 거부된다 — 엔드포인트 정책이 EndpointPolicy::LoopbackService이고, 주석이 그 이유를 역방향으로 적는다. 자격증명이 없으므로 TLS가 대체재가 되지 못한다: src/llmux/mod.rs:70-79. 기본 주소는 http://127.0.0.1:3456(:42).
verified
llmux 설정 파일에서 한 필드만 읽는다proxy.port를 파싱하고 문서를 버린다. 그 파일에 OAuth 토큰과 admin key가 같이 있기 때문이라고 주석이 밝힌다: src/llmux/setup.rs:292-311.
verified
포트 후보는 3개로 닫혀 있다 — 이전 setup이 기록한 url, 기본 loopback 포트, llmux 설정의 포트. 주석이 이유를 적는다: 범위를 훑으면 포트 스캔이고, 이 기계 밖을 시도하면 아무도 요청하지 않은 곳으로 프롬프트가 간다(src/llmux/setup.rs:196-230).
verified
모델·권한·엔드포인트는 프로파일 전용PROFILE_ONLY_KEYSbackend·credential_source·llmux_url·model·models·permission_mode가 들어 있다(src/config.rs:86-94). 클론한 저장소가 프롬프트의 목적지를 바꾸는 경로를 구조적으로 끊는다.
verified
턴 예산은 모델 호출 직전에 확인된다 — 루프 재진입 지점에서 allows_step이 실패하면 TurnError::StepLimit으로 끝난다(src/agent/machine.rs:368-378). 진입점은 run_turn(:185)과 세션을 남기는 run_turn_saved(:194) 둘.
partial
전체화면 TUI — README는 "없는 기능"으로 적지만 코드에 있다. src/main.rs:21-24tui::should_run을 검사해 런타임 밖에서 run_blocking으로 빠지고, 조건은 bare xfx + XFX_TUI=1 + 양쪽 터미널이다(src/tui/mod.rs:54-66). 원장은 이것을 partial로 적고, 대체 화면(\x1b[?1049h)은 절대 쓰지 않는다고 명시한다. 아래 충돌 항목 참조.
claimed
세션 저널의 평문 경계 — 도구가 읽은 파일 내용과 명령 출력이 ~/.xfx/sessions/<id>/events.jsonl에 0600 평문으로 그대로 쓰인다는 것은 README의 자기 불리한 진술이다. src/session/store.rs(103 KB)는 파일 상한 때문에 열지 않았으므로 코드 확증은 이 캡처에 없다.
claimed
도구 8종과 슬래시 명령 6개list_files·glob_files·grep_files·read_file·write_file·edit_file·create_folder·terminal. src/cli.rs:51ADVERTISED_ENTRYPOINTS가 파서가 광고하는 표면의 단일 출처지만, 도구 스키마 본체(src/tools/spec.rs)는 선택하지 않았다.
roadmap
deferred 39행 — Vercel login/logout, Codex OAuth, 모델 카탈로그·프로바이더 전환, ACP, MCP, 스킬, 서브에이전트, 웹 도구, 백그라운드 터미널, 이미지·비전, replay, 사용량·크레딧, 업데이터, WASM, N-API. 원장은 각 행에 upstream 파일·줄을 근거로 붙인다.
unknown
게이트가 실제로 통과하는지scripts/check-no-stubs.sh(292줄)와 tests/parity.rs(919줄)는 존재하고 .github/workflows/ci.yml이 호출한다. 존재는 구성의 증거이지 통과의 증거가 아니며, 이 캡처는 아무것도 실행하지 않았다.

README와 코드가 어긋나는 지점

README의 "Deliberately, and completely — these produce an error, never a quiet no-op" 목록에 a full-screen TUI가 들어 있다. 고정 커밋에는 src/tui/ 아래 24개 모듈, 약 1.0 MB가 있고 XFX_TUI=1로 진입한다. 그리고 이 커밋의 메시지 자체가 Merge pull request #18 from 2lab-ai/plan/tui-phase1이다.

어느 쪽이 이기는지는 프로젝트가 미리 정해 뒀다 — README가 스스로 "이 파일의 주장이 docs/parity.md와 어긋나면 원장이 옳고, 원장이 코드와 어긋나면 코드가 옳으며 두 문서가 버그다"라고 적는다. 원장은 이 항목을 partial로, "opt-in이며 upstream보다 좁다"로 적고 있다. 즉 규칙상 해소는 되지만, README 본문은 스냅샷 시점에 stale하다. 열린 이슈 #15(README profile docs still describe backend/model only)가 같은 계열의 문서 부채다.

이 충돌을 여기 남겨 두는 이유는 코드가 자동으로 이기기 때문이 아니라, 세 출처가 서로 다른 것을 말하고 있다는 사실 자체가 채택 판단의 재료이기 때문이다. "광고한 것은 반드시 구현돼 있다"를 CI로 강제하는 프로젝트에서 README가 5일 만에 뒤처졌다면, 강제되는 것은 원장과 바이너리 사이일 뿐 README와 원장 사이는 아니라는 뜻이다.

05 — 아키텍처와 실행 흐름

바이트가 어디서 들어와 어디서 나가는가

모듈 지도는 src/lib.rs:25-39가 그대로 선언한다: agent · app · cli · config · gateway · interactive · llmux · output · permission · provider · session · tools · tui · workspace. 이름이 곧 층이다.

1
진입src/main.rs:16-41. 인자를 파싱하고, TUI 분기를 먼저 검사한 뒤(런타임 밖에서 메인 스레드를 점유해야 하므로), current-thread 토키오 런타임 하나를 세워 app::run(cli)로 넘긴다. 명령이 처리되는 곳은 app::run 하나뿐이라고 파일 상단 주석이 못 박는다.
2
설정 해석src/config.rs. 프로젝트 .xfx.json~/.xfx/settings.json → 그 파일의 workspaces["<root>"] 항목 → 환경변수(XFX_MODEL·XFX_PERMISSION_MODE·XFX_MAX_AGENT_STEPS) 순으로 키 단위 덮어쓰기. 프로파일 전용 키는 이 사슬의 첫 층에서 걸러진다.
3
프로바이더 결정src/provider/mod.rs:254-275. Gateway면 환경의 bearer 자격증명을, Llmux면 CredentialSource::LlmuxLoopback을 해석한다. 자격증명 해석은 I/O를 하지 않는다 — 그래야 statusdoctor가 아무것도 만들지 않고 실행될 수 있다.
4
턴 실행src/agent/machine.rsTurnMachine. 스트리밍 어시스턴트 텍스트, 로컬에서 실행되는 도구 호출, 그리고 정확히 하나의 종료 이벤트. 루프 재진입마다 스텝 예산을 확인한다.
5
도구 권한src/permission/policy.rs:566 decide()가 제안된 액션 하나에 판정을 내리고, yolo:509-548에서 검사 없이 통과시킨다. 이것은 액션 승인이지 프로세스 격리가 아니다.
6
바깥으로 나가는 바이트 — 두 곳뿐. Gateway는 https://ai-gateway.vercel.sh/v3/ai/language-model(src/gateway/mod.rs:38), llmux는 http://127.0.0.1:<port>/v1/messages. 두 llmux 클라이언트 모두 HTTP_PROXY/ALL_PROXY를 무시한다 — 같은 이유(자격증명이 없는 요청이 기계를 떠나면 안 된다)에서다.

문서가 말하는 것과 코드가 말하는 것의 차이

docs/architecture.md(201줄)는 "The shape → One ask, end to end → Session log design and replay fidelity → One band at the bottom of the screen → One shell prompt → What is deliberately not here → Testing model" 순으로 같은 흐름을 서술한다. 흥미로운 것은 이 문서에 이미 화면 하단의 밴드셸 프롬프트 절이 있다는 점이다 — 아키텍처 문서는 TUI를 전제하고 있고, README만 그것을 없는 것으로 적고 있다.

06 — 설치와 첫 성공

실행하지 않고, 프로젝트가 쓴 명령 그대로

이 절의 모든 명령은 이 캡처에서 실행되지 않았다. 프로젝트가 저작한 문자열을 그대로 인용한 것이며, 동작 확인이 아니다.

전제

commands — not run
brew install 2lab-ai/tap/xfx           # 안정 채널
brew install 2lab-ai/tap/xfx-preview   # 프리뷰 채널 (설치되는 실행 파일 이름은 xfx)

# 소스에서
git clone https://github.com/2lab-ai/xfx
cd xfx
cargo build --locked --release
./target/release/xfx --version
commands — not run
# llmux 백엔드로 전환 (완성 요청을 보내지 않으므로 비용 0)
xfx setup llmux
xfx setup llmux --url http://127.0.0.1:3456

# 첫 질문
export AI_GATEWAY_API_KEY=...
xfx ask "what does src/agent/machine.rs do"
xfx ask --auto --json "add a doc comment to the run_turn function"

# 무엇으로 해석됐는지 확인 (자격증명 없이, 아무것도 만들지 않고)
xfx status --json
xfx doctor --json

성공 신호

xfx status --json{"build_channel":"preview","build_revision":"<12자리>"} 형태로 채널과 커밋을 답하면 바이너리가 어느 소스에서 나왔는지 되짚을 수 있다. llmux 전환이 성공하면 status의 인증 필드가 변수 이름 대신 llmux-keyless-loopback을 답한다 — 이름 자체가 "보낼 자격증명이 없다"는 사실의 표시다.

되돌리기

brew uninstall xfx 또는 brew uninstall xfx-preview. 두 채널은 같은 bin/xfx를 설치하므로 한 번에 하나만 둘 수 있다. 프로파일 홈은 ~/.xfx이고 프로젝트 파일은 .xfx.json이라, upstream fx 설치를 가리거나 망가뜨리지 않는다.

비실행 영수증. 이 캡처에서 checkout·worktree·의존성 설치·빌드·테스트·실행·컨테이너·훅·서브모듈·LFS·필터·textconv 전부 no다. 따라서 위 명령의 결과에 대해 이 문서는 아무 관찰도 갖고 있지 않다.

07 — 권장 읽기 순서

목적별로 다른 진입점

역할별 읽기 경로와 근거
역할순서이유 / 예상 시간
사용자README.mddocs/parity.md의 Status values 절무엇을 기대하면 안 되는지가 먼저다. 원장의 상태 정의 세 줄이 README 전체보다 정보량이 크다. 15분.
운영자src/config.rs (설정 층) → src/llmux/setup.rssrc/llmux/mod.rs프롬프트가 어디로 가는지, 무엇이 그 목적지를 바꿀 수 있는지가 운영 위험의 전부다. 40분.
기여자src/main.rssrc/lib.rsdocs/architecture.mdsrc/agent/machine.rsCONTRIBUTING.md모듈 이름이 층이고, 진입점이 하나이므로 위에서 아래로 한 번에 읽힌다. 2시간.
보안 검토자src/permission/policy.rssrc/permission/command.rssrc/llmux/mod.rs의 엔드포인트 정책 → scripts/check-no-secrets.sh권한 모드가 무엇을 시작하도록 허락하는지, 그리고 시작된 뒤에는 아무 제약이 없다는 사실이 핵심이다. 1시간.
08 — 활동과 릴리스

5일치 표본이 말할 수 있는 것과 없는 것

저장소 생성은 2026-08-21T16:55:23Z, 고정 커밋은 2026-08-25T22:14:33Z. 캡처 시점 5일차다. 아래 수치는 전부 5일 표본이며, 어떤 것도 일반화되지 않는다.

132
고정 트리 엔트리 (truncated=false)
48 / 6 / 39
parity 원장 implemented / partial / deferred
1 + 8
안정 릴리스 v0.1.0 + 프리뷰 프리릴리스
10 / 10
PR 머지 — 전부 동일 계정
1
기여자 (icedac, 125커밋)
0
비저자 인간 응답

릴리스와 태그는 다른 계열이다

발행 릴리스 9건 중 안정은 v0.1.0(2026-08-24T03:21:02Z) 하나이고, 나머지 8건은 preview-<날짜>-<시각>-<run>-<attempt>-<sha12> 형식의 프리릴리스다. 최신 프리뷰 태그는 이름에 f1913a6be24f를 담고 있어 고정 커밋과 바이트 단위로 이어진다. 안정 태그는 타깃별 아카이브 4종과 각각의 .sha256, 그리고 넷을 덮는 SHA256SUMS를 함께 낸다. 프리뷰는 평평한 실행 파일 4종과 SHA256SUMS 하나다.

CI는 이력이지 관찰이 아니다

고정 커밋에서 CIPreview 두 워크플로가 push 이벤트로 돌아 둘 다 success로 끝났다(2026-08-25T22:14:37Z). 최근 20건 표본은 success 13 · failure 4 · cancelled 3이고, 실패 4건은 모두 2026-08-25의 TUI 작업 PR에서 나왔다가 같은 날 성공으로 수렴했다. 이 문서는 어떤 워크플로도 실행하지 않았다.

응답성은 측정할 수 없다

이슈 9건(열림 8, 닫힘 1)은 전부 소유자가 자기 백로그로 등록했고 코멘트가 0건이다. 따라서 "첫 비저자 인간 응답까지의 시간"은 느리다가 아니라 측정 대상이 존재하지 않는다. PR 머지 비율 10/10도 외부 리뷰 처리량이 아니라 자기 리뷰 워크플로를 재는 숫자다. 기여 집중도 100%는 기여 횟수 편중이며, 이것을 bus factor라고 부르지 않는다 — 조직적 연속성은 측정하지 않았다.

커뮤니티 파일

community profile health 62%. README·LICENSE·CONTRIBUTING 있음, code of conduct·이슈 템플릿·PR 템플릿 없음. 별 0 · 포크 0 — 관심 신호일 뿐 건강도가 아니다.

09 — 보안·프라이버시·공급망

구성과 이력과 알 수 없는 것을 섞지 않기

가장 중요한 한 가지

OS 샌드박스가 없다. 프로젝트가 status에서 sandbox=none이라고 보고하는 이유는 그것이 사실이기 때문이다. xfx가 실행하기로 동의한 명령은 사용자의 권한·환경·네트워크로 돈다. 권한 모드는 xfx가 무엇을 시작하는 데 동의하는가를 정하고, 시작된 프로세스가 그다음에 무엇을 하는지는 제약하지 못한다. src/permission/policy.rs:509-548에서 yolo가 검사 없이 통과하는 것이 그 구조를 가장 짧게 보여 준다.

자격증명과 평문의 비대칭

Gateway 자격증명은 환경에서 읽혀 한 엔드포인트로 나가고 세션 산출물에 쓰이지 않는다. llmux 백엔드에서는 애초에 보낼 것이 없다 — 요청 헤더가 자격증명을 실을 수 없다는 것을 src/llmux/mod.rs:250의 테스트 no_request_header_can_carry_a_credential이 지킨다. 그런데 모델이 읽은 것은 다른 문제다. 도구가 돌려준 파일 내용과 명령 출력은 세션 로그에 그대로 남는다고 프로젝트가 스스로 적는다. 이 진술의 코드 확증은 이 캡처에 없다(src/session/store.rs 미열람) — 하지만 자기에게 불리한 방향의 진술이라는 점은 기록해 둘 만하다.

공급망

알 수 없는 것 (0이 아니라 unknown)

10 — 라이선스와 채택 조건

Apache-2.0, 그리고 두 개의 저작권 표기

고정 커밋의 LICENSE 블롭은 Apache License 2.0 전문이고, 부록의 저작권 줄에 Copyright 2025 Vercel, Inc.Copyright 2026 2lab.ai가 나란히 있다(LICENSE:179-180). GitHub의 라이선스 감지도 Apache-2.0으로 일치한다.

루트 NOTICE는 한 가지를 분명히 한다: "No fx source is bundled in this product. What follows is attribution for the upstream work xfx was specified from, not a notice of included software." 즉 이 NOTICE는 포함된 소프트웨어의 고지가 아니라 사양의 출처에 대한 귀속이다. 파생 작업을 만들 때 이 구분을 그대로 옮기는 것이 안전하다.

의무

이 문서의 재생산 처리

저장소 루트 README는 완역 대상이 아니다(소스가 사실이고 README는 주장이라는 원칙). 위 본문에 인용된 README 문장은 주장을 식별하기 위한 짧은 발췌이며, 나머지 지면은 코드 실증에 배정했다. 저장소 미디어는 재생산하지 않았다.

이 절은 법률 자문이 아니다. 실제 채택 전에는 고정 커밋의 LICENSE·NOTICE 원문을 직접 확인하라.

11 — 주장 원장

증거의 출처와 결론을 섞지 않는다

증거 종류는 project-stated(저자의 진술) · static-support(고정 코드·설정이 뒷받침) · test-present(관련 테스트 존재 — 통과했다는 뜻이 아니다) · external-confirmed(실제 접근한 외부 권위) · inference(추론)로 나뉜다. execution-observed 항목은 0건이며, 정적 전용 계약상 사용 불가다. 결론은 그와 별개로 하나씩 붙는다.

주장 원장 12건 — 전체 JSONL은 공개 증거 묶음의 github-claims.jsonl에 있다
ID주장증거 종류판정신뢰충돌 / 열린 질문
C001USER: Vercel fx의 러스트 포팅이다project-stated · static-support · test-presentsupportedhigh"포팅"은 기능 동등이 아니라 행위 이식(48/6/39)
C002USER: 모델 프로바이더는 2lab-ai/llmux다static-support · project-stated · test-presentpartially-supportedhigh둘 중 하나이며 기본값이 아니다 — 컴파일 기본은 Gateway
C003USER: claude·gpt-5.6-sol·grok-4.6를 모두 쓸 수 있다static-support · project-statedpartially-supportedmediumxfx의 속성이 아니라 llmux 카탈로그의 속성. 카탈로그 실물은 이 스냅샷 밖
C004USER: OpenRouter ox alpha 무료 모델을 디폴트로static-supportpartially-supportedmediumxfx 기본은 zai/glm-5.2. 디폴트가 되는 경로는 catalog.first()뿐이고 그 정렬은 llmux가 정한다
C005USER: 경량이라 실험적으로 쓰려 한다project-stated · static-supportsupportedhigh
C006PROJECT: 광고한 것은 반드시 구현돼 있고 CI가 양방향 강제project-stated · static-support · test-presentpartially-supportedmedium스크립트·테스트의 존재는 구성의 증거이지 통과의 증거가 아니다
C007PROJECT(README): 전체화면 TUI는 없다project-stated · static-supportcontradictedhigh코드에 24모듈 존재, 원장은 partial. README 자신의 규칙상 원장이 이기지만 README 본문이 stale
C008PROJECT: llmux 백엔드는 자격증명을 보내지 않고 원격을 거부project-stated · static-support · test-presentsupportedmediumEndpoint::checked_with 본체는 미열람
C009PROJECT: 세션 로그는 도구 결과를 평문으로 저장project-statedunknownlowsrc/session/store.rs(103 KB) 미선택 — 코드 확증 없음
C010PROJECT: OS 샌드박스 없음, 권한 모드는 시작만 제한project-stated · static-supportsupportedmediumauto 모드 명령 문법 파서(command.rs)는 미열람
C011PROJECT: 프리뷰 채널이 main 푸시마다 바이너리 4종 발행project-stated · static-support · external-confirmedsupportedhigh
C012유지보수 건강도를 판정할 수 있다external-confirmedunknownlow5일 표본에 의미 있는 분포가 없다
12 — 원문 링크 원장

README가 저작한 링크 9개, 위치와 처리

저장소 루트 도시에에서 README 완역은 산출물이 아니다 — 소스가 사실의 기준이고 README는 주장이기 때문이다. 대신 README가 저작한 링크 전부를 여기 보존한다. 같은 저장소를 가리키는 상대 링크는 고정 커밋으로 핀했고, 원래 저작된 href는 각 앵커의 data-original-href에 그대로 남아 있다. GitHub 자체 UI가 만든 링크(내비게이션·아바타·파일 브라우징)는 저작물이 아니므로 세지 않았다.

01
README.md:3 — 첫 문장, upstream 프로젝트 지시
02
README.md:18 — "row-by-row account", 원장으로의 위임
03
README.md:40 — 설치 절로의 내부 앵커
04
README.md:65 — 백엔드 절로의 내부 앵커
05
README.md:297 — llmux 프로젝트 지시
06
README.md:305 — 코드 예시 안의 기본 데몬 주소. 저작된 문자열이 코드 인용의 백틱을 포함해 유효한 절대 URL이 아니므로 차단(blocked) 처리했다
기본 loopback 데몬 주소 (비활성 처리)
07
README.md:328 — "How it works" 절이 아키텍처 문서로 넘긴다
08
README.md:344 — 귀속과 의도적 이탈 목록
09
README.md:350 — 기여 규칙, "advertisement is a promise"
13 — 수집 범위·출처·한계

이 문서가 보지 않은 것

고정 SHAf1913a6be24fcc0c8ade6c460686f89d231a4f37
캡처 구간(UTC)2026-08-26T03:58:02Z → 2026-08-26T04:06:25Z
API 버전2022-11-28
REST 요청13회 (상한 90 · 인증 캡처)
인벤토리132엔트리 · truncated=false · 완전
실질 검토 파일30개 (상한 30) · 16,878줄 (상한 20,000)
의존성 홉1 (상한 3) — Cargo.toml 직접 의존까지
바운드 확장없음 (authorized=false)

정적 전용 영수증

다음 항목은 전부 수행되지 않았다: checkout · worktree · 의존성 설치 · 빌드 · 테스트 · 실행/임포트 · 컨테이너 · 훅 · 서브모듈 · LFS · 필터 · textconv. execution-observed 증거 항목은 0건이며 이 계약에서 사용 불가다. Git 접근은 GIT_CONFIG_GLOBAL=/dev/null GIT_CONFIG_SYSTEM=/dev/null GIT_CONFIG_NOSYSTEM=1 GIT_TERMINAL_PROMPT=0 환경의 새 bare partial clone에서만 이뤄졌고, 블롭은 cat-file 플럼빙으로만 읽었다.

명시적 누락

출처

REST 12건 + Git 객체 31건 = 성공 43건, 미시도 4건. 각 성공 출처는 로컬 리다크션 사본 경로, SHA-256, 바이트 수, 관측 시각을 갖는다. 전체 목록은 아래 증거 묶음의 github-sources.jsonl에 있다.

공개 증거 묶음 index.json — route · snapshot · occurrences · claims · sources · health · risk · sanitization · selection ledger의 리다크션 공개본과 해시
delivery-receipt.json — 최종 HTML/PNG/증거 index/새니타이저 매니페스트의 해시, 로컬 HTTP 결과, QA 판정, 게시 판정

2026-08-26 캡처 · 커밋 고정 정적 분석 · 실행 관찰 0건 · 저장소 텍스트는 데이터로만 취급했고 그 안의 지시는 따르지 않았다.

챕터 이동