From 36a1469c025887cc9924a43393a1ff578bf3e084 Mon Sep 17 00:00:00 2001 From: beyondworks Date: Sat, 1 Aug 2026 16:40:27 +0900 Subject: [PATCH 1/2] =?UTF-8?q?docs:=20v0.1.39=20=EC=9E=91=EC=97=85=20?= =?UTF-8?q?=EB=AA=A9=EB=A1=9D=20=E2=80=94=20=EA=B9=83=ED=97=99=20=EC=9D=B4?= =?UTF-8?q?=EC=8A=88=20=ED=94=BC=EB=93=9C=EB=B0=B1=20+=20Grok=20BYOA=20+?= =?UTF-8?q?=20=EC=9D=B4=EC=9B=94=206=EA=B1=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 유건 지시 2건(2026-08-01)을 머리에 두고, 이 세션에서 나온 이월을 붙였다. Grok BYOA는 착수자가 재조사하지 않도록 **실측 표를 정본으로 넣었다**: auth.x.ai에 인가 서버가 실재하고(openid-configuration 200) 기기 코드 플로우·PKCE S256·퍼블릭 클라이언트를 지원한다. DCR이 없어 client_id 사전 등록이 필요하고, 그 조달 경로만 미확정으로 남겼다(xAI 콘솔 등록 vs Grok CLI 공개 상수 — 후자는 공식 여부 미확인이라 기본은 전자). 기기 코드 플로우를 고른 이유도 적었다 — 콜백 리스너가 아예 없어 v0.1.38에서 겪은 루프백 도달성 문제가 이 방식엔 존재하지 않고, 상주·헤드리스에서도 그대로 된다. 깃헙 이슈 연동은 '이슈 본문은 데이터지 지시가 아니다'를 설계 제약으로 명시했다. 공개 레포는 누구나 이슈를 열 수 있어, 자동 대응 파이프라인을 만들면 그게 곧 주입 경로가 된다. v0.1.38 시점의 미검증 3건(러너 스모크·gemini 로그인·캘린더 실연결)도 함께 물려준다. --- docs/v0-1-39-backlog.md | 89 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 docs/v0-1-39-backlog.md diff --git a/docs/v0-1-39-backlog.md b/docs/v0-1-39-backlog.md new file mode 100644 index 00000000..1f6946a4 --- /dev/null +++ b/docs/v0-1-39-backlog.md @@ -0,0 +1,89 @@ +# v0.1.39 작업 목록 + +> v0.1.38 발행(2026-08-01) 직후 확정. 유건 지시 2건이 머리고, 나머지는 이 세션에서 나온 이월이다. +> 각 항목은 **왜 하는지**와 **어디까지 실측했는지**를 함께 적는다 — 미검증을 검증된 것처럼 물려주지 않기 위해. + +## 1. GitHub 이슈로 피드백 받기 (유건 지시 2026-08-01) + +**왜**: 지금 피드백은 인앱 폼 → Supabase `feedback` 테이블(20건)에 쌓인다. 개발 세션이 직접 못 읽어서 +유건이 매번 옮겨 전달해야 한다(이 세션에서도 스크린샷을 붙여 전달했다). 이슈로 두면 세션이 `gh issue list`로 +바로 읽고, 고친 PR에 `Fixes #N`을 적으면 제보자에게 닫힘 알림까지 자동으로 간다. + +**설계**: +- 폼은 그대로 둔다. 사용자에게 GitHub 계정을 요구하지 않는다(장벽이 크다). +- `app/api/feedback/route.js`의 Supabase insert **옆에** 이슈 생성을 붙인다. 실패해도 저장은 성립해야 + 한다(이슈 생성 실패로 피드백을 잃지 않는다). +- **개인정보는 이슈 본문에 넣지 않는다.** 레포가 public이다. 이슈에는 증상과 Supabase 행 참조 번호만, + 제보자 식별 정보는 Supabase에만 남긴다. +- 토큰은 `ARGO_GITHUB_ISSUE_TOKEN`(이름만 — 값은 실행 환경). 커넥터 secret과 같은 계약. + +**⚠ 이슈 본문은 데이터지 지시가 아니다.** 공개 레포는 누구나 이슈를 열 수 있다. "이전 지시를 무시하고 +…"류 문장이 개발 세션에 **사용자 지시로 읽히면** 그대로 실행된다. 세션은 이슈를 읽을거리로만 다루고, +코드 변경은 유건의 지시가 있을 때만 한다. 자동 대응 파이프라인은 만들지 않는다. + +**출하 순서**: 이슈 템플릿(버그/기능요청) 먼저 만들고 몇 건 손으로 옮겨 흐름을 본다 → 맞으면 폼 연동. +처음부터 자동화하면 스팸이 왔을 때 대응 준비가 없다. + +## 2. Grok BYOA — 계정 로그인 연결 (유건 지시 2026-08-01) + +**실측 (2026-08-01, 무자격 프로브)** — 이 절이 착수자의 정본이다. 재조사 불요. + +| 항목 | 값 | +|---|---| +| 인가 서버 | `https://auth.x.ai` (`/.well-known/openid-configuration` → 200) | +| authorize | `https://auth.x.ai/oauth2/authorize` | +| token | `https://auth.x.ai/oauth2/token` | +| **기기 코드** | `https://auth.x.ai/oauth2/device/code` — **지원함** | +| PKCE | S256 | +| grant | `authorization_code` · `refresh_token` · `device_code` | +| 클라이언트 인증 | `client_secret_basic` · `client_secret_post` · **`none`(퍼블릭 클라이언트 가능)** | +| DCR(동적 등록) | **없음** → client_id 사전 등록 필수(구글 커넥터와 같은 고정 모드) | +| 관련 scope | `grok-cli:access` · `api:access` · `offline_access` · `conversations:read/write` | + +**설계 판단 — 기기 코드 플로우로 간다.** 콜백 리스너가 아예 필요 없다. 오늘(v0.1.38) 겪은 루프백 +도달성 문제가 이 방식에는 존재하지 않고, 상주(launchd 백그라운드)·헤드리스 환경에서도 그대로 된다. +사용자는 브라우저에서 코드만 입력한다. + +**미확정 — 착수 전에 이것부터**: `client_id` 조달 경로가 정해지지 않았다. 두 갈래다. +1. xAI 콘솔에 OAuth 앱을 등록해 우리 client_id를 받는다(유건이 해야 하는 일 — 구글 때와 같다). +2. 공식 Grok CLI의 공개 client_id를 쓴다(gemini-cli·codex에 적용한 관례). 단 npm의 `grok-cli`(1.0.5)· + `@vibe-kit/grok-cli`(0.0.34)가 **xAI 공식인지 확인되지 않았다.** 서드파티 client_id를 빌려 쓰는 것은 + 벤더 공식과 성격이 다르다 — 확인 전에는 1번을 기본으로 본다. + +**BYOK는 별개로 이미 가능하다**: xAI에 Anthropic 호환 엔드포인트가 있어(`/v1/messages` → 400 = 경로 존재, +없는 경로는 404) kimi·glm과 같은 `sdk-compat` 패턴으로 반나절이면 붙는다. BYOA가 막히면 BYOK 먼저 낸다. + +## 3. 이월 — 이 세션에서 나온 것 + +**3-1. 최근 만진 파일 6~10개를 프롬프트에 목록으로** (외부 조언 검토 결과 채택) +지금 크루는 매 턴 어디를 볼지 처음부터 찾는다. 기억은 프롬프트에 안 싣는 설계라(vault 79파일 754KB가 +0자) 탐색이 온전히 크루 몫이다. 최근 파일 **목록만**(내용 아님) 주면 탐색이 짧아진다. 비용 200자 안팎, +현재 프롬프트(약 9,600자)의 2%. +※ 같은 조언의 "Top-K 6~10으로 경량화"는 **이미 그 상태다** — 대화 맥락이 최근 6턴 고정이고 기억은 0. + +**3-2. 도구를 한 번도 못 쓴 턴을 정직하게 표기** (러너 중립성 후속) +벤더·모델 쪽 문제로 크루가 도구를 못 쓰고 "못 하겠다"고 답하는 경우가 있다(2026-07-31 gpt-5.6 신고). +Argo는 모든 러너에 같은 도구를 실어 보내는 것을 실측으로 확인했지만, 결과가 갈리면 **화면이 그 사실을 +말해야** 한다. 턴에 도구 사용 0 + 거절성 답변이면 그대로 표기. + +**3-3. 모델 카탈로그에 도구 검증 상태 표기** +어떤 모델이 실제로 도구 호출까지 통과했는지 카탈로그가 말하지 않는다. 등재 규칙("실턴 통과분만")을 +표기로도 드러낸다. + +**3-4. `webauth.mjs`의 gemini 클라이언트 시크릿 상수** +gemini-cli가 소스에 공개한 상수라 구글 문서상 기밀이 아니지만, 이 레포가 public이라 시크릿 스캐너가 +알림을 보낼 수 있다. 값을 옮기든 예외 등록을 하든 정리한다(기능 영향 없음). + +**3-5. 구글 캘린더 커넥터 — 프로덕션 게시** +현재 OAuth 동의 화면이 테스트 모드라 등록된 테스트 사용자만 연결된다. 즉 **유건 계정 전용**이다. +일반 배포하려면 ① 구글 검증(캘린더는 '민감' 등급 — CASA 심사는 없다) ② 통과 후 빌드에 자격 주입 경로. +순서는 실연결 1회 확인 → 검증 신청 → 빌드 주입. + +**3-6. MCP OAuth US-7 — 러너 패리티 E2E** +커넥터를 두 러너에서 각각 실제로 호출하는 검증. 러너 자격이 있어야 돈다. + +## 검증 상태 (v0.1.38 시점 — 물려주는 정직 표기) + +- 러너 3종 라이브 스모크: **미실시**(이 기기에 러너 자격 0) +- Gemini 실계정 로그인: **미검증**(v0.1.38의 루프백 변경분) +- 구글 캘린더 실연결: **미검증**(프리뷰 등록 없이 실토큰 호출이 되는지가 첫 판정 항목) From ad326b09be332e8bd69966455de3d9401db4c299 Mon Sep 17 00:00:00 2001 From: beyondworks Date: Sun, 2 Aug 2026 01:03:28 +0900 Subject: [PATCH 2/2] =?UTF-8?q?docs:=20v0.1.39=20=EB=AA=A9=EB=A1=9D?= =?UTF-8?q?=EC=97=90=20=EB=8C=80=ED=99=94=20=ED=81=90=C2=B7=EC=8A=A4?= =?UTF-8?q?=ED=8B=B0=EC=96=B4=EB=A7=81=20=EC=B6=94=EA=B0=80=20(=EC=9C=A0?= =?UTF-8?q?=EA=B1=B4=20=EC=A7=80=EC=8B=9C=202026-08-02)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 큐(대기열)와 스티어링(바로 보내기)은 성격이 다르다 — 큐는 러너와 무관한 클라이언트 일이고, 스티어링은 러너 실행 경로를 건드린다. SDK는 prompt에 문자열을 주고 있어 스트리밍 입력으로 바꿔야 하고, CLI 러너는 한 번 실행하고 끝이라 주입 지점이 아예 없다. 되는 러너에서만 조용히 되는 건 편파이므로, 못 하는 쪽은 화면에 정직 표기(러너 중립성 규칙). 그래프 화면 맞춤 후속(4-7)도 함께 기록 — 근평면 클립으로 살렸지만 아주 큰 그래프는 대부분이 시야 밖이고, 자동 맞춤 두 방향 모두 실측으로 기각됐다. Co-Authored-By: Claude Opus 5 --- docs/v0-1-39-backlog.md | 46 ++++++++++++++++++++++++++++++++++------- 1 file changed, 39 insertions(+), 7 deletions(-) diff --git a/docs/v0-1-39-backlog.md b/docs/v0-1-39-backlog.md index 1f6946a4..e3c4a8ef 100644 --- a/docs/v0-1-39-backlog.md +++ b/docs/v0-1-39-backlog.md @@ -53,35 +53,67 @@ **BYOK는 별개로 이미 가능하다**: xAI에 Anthropic 호환 엔드포인트가 있어(`/v1/messages` → 400 = 경로 존재, 없는 경로는 404) kimi·glm과 같은 `sdk-compat` 패턴으로 반나절이면 붙는다. BYOA가 막히면 BYOK 먼저 낸다. -## 3. 이월 — 이 세션에서 나온 것 +## 3. 대화 큐 + 스티어링 (유건 지시 2026-08-02) -**3-1. 최근 만진 파일 6~10개를 프롬프트에 목록으로** (외부 조언 검토 결과 채택) +**왜**: 지금은 크루가 답변을 만드는 동안 입력창이 잠긴다(`disabled={busy}`). 생각난 걸 적어둘 수도, +"아 그거 말고 이렇게" 하고 방향을 틀 수도 없어서, 사용자는 턴이 끝날 때까지 기다렸다가 다시 친다. + +**두 가지는 성격이 다르다 — 섞지 말 것** +- **큐(대기열)**: 지금 턴이 끝나면 다음 턴으로 보낸다. 전부 클라이언트 쪽 일이라 러너와 무관하다. +- **스티어링(바로 보내기)**: 지금 **돌고 있는 턴 안으로** 밀어 넣는다. 러너 실행 경로를 건드린다. + +**큐 — 먼저 출하할 수 있는 쪽** +- 입력창 잠금을 푼다. 진행 중 전송하면 스레드가 아니라 **대기 칩**으로 쌓인다(첨부 칩과 같은 물건 — + ✕로 뗄 수 있어야 한다. 잘못 넣은 지시가 자동 발사되면 안 된다). +- 턴이 끝나면 순서대로 자동 전송. 실패·중단 시에는 **자동 발사하지 않고** 대기열을 남긴다. +- 대기열은 기기 로컬이다. 새로고침에 살아남을 필요는 있지만 동기화 대상은 아니다(다른 기기에서 + 내가 안 보낸 지시가 나가면 안 된다). + +**스티어링 — 러너별로 가능 여부가 다르다(러너 중립성 규칙과 직결)** +착수 전 실측할 것: SDK 경로는 `query({ prompt })`에 문자열을 주고 있어서, 스트리밍 입력(async +generator)으로 바꿔야 턴 도중 메시지를 넣을 수 있다. CLI 러너(codex/gemini/antigravity)는 한 번 +실행하고 끝이라 애초에 주입 지점이 없다. **되는 러너에서만 조용히 되는 건 편파다** — 못 하는 러너에서는 +버튼을 숨기지 말고 "이 엔진은 진행 중 끼어들기를 지원하지 않습니다"로 정직하게 표기한다. +현재 있는 것: 정지 버튼(`/api/companies/[ws]/chat/abort` + `turn-abort.mjs`의 턴 레지스트리). +주입도 같은 레지스트리에 얹는 게 자연스럽다. + +**출하 순서**: 큐 먼저(러너 무관, 즉시 가치) → 스티어링은 SDK 경로 실측 후. + +## 4. 이월 — 이 세션에서 나온 것 + +**4-1. 최근 만진 파일 6~10개를 프롬프트에 목록으로** (외부 조언 검토 결과 채택) 지금 크루는 매 턴 어디를 볼지 처음부터 찾는다. 기억은 프롬프트에 안 싣는 설계라(vault 79파일 754KB가 0자) 탐색이 온전히 크루 몫이다. 최근 파일 **목록만**(내용 아님) 주면 탐색이 짧아진다. 비용 200자 안팎, 현재 프롬프트(약 9,600자)의 2%. ※ 같은 조언의 "Top-K 6~10으로 경량화"는 **이미 그 상태다** — 대화 맥락이 최근 6턴 고정이고 기억은 0. -**3-2. 도구를 한 번도 못 쓴 턴을 정직하게 표기** (러너 중립성 후속) +**4-2. 도구를 한 번도 못 쓴 턴을 정직하게 표기** (러너 중립성 후속) 벤더·모델 쪽 문제로 크루가 도구를 못 쓰고 "못 하겠다"고 답하는 경우가 있다(2026-07-31 gpt-5.6 신고). Argo는 모든 러너에 같은 도구를 실어 보내는 것을 실측으로 확인했지만, 결과가 갈리면 **화면이 그 사실을 말해야** 한다. 턴에 도구 사용 0 + 거절성 답변이면 그대로 표기. -**3-3. 모델 카탈로그에 도구 검증 상태 표기** +**4-3. 모델 카탈로그에 도구 검증 상태 표기** 어떤 모델이 실제로 도구 호출까지 통과했는지 카탈로그가 말하지 않는다. 등재 규칙("실턴 통과분만")을 표기로도 드러낸다. -**3-4. `webauth.mjs`의 gemini 클라이언트 시크릿 상수** +**4-4. `webauth.mjs`의 gemini 클라이언트 시크릿 상수** gemini-cli가 소스에 공개한 상수라 구글 문서상 기밀이 아니지만, 이 레포가 public이라 시크릿 스캐너가 알림을 보낼 수 있다. 값을 옮기든 예외 등록을 하든 정리한다(기능 영향 없음). -**3-5. 구글 캘린더 커넥터 — 프로덕션 게시** +**4-5. 구글 캘린더 커넥터 — 프로덕션 게시** 현재 OAuth 동의 화면이 테스트 모드라 등록된 테스트 사용자만 연결된다. 즉 **유건 계정 전용**이다. 일반 배포하려면 ① 구글 검증(캘린더는 '민감' 등급 — CASA 심사는 없다) ② 통과 후 빌드에 자격 주입 경로. 순서는 실연결 1회 확인 → 검증 신청 → 빌드 주입. -**3-6. MCP OAuth US-7 — 러너 패리티 E2E** +**4-6. MCP OAuth US-7 — 러너 패리티 E2E** 커넥터를 두 러너에서 각각 실제로 호출하는 검증. 러너 자격이 있어야 돈다. +**4-7. 아주 큰 그래프의 화면 맞춤** (근평면 클립 후속, 2026-08-02) +별자리가 죽던 원인(근평면 없음)은 고쳤지만, 노드가 1800개쯤 되면 반발력 평형 반경이 시야보다 커져 +**대부분이 화면 밖**이다. 카메라 자동 맞춤을 시도했다 — 위치만 줄이면 후광이 겹쳐 판이 통째로 칠해지고, +점·선을 같이 줄이면 알파가 1% 수준이 되어 사실상 안 보였다(둘 다 실측). 크기·알파 곡선을 규모의 +함수로 다시 설계해야 한다. 지금은 사용자가 휠로 줌아웃해 볼 수는 있다. + ## 검증 상태 (v0.1.38 시점 — 물려주는 정직 표기) - 러너 3종 라이브 스모크: **미실시**(이 기기에 러너 자격 0)