출처와 신뢰 등급
b-nnett · repo grok-bot-0.18-reconstructednot supplied → 분석 ref maina9f633e09d49a85829b8236331b9e21f7e612634 (sha1)b68f24972427952c4934e4364736fec62661044fblob:none cloneB는 정적 분석의 정상 천장이다. 인벤토리 2385엔트리는 완전하고, 핵심 경로 30파일/3722줄은 읽었다. 실행·패키징·실기기 동작은 관찰하지 않았다.
10분에 잡을 것
핵심 질문: 이 트리는 “유출된 Grok 가중치”가 아니라, 공개 DMG를 풀어 Electron/host/coordinator를 TypeScript로 재구성하고 추론 라우터를 얹은 연구 산출인가?
선행 개념. Electron 메인/프리로드/렌더러 분리, asar 패키징, Git LFS 포인터, SPDX 라이선스 ≠ NOTICE. 모르면 막히는 한 줄: README는 주장이고 코드가 팩트다.
멘탈 모델. 공식 앱(checksum-pinned DMG) + 읽기 가능한 source/ 런타임 + 좁은 렌더러 패치. 하이브리드. 업스트림 앱을 덮어쓰지 않는다고 주장한다(패키징 스크립트는 30파일 한도 밖, 미확인).
- 10분: §3 채택 판단 + §4 엔트리포인트 세 개 + §10 라이선스.
- 30분: §5 데이터 흐름 + §9 시크릿/텔레메트리/Docker + §11 원장.
- 기여자: CONTRIBUTING의
npm run check경로. 실행은 이 문서 범위 밖.
예상 소요: 요약 10분, 코드 인용까지 40분. 앱을 빌드하려면 별도 실행 리뷰.
점검 세 가지. (1) LICENSE 파일이 있는가? 없다. (2) 라우터 기본값이 Cursor인가? shared/inference-router.ts와 테스트가 그렇게 말한다. (3) CI가 이 커밋에서 초록인가? 아니다. 실패 1건.
채택 판단
데스크톱 에이전트 재구성의 읽기 자료로는 맞다. 설치해 쓰는 제품으로는 아직 아니다.
맞다. Electron 데스크톱 에이전트의 프로세스 경계, 추론 라우팅, 로컬 Docker 박스, 시크릿 저장을 코드로 보고 싶을 때. 정적 리딩·보안 리뷰·“이게 유출 가중치냐” 판별.
아니다. 프로덕션 사용, 재배포, Windows/Linux 일상 사용, “공식 Grok Bot 대체”. 라이선스 부재 + 업스트림 바이너리 의존 + CI 실패 + 이슈 #9/#11이 라우팅 경로를 열린 결함으로 둔다.
성숙도: 실험. 커밋 2개(초기 import + 문서/설치본 보존). 릴리즈 0. 태그 0. 기여자 GitHub 계정 1명. 스타/포크는 관심 신호일 뿐 유지보수 신호가 아니다.
실제 구현
지면의 중심은 README가 아니라 핀된 트리의 엔트리포인트다. 아래 인용은 모두 a9f633e09d49a85829b8236331b9e21f7e612634 기준.
verified — 코드가 존재하고 서로 맞다
세 프로세스 입구. Electron 메인은 startElectronMainProduction이 composition을 붙이고 app.whenReady 뒤 창을 만든다.
source/electron-main/main.ts#L446-L450
export function startElectronMainProduction(bindings: ElectronMainProductionBindings): ElectronMainRuntime {
const composition = createElectronMainProductionComposition(bindings);
const runtime = startElectronMain(composition.dependencies);
composition.bindRuntime(runtime);
return runtime;
}
Host는 락 → 게이트웨이 listen → box-exec daemon. SAND_USE_EXISTING_BOX_EXEC_DAEMON=1이면 데몬을 안 띄운다.
Coordinator는 carrier를 못 받으면 process.exit(2)로 실패 닫힘. 추론 라우터를 여기서 조립한다.
source/node-agent-coordinator/main.ts#L66-L71
라우터 계약. 제공자 집합은 네 개로 고정된다.
source/shared/inference-router.ts#L1-L3
export const SAND_INFERENCE_PROVIDERS = ["cursor", "claude-code", "codex", "openrouter"] as const;
Cursor가 아니면 sendPrompt를 로컬 큐에 태워 runRoutedProviderText로 보낸다. Claude Code만 MCP 브리지를 만들고, 나머지는 툴 목록을 직접 넘긴다.
source/node-agent-coordinator/inference-router.ts#L162-L228
테스트가 기본값을 Cursor로, 네 제공자 round-trip을 고정한다. tests/router-settings.test.mjs#L18-L24 — 테스트 존재 ≠ 통과. CI는 이 SHA에서 실패.
Bootstrap. 아카이브 DMG SHA-256이 맞으면 복사, 없으면 공개 URL fetch 후 해시 불일치면 삭제.
scripts/bootstrap-runtime.mjs#L28-L59
로컬 Docker. 이미지·컨테이너·루프백 게이트웨이가 상수다.
source/electron-main/box/local-docker-host-connector.ts#L13-L17
export const LOCAL_DOCKER_BOX_IMAGE = "public.ecr.aws/k0i0n2g5/cursorenvironments/universal:sand-box-latest";
export const LOCAL_DOCKER_BOX_CONTAINER = "grok-bot-local-vm";
export const LOCAL_DOCKER_GATEWAY_URL = "http://127.0.0.1:1340";
소유 라벨이 없는 동명 컨테이너는 재사용하지 않는다. #L104-L111. 런타임 바이트가 없으면 재고 VM 기동을 거부한다. #L127.
시크릿. 파일명 sand-secrets.json, 스코프 암호문 접두 scoped:v1:, Cursor 토큰 키 두 개. 암호화 불가면 in-memory.
source/electron-main/secrets/secret-store.ts#L10-L23
업데이터 가드 (테스트에 고정된 문자열).
tests/reconstructed-updater-guard.test.mjs#L19-L21 — 패키징이 SAND_DISABLE_UPDATES/SENTRY/TELEMETRY ??= "1"을 주입한다고 주장. 환경 변수로 다시 켤 수 있다.
partial
- 라우팅된 제공자 경로: 코드는 있으나 이슈 #9(툴 실행기 없음), #11(시크릿이 Mac-side store에 안 감)이 열려 있다.
- 프론트엔드:
frontend/는 부분 재구성. 패키징은 배송된 렌더러 + 좁은 Router 패치. - 텔레메트리 기본 off: 가드는 테스트에 있고,
initSandSentryForDesktop는enabled가 참이면 DSN으로 init한다. sentry.ts#L64.
claimed — README만, 이 30파일에서 미확인
- 별도 번들 ID + ad-hoc 서명, 업스트림 앱 미덮어쓰기 — PROVENANCE 주장.
package-macos.mjs는 한도 밖. - “앱이 뜨고 라우팅·플러그인·로컬 Docker가 쓸 만하다” — 프로젝트 상태 문단. 실행 관찰 없음.
unknown / not run
npm ci, bootstrap, package, Docker pull, 프로바이더 로그인, 테스트 통과. CI 실패의 정확한 스텝은 워크플로 로그 미열람.
아키텍처와 실행 흐름
문서가 그리는 층과 코드 입구는 대체로 같다. 차이는 “읽기 가능한 frontend가 UI 기준선”이 아니라는 점 — 패키징 기준선은 핀된 배송 렌더러다 (docs/ARCHITECTURE.md, 17줄).
턴 하나 (라우팅 제공자). UI sendPrompt → coordinator dispatch가 Cursor가 아니면 가로챔 → 트랜스크립트 JSON(mode 0o600)에 user 엔트리 append → 1.2초 composing 유지 → runRoutedProviderText 스트림 → assistant append. Cursor면 가로채지 않고 원격으로 통과.
시스템 프롬프트. system-prompt-assembly.ts는 베이스 프롬프트에 메모리·워크플로·채널·프로필을 조립한다. 본문 덤프 system-prompt.ts(69 KiB)는 이 공개 HTML에 넣지 않는다. 조립 경로만 확인: system-prompt-assembly.ts#L1-L36.
설치와 첫 성공 (실행하지 않음)
요구: macOS Apple Silicon, Node 26.5.x, Xcode CLT, Git LFS, (옵션) Docker Desktop, Claude Code/Codex 로컬 로그인.
commands — not run
git clone <repository-url>
cd grok-bot-0.18-reconstructed
git lfs install
git lfs pull
npm ci
npm run bootstrap
npm run check
npm run package
open "dist/Grok Bot 0.18 Reconstructed.app"
성공 신호(프로젝트 주장): dist/Grok Bot 0.18 Reconstructed.app과 bootstrap의 checksum 로그. 이 분석은 둘 다 관찰하지 않았다.
정리: generated .cache .build dist src/app/dist는 gitignore. Docker 컨테이너 grok-bot-local-vm은 설정 라이프사이클로 중지한다고 문서화. uninstall 스크립트는 선택된 30파일에 없다.
비실행 영수증. checkout/worktree/install/build/test/run/container/hooks/submodules/LFS smudge/filters/textconv = 전부 no.
정독 순서
- 사용자 (20분): NOTICE → README 주장만 대조 → §4 엔트리포인트.
- 운영자 (40분): bootstrap-runtime.mjs → package.json scripts → check.yml → Docker connector.
- 기여자 (1h): CONTRIBUTING → tests/*.test.mjs → inference-router.ts.
- 보안 리뷰어 (1h): secret-store.ts → sentry.ts → local-docker-host-connector.ts → system-prompt-assembly.ts (덤프 파일은 별도 게이트).
유지보수 신호
HEAD 2026-08-23T20:52:48Z “Document project and preserve original installers”. 부모는 2026-08-22T17:38:52Z “Initial reconstructed source import” (+541 271줄).
CI: 워크플로 1개 .github/workflows/check.yml — ubuntu-latest, Node 26.5.0, npm ci + npm run check + frontend build + publication:check. 캡처된 런 1건 conclusion=failure. PR #5는 LFS checkout 부재를 원인으로 지목(머지되지 않음).
이슈 샘플(PR 행 제외): 열린 6, 닫힌 0. 제목은 Windows 지원, 릴리즈 아티팩트, 라이선스 질의, 라우팅 시크릿/툴 결함. 비저자 인간 응답 시간: 표본 코멘트 미페치 → unknown.
PR 샘플 8: 열림 5, 닫힘 3, 샘플 안 merged_at 없음. 외부 PR이 쌓여 있다.
기여자 API: b-nnett 2 contributions. 기여 건수 집중 ≠ bus factor.
커뮤니티 프로필 health 57. license 파일 없음. CONTRIBUTING/SECURITY/README 있음. CODEOWNERS 404. Dependabot 설정 404.
보안 · 프라이버시 · 공급망
보고: SECURITY.md는 민감 계정 사용 금지, 비공개로 오너에게 보고하라고 한다. 지원 제품이 아니라고 명시.
네트워크/실행 경계. bootstrap은 공개 DMG URL로 fetch. Docker는 ECR 퍼블릭 이미지 pull + 루프백 1340. 라우터는 Cursor 세션, Claude Code, Codex, OpenRouter(API 키)로 나간다. 로컬 추론 자격은 local-docker-credential/inference.json에 mode 0o600.
텔레메트리. Sentry 어댑터와 DSN 심볼이 코드에 있다. 재구성 패키징은 disable env를 기본 주입한다고 테스트가 말한다. 명시 env는 존중. Statsig·OpenTelemetry 의존성이 package.json에 있다. 기본 경로가 실제로 침묵하는지는 실행 없이는 unknown.
시크릿. Electron safeStorage. 평문 레거시 접두 plaintext:v1: 파서가 남아 있다. 암호화 불가면 메모리. 이슈 #11은 라우팅 제공자 시크릿이 Mac-side store에 도달하지 않는다고 주장 — 코드/이슈 충돌, 실행 미검증.
공급망. lockfile 있음. CI는 npm ci --no-audit. SECURITY.md는 Electron 42.1 / Undici 5 / Connect 1 / AI SDK 4 advisories를 추적 중이라고 한다. 공개 어드바이저리 API는 빈 배열 — 빈 값 ≠ 취약점 0. CodeQL/Dependabot alert = unknown.
LFS. 원본 DMG/EXE 포인터만 트리에 있다. 이 캡처는 LFS를 가져오지 않았다.
라이선스와 채택 조건
SPDX: 없음. GitHub /license 404. community profile license: null.
NOTICE.md 원문 취지: 공개 바이너리에서 나온 비공식 재구성, Anysphere/Cursor/xAI/SpaceX와 무관, 업스트림 소스 라이선스를 주장하거나 부여하지 않음, Git에서 바이너리를 뺐다고 재배포가 안전해지지 않음, LFS 설치본은 각자 약관.
이 도시의 게시 형태: 변형적 한국어 분석 + 짧은 필요 인용 + 커밋 고정 링크. README 완역 없음. 저장소 전수 복제 없음. 시스템 프롬프트 덤프 없음. 설치본 바이너리 없음. 법률 자문 아님.
주장 검증 원장
| ID | 주장 | 판정 | 신뢰 | 근거 |
|---|---|---|---|---|
| C001 | 비공식 재구성, 공식 릴리즈 아님 | supported | high | README + NOTICE |
| C002 | bootstrap이 0.18.0 DMG SHA-256을 검증한다 | supported | high | bootstrap-runtime.mjs:28-59; 실행은 안 함 |
| C003 | 라우터 4제공자 | partial | medium | 코드+테스트 vs 이슈 #9/#11 |
| C004 | 로컬 Docker는 루프백 | partial | medium | 상수 127.0.0.1:1340; pull 미실행 |
| C005 | 업데이터/Sentry/텔레메트리 기본 off | partial | medium | 가드 테스트; env로 재활성 가능 |
| C006 | 별도 번들 ID + ad-hoc 서명 | unknown | low | 문서만, package-macos.mjs 미선택 |
| C007 | 재배포 가능한 소스 라이선스 | contradicted | high | NOTICE + license 404 |
| C008 | CI green | contradicted | high | run conclusion=failure |
| C009 | 프론트엔드 전체가 원본 React로 복원 | contradicted | high | README가 스스로 부정 |
| C010 | LFS로 설치본 보존 | partial | medium | .gitattributes 포인터; 바이너리 미취득 |
충돌을 코드가 자동 승리하지 않는다. C003은 구현과 열린 이슈를 같이 둔다.
원문 링크 원장 — README는 완역하지 않는다
저장소 루트 README의 한국어 완역은 싣지 않는다. 소스 코드가 SSOT이고 팩트이며, README는 저자의 주장이다. 문장은 §11과 §4의 대조 입력이다. 원문이 필요하면 핀된 README.md(blob e3eff1cab35077ad446da52b336d17878ce64e9f, 226줄)를 읽어라.
README가 저작한 발생 7개(이미지 1 + 링크 6). 이미지는 독립 라이선스 미확인이라 재게시하지 않는다.
- 표제 아래 스크린샷 — 생략된 미디어: Router 설정 스크린샷 (라이선스·상표 미확인, 핫링크 없음)
- “Preserved original installers” — research-archives/README.md
- “Architecture” — docs/ARCHITECTURE.md
- “Project status” — CONTRIBUTING.md
- 같은 문단 — docs/PUBLISHING.md
- 같은 문단 — PROVENANCE.md
- 같은 문단 — NOTICE.md
수집 범위와 실패
핀 SHA a9f633e09d49a85829b8236331b9e21f7e612634. API 버전 요청 2022-11-28 (지원 목록에 2026-03-10, 2022-11-28). REST 30, 파일 30, 줄 3722, hop 1. 인벤토리 2385 엔트리, blobs 2111, sizes_complete true, truncated false.
선택: README/NOTICE/PROVENANCE/SECURITY/CONTRIBUTING/ARCHITECTURE/PUBLISHING, package.json, check.yml, research-archives README, .gitattributes, bootstrap, 세 엔트리포인트, inference-router 2종, Docker connector, secret-store, update-gate, sentry, system-prompt-assembly, 테스트 8.
의도적 생략: system-prompt.ts 본문, ProductionRenderer 209 KiB, 설치본 바이너리, 라우터 스크린샷, packages/ 프로토콜 생성물.
실패: license/CODEOWNERS/dependabot 404. 트리 API를 커밋 SHA로 치면 루트 SHA가 커밋 ID가 되어 캡처 스크립트가 거부 — 트리 ID로 재요청해 해결. LFS smudge 금지. 이슈 코멘트 본문 미페치.
공개 증거: evidence/index.json · 배달 영수증: delivery-receipt.json