DuckTerm Field Notes

A 21h 54m goal-driven engineering story

iOS 전용에서 Android 대응까지

거의 완전 자동인 크로스 플랫폼 적응 실험: Ghostty의 검은 화면, Mosh의 실어증, Chrome의 권한 탐정, Google Play 목록, RevenueCat 제품 폐쇄 루프, 서로 '증언'하는 세 가지 장치에 이르기까지.

  • Goal-driven
  • iOS → Android
  • Ghostty + Mosh
  • Play + RevenueCat
  • Evidence first
iOS 터미널에서 Android 터미널로 크로스 브리지 왼쪽의 휴대폰과 오른쪽의 태블릿은 코드, 테스트 및 증거의 브리지로 연결됩니다. iOS / Ghostty $ ssh duck@host PARITY_READY scroll · ime · tui Android / Ghostty $ mosh duck@host SAME_SESSION_OK pixelcopy · pip · pad GOAL fail-closed first 403 ≠ 종말의 날 evidence or it didn’t happen
21h54m논리적 목표, 소요 시간은 단일 프로세스 가동 시간이 아닙니다.
4,441독립적인 테스트 번호가 아닌 도구 호출 패턴
3API35、Pixel API30、Xiaomi Pad
30/30최종 연결된 제품군 스냅샷은 이전 스냅샷에 추가되지 않습니다.
259목표 창 내 시각적 검사 호출

그것은 간단해 보이는 요청에서 시작되었습니다. iOS가 이미 가지고 있는 모든 좋은 기능을 Android에도 가져야 한다는 것입니다. 그렇죠? 이 문장이 전통적인 프로젝트 관리에 넘겨지면 Jira의 한 줄로 성장할 것입니다. 이 목표에 넘겨지면 Ghostty 기본 터미널, Mosh 실제 UDP, Pad 대형 화면, PiP, 위젯, 알림, Google Play 및 RevenueCat으로 성장할 것입니다. 또한 스크린샷을 보고, 브라우저를 열고, 403을 확인하고, 자체 증거를 의심하는 방법을 점차적으로 배우는 오리입니다.

01 / THE CONTRACT

안드로이드는 iOS가 아니고 녹색 코트를 입고 있다

소위 "iOS에서 Android로의 적응"에서 실수를 저지르는 가장 일반적인 방법은 페이지의 스크린샷을 픽셀 단위로 복사하는 것입니다. 실제로 마이그레이션해야 하는 것은 제품 계약 입니다. 사용자는 원격 끝에 중국어 문자를 한 번만 입력할 수 있습니다. 렌더러가 실패하면 SSH 연결을 끊을 수 없습니다. 배경에서 돌아올 때 새 프레임이 표시되어야 합니다. 구독 복구를 위해서는 현재 계획이 인식되어야 합니다. 패드는 가로로 확대되는 휴대폰이 아닙니다.

따라서 각 기능은 공유 의미, 플랫폼 구현 및 증거 경계의 세 가지 계층으로 변환됩니다. iOS는 자체 뷰포트 프리미티브를 사용할 수 있고 Android는 Ghostty ABI 3을 사용할 수 있습니다. 그러나 "이전 기록을 찾아보려면 손가락을 아래로 누르고 실시간으로 돌아가려면 클릭하세요"는 일관성이 있어야 합니다.

flowchart LR
  I["iOS에는 이미 기능이 있습니다."] --> C{"공유 제품 계약"}
  C --> A["안드로이드 네이티브 구현"]
  A --> D["플랫폼 차별화 전략"]
  D --> V["3개의 디바이스와 실제 서비스 검증"]
  V --> R{"증거가 통과됐나요?"}
  R -- "아니요" --> F["근본 원인을 찾아 주장 범위를 좁힙니다."]
  F --> V
  R -- "예" --> S["미니 배치 검토 및 원자성 제출"]
            
그림 1: 구현을 복사하는 대신 계약을 마이그레이션합니다. 실패하면 "동일해 보이는" 릴리스 대신 확인 루프로 돌아갑니다.
⌨️

계약을 입력하세요

IME 구성은 로컬로 유지되며 정확히 한 번 커밋됩니다. 물리적 키, Ctrl, Alt 및 고정 수정자는 직렬화할 수 없습니다.

🖼️

렌더링 계약

와이드 셀, 선택, 스냅샷, 스크롤백 및 커서는 실제 프레임에서 일관되어야 합니다.

🛟

실패한 계약

GL은 xterm을 자르지 못했지만 SSH 전송, 링 기록 및 사용자 입력은 그대로 유지됩니다.

💳

사업 계약

월별 결제, 연간 결제, 평생 결제는 Play 및 RevenueCat에서 일관되게 매핑됩니다. 구성이 부족하면 SKU를 추측하는 것보다 판매하지 않는 것이 좋습니다.

크로스 플랫폼은 "동일하게 보이는 것"이 ​​아니라 "뭔가 잘못되더라도 동일한 약속을 유지하는 것"입니다.

02 / THE NATIVE LINE

Ghostty가 먼저 실패하도록 한 다음 성공하도록 허용하세요.

Android Ghostty의 첫 번째 규칙은 약간 반직관적입니다. 절대 낙관적으로 시작하지 마세요 . 동기 상수는 항상 `ok=false`로 먼저 설정됩니다. 비동기 자체 테스트는 xterm에서 Ghostty로 전환하기 전에 기본 코어, ABI, VT, EGL, 셰이더, 텍스처 업로드, 그리기 및 다시 읽기가 모두 사실임을 입증해야 합니다.

이는 첫 번째 프레임에서 "먼저 어둡게 한 다음 그것에 대해 이야기하라"는 고전적인 모바일 형이상학을 피합니다. 건강 인증에는 2.5초의 상한선도 있습니다. GPU가 정말로 명상에 들어가고 싶다면 사용자는 최대 2.5초 동안 스피너를 본 다음 Zen과 같은 영구 공백 대신 작동하는 xterm을 얻을 수 있습니다.

stateDiagram-v2
  [*] --> Pending
  Pending --> Ghostty: health proof succeeds before timeout
  Pending --> Xterm: timeout or proof fails
  Ghostty --> Xterm: runtime GL failure
  Xterm --> StableSession: same transport and ring replay
  Ghostty --> StableSession: native renderer active
  StableSession --> [*]
  note right of Ghostty
    Native VT plus full GL path
  end note
            
그림 2: 렌더러는 운송 수단이 아닌 교체 가능한 표면입니다. 작업 중 GL이 실패하더라도 세션은 계속됩니다.
GHOSTTY_HEALTH
core.ok=true
gl.maxRgbDelta=2

$ printf '中文 😀 é'
中文 😀 é

same session
FORCED_GL_FAIL
renderer unhealthy
→ xterm fallback

$ echo STILL_ALIVE
STILL_ALIVE

connect count: 1
MOSH_ROAM
Wi-Fi off
DURING_OK
Wi-Fi on
AFTER_OK

same PID · same UDP

터미널 필름은 작업 배경의 원본 이미지가 아닌 물품 복원을 표현한 것입니다. 마커, 결과 및 경계는 실제 장비 증거에서 나온 것입니다.

"쉽게" 결합되는 단단한 뼈

입력 방법 구성, xterm 키 시퀀스, 터치 선택, ActionMode 복사, 기본 스크롤백, 배경 합성기, PixelCopy 프로브, CPU 스냅샷, 패드 키보드 포커스 모드... 각 항목은 개별적으로 P3처럼 보이지만 함께 쌓으면 "이것이 터미널인지 깜박이는 검은 사각형인지"를 판단합니다.

03 / THE BROWSER DETECTIVE

브라우저에 권한이 있지만 기성 키가 없습니다.

Play Console의 권한은 로그인된 Chrome 프로필에 있습니다. 내장된 극작가는 깔끔한 프로필이며 아무것도 볼 수 없습니다. CDP는 아직 오픈되지 않았습니다. 가장 쉬운 대답은 "사용자에게 수동으로 해달라고 요청하는 것"입니다. 목표는 다른 경로를 선택했습니다. 먼저 어떤 브라우저 컨텍스트에 권한이 있는지 확인한 다음 사용자 참여를 필요한 동의로 압축합니다.

브라우저 권한 감지 다이어그램 에이전트는 스크린샷을 통해 Chrome 동의를 식별합니다. 사용자 승인 후 CDP가 페이지를 인수한 다음 gcloud, Play API 및 RevenueCat에 연결합니다. chrome:// remote debugging 원격 디버깅을 허용하시겠습니까? 사용자가 허용 CONTROL PLANE ✓ CDP snapshot + click ✓ gcloud API enablement ✓ Play publisher SA ✓ RevenueCat v2 secrets stay outside repo snapshot then click
그림 3: CDP 제어 페이지는 자체 인증 팝업 창을 제어할 수 없습니다. 스크린샷과 OS 자동화는 동의에 대한 책임이 있고, 신뢰에 대한 책임은 사용자에게 있습니다.

미리 만들어진 브리지가 없으면 임시 디렉터리(MCP SDK + `chrome-devtools-mcp` + Thin stdio 클라이언트)에 브리지를 생성한 다음 영구 PTY를 사용하여 `스냅샷 → 클릭 → 스냅샷`을 지속적으로 보냅니다. "플랫폼 기능"으로 패키징되지 않으며 완료 후 정리됩니다. 실제로 재사용 가능한 결론은 전용 프로필, 원본 허용 목록, 고정 버전 및 기본 둔감화입니다.

짓궂은 농담: 403이 반드시 Google이 당신을 사랑하지 않는다는 뜻은 아닙니다. OAuth 범위, GCP IAM, Play 앱 권한, 결제 권한일 수도 있고 권한이 아직 진행 중일 수도 있습니다. 먼저 레이어를 쌓고 다시 시도하세요. 새로 고침 버튼을 묵주로 사용하지 마십시오.
sequenceDiagram
  actor U as 사용자
  participant A as Goal Agent
  participant B as Chrome
  participant G as gcloud
  participant P as Play Publisher API
  participant R as RevenueCat API
  A->>B: 이미 로그인 상태와 대상 계정 컨텍스트가 있는 것으로 확인되었습니다.
  U->>B: 원격 디버깅을 명시적으로 허용
  B-->>A: CDP 페이지 제어 가능
  A->>G: API를 활성화하고 최소 권한이 있는 ID 세트 2개를 생성합니다.
  A->>B: Play Console에서 앱 권한 바인딩
  A->>P: 멱등적으로 카탈로그 생성 및 내부 AAB 업로드
  A->>R: Android 앱 및 제품 매핑 만들기
  P-->>A: 추적 및 유물 상태
  R-->>A: 자격 및 제공 상태
  A-->>U: 비즈니스 사실과 취소할 수 없는 출시 결정만 요청하세요.
            
그림 4: 브라우저, Cloud IAM, Play 권한 및 RevenueCat은 4개의 제어 영역입니다. 이를 하나의 "로그인 성공"으로 혼합하면 더 많은 403만 생성됩니다.
04 / THE EVIDENCE LAB

스크린샷이 검은색입니다. 아직 GPU에 대한 찬사를 쓰지 마세요.

Android 휴대폰 인증에서 가장 위험한 순간은 첫 번째 스크린샷이 매우 설득력 있게 보일 때입니다. SurfaceView는 시스템 스크린샷에서 완전히 검은색일 수 있습니다. Xiaomi 화면 캡처는 0바이트일 수 있습니다. 스크린레코드는 하드웨어 레이어 없이 세상만 기록할 수 있습니다. 반대로, 원격 tmux가 마커를 보면 전송이 살아 있다는 것만 증명할 뿐 로컬 합성자가 마커를 그렸다는 것을 증명하지는 않습니다.

3개 장비 증거 연구실 API35 에뮬레이터, Pixel 4 및 Xiaomi Pad는 각각 새로운 시스템, 기존 시스템 실제 시스템 및 OEM 대형 화면 검증을 담당합니다. API35 emulator 새로운 API · 계약 Pixel 4 API30 physical IME · FCM · SQLite Xiaomi Pad API33 · MIUI master detail Pad · Surface · rotation
그림 5: 세 가지 장치는 동일한 테스트에 3을 곱한 것이 아니라 세 가지 보완적인 가정, 즉 새로운 API, 기존 실제 시스템 및 OEM 대형 화면입니다.

따라서 증거는 고유 마커, UI 트리, PixelCopy, CPU 래스터, PID, dumpsys, logcat 및 원격 창과 같은 여러 오라클로 설계되었습니다. 그들은 줄을 서서 박수를 보내지 말고 서로를 속여야 합니다.

flowchart TB
  M["고유 마커 삽입"] --> U["UI 트리 및 컨트롤 상태"]
  M --> X["스크린샷 또는 PixelCopy"]
  M --> S["PID · dumpsys · logcat"]
  M --> T["원격 SSH/Mosh/tmux 상태"]
  U --> C{"여러 오라클이 일관성이 있나요?"}
  X --> C
  S --> C
  T --> C
  C -- "아니요" --> A["테스트 아티팩트 분류"]
  A --> N["nonce와 oracle을 교체하고 다시 실행하세요."]
  N --> M
  C -- "예" --> B["제한된 결론 작성"]
            
그림 6: 증거가 많을수록 좋지만 출처가 독립적일수록 좋습니다. 갈등이 생기면 먼저 컬렉션 ​​체인을 의심하고, 그 다음에는 제품을 의심하고, 첫 판단도 의심합니다.
본 현상거의 잘못된 결론에 이르렀습니다.마지막으로 사용된 직교 증거
패드 스크린샷 올 블랙고스트 합성기가 다시 중단됩니다.PixelCopy + CPU bitmap + generation
마커가 두 번 나타납니다정확히 한 번만 입력하면 실패합니다.새로운 nonce는 시간 초과 배치가 재실행과 겹친다는 것을 증명합니다.
Wi-Fi 연결이 끊겼다가 복원되었습니다.Mosh는 NAT 간 로밍을 완료합니다.동일한 세션만 ​​복원되도록 선언하세요. 실제 로밍은 네트워크 ID에 따라 다릅니다.
Metro 콜드 스타트 ​​ANR2.5초 렌더러 지연이 멈춤내장/캐시된 번들 콜드 스타트가 재발되지 않습니다.
05 / THE LONG GOAL

"완전 자동화"의 진실: 사람이 없는 것이 아니라, 사람은 가치 있는 곳에만 나타난다

이번 목표의 논리적 기간은 21시간 54분 42초이지만 시스템 가동 시간은 더 짧습니다. 이는 절전 모드를 고집하는 신비한 프로세스가 아니라 Git, tmux, 폴링 가능한 도구, 계획 상태, 검토 핸드오프 및 외부 시스템 상태에 의존하여 지속적으로 컨텍스트를 복원하는 것입니다.

이 라운드의 사용자는 실제 참여가 거의 없습니다. RevenueCat에 로그인하고 Chrome/Google 개발자 콘솔에서 계정 소유자의 확인이 필요한 몇 번의 클릭을 완료하고 커밋/푸시와 같은 되돌릴 수 없는 작업에 대해 명시적인 권한을 부여합니다. 로그인 상태 검색, 대부분의 Play 양식 작성 및 사실 확인, gcloud/권한 열기, API 생성, 기기 확인, 구매/복원 테스트, 스크린샷 기록, 오류 복구 및 정렬은 모두 목표 자체에 의해 폐쇄 루프입니다.

flowchart TB
  O["안정적인 목표 목표"] --> P["단계 계획 및 증거 임계값"]
  P --> G["힘내 원자 커밋"]
  P --> T["tmux 및 폴링 가능한 도구"]
  P --> E["기기 및 외부 서비스 상태"]
  P --> R["독립 검토자 평결"]
  G --> C["프로세스 또는 부팅 변경 후 계속"]
  T --> C
  E --> C
  R --> C
  C --> P
            
그림 7: 장기 목표의 지속성은 절대 종료되지 않는 프로세스가 아니라 복구 가능한 상태에서 비롯됩니다.

먼저 기계를 읽고 코드를 작성하세요

브라우저, CLI, 장치, 로그인 상태, 기존 iOS 계약 및 창고 더티 상태가 모두 먼저 식별됩니다.

먼저 탈출구를 보장하라

Ghostty, Mosh, Billing 및 OTA/네이티브 왜곡은 모두 새로운 기능을 활성화하기 전에 실패 방향을 정의합니다.

실제 장치와 서비스가 말을 하게 하세요

연결된 테스트 뒤에는 실제 SSH, UDP, FCM, Play, RevenueCat 및 Pixel 레이어가 이어집니다.

각 고위험 라인은 센티넬을 개별적으로 통과합니다.

P1/P2는 끝까지 백로그되지 않습니다. 검토자는 코드를 승인한 다음 장치 증거를 승인합니다.

정확한 화이트리스트 제출

병렬 작업 트리는 연행되지 않으며 임시 프로필, 미디어, 고정 장치 및 비밀은 시간에 맞춰 정리됩니다.

06 / THE SURPRISE LEDGER

최종 차이점이 알려주지 않는 10가지

🕵️

허가 입구를 직접 찾아보세요

사용자에게 환경을 다시 설명하도록 요구하는 대신 기존 Chrome 컨텍스트에서 작동할 수 있는 계정을 결정합니다.

📸

CDP가 없다면 먼저 스크린샷을 찍어두세요.

OS 계층이 동의하면 사용자는 필요한 인증을 한 번만 수행한 다음 다시 DOM 자동화로 전환합니다.

🧰

도구가 부족하면 가장 작은 도구를 만들어라

MCP, Play 카탈로그, AAB 업로드 및 RevenueCat의 현장 생성은 클라이언트를 조정합니다.

🔐

SA 2개, 마스터 키 없음

청구 및 게시자가 분리되어 있으며 GCP IAM 및 Play 앱 권한은 계층적입니다.

🧯

강제 실패로 인해 세션이 손실되지 않습니다.

렌더러가 충돌하고 표면이 변경되지만 전송 및 기록은 계속 작동합니다.

🎞️

영상이 해킹된 경우 증거물은 교체됩니다.

제품에 대한 결론을 도출하기 위해 깨진 컬렉션 체인을 사용하지 마십시오.

🧪

DEV 솔기, 위조제품 차단에 성공

디버그 주입은 여전히 ​​제품 관리자/네이티브 게이트를 통과하며 DEV Pro를 증거로 부적절하게 구매합니다.

🧭

적극적으로 진술 범위를 좁혀라

Wi-Fi 복구는 복구이지 다른 NAT 로밍을 가장하는 것이 아닙니다.

🧹

청소도 배달해준다

스크린샷, 비디오, 프로필, 고정 장치, DB, 회전 및 입력 방법 상태가 복원됩니다.

🪶

복잡성을 재사용 가능하게 만들기

JSONL 포렌식, CDP, 장치 증거, Play/RC 부트스트랩이 모두 매뉴얼에 포함되어 있습니다.

07 / THE REUSABLE PLAYBOOK

다음 앱에서 직접 복사할 수 있는 것은 무엇입니까?

Goal-driven Porting, v1

  1. 계약서를 작성할 때 "iOS처럼 하세요"라고 쓰지 마세요. 성공, 실패, 대체 및 사용자에게 표시되는 의미를 명확히 합니다.
  2. 먼저 권위를 찾으십시오. 브라우저 로그인 상태, Cloud IAM, 스토어 권한, 기기, 서비스에 대한 최종 결정권자는 누구입니까?
  3. 첫 번째 장애가 발생했습니다. 새로운 기본, 청구 및 OTA 편향에는 작동할 수 있는 이전 경로가 있어야 합니다.
  4. 도구가 부족하면 얇은 다리를 만드세요. 마지막 마일만 해결되며 기본값은 일시적이고 관찰 가능하며 파괴 가능합니다.
  5. 가설을 통해 장비를 테스트합니다. 에뮬레이터, 오래된 실제 기계 및 OEM 대형 화면에는 모두 수량 게임이 아닌 자체 작업이 있습니다.
  6. 고유한 마커 + 여러 오라클. 픽셀, 구조, 시스템, 전송 및 원격 엔드에는 최소 2개의 상호 인증이 있어야 합니다.
  7. 4xx를 지도로 생각해보세요. 범위, IAM, 앱 권한, 청구 권한 계층적 위치 지정.
  8. 각 위험 경계는 개별적으로 검토됩니다. P1/P2를 소규모 배치로 종료하고 실제 서비스를 다시 실행합니다.
  9. 진짜 사람이 필요할 때 나타나세요. 이 라운드에는 실제로 로그인, 몇 번의 동의/콘솔 클릭 및 git 부작용 인증만 포함됩니다. 다른 프로젝트에 MFA, 법적 사실 또는 생산이 관련된 경우 이러한 대체할 수 없는 경계는 다른 프로젝트에 맡겨집니다.
  10. 경계를 정리하고 적어 두십시오. 비밀, 고정 장치, 과장된 "패스" 및 반복할 수 없는 영웅적인 이야기를 남기지 마십시오.

마지막 반직관적 결론

진정으로 소통 가능한 AI 엔지니어링 이야기는 "22시간 연속으로 작동했다"는 것이 아니라 "언제 스스로 해야 하는지, 언제 증거를 찾아야 하는지, 언제 스크린샷이 신뢰할 수 없다는 것을 인정해야 하는지, 언제 사람들이 클릭하게 해야 하는지 알고 있었다"는 것입니다. 자동화의 상한은 클릭수가 아니라 경계감에 따라 결정됩니다.

최고의 대리인이 귀하를 대신하여 모든 결정을 내리지는 않습니다. 결정이 실제로 필요할 때 참여를 몇 번으로 압축합니다.