Skip to content

research: validate Dots lifecycle, recovery, and proxy compatibility #20

Open

Description

@abruption

2026-10-23 현재 진행

검토용 Draft PR: #46. 현재 설치 네 소스·manifest가 v0.4.0과 일치하고 기존 SSH 호스트 키가 유지됨을 새 strict SSH로 확인했습니다. 복구 후와 같은 부팅 환경에서 자원 기준값을 수집했습니다. 2026-10-23 10:46 KST부터 10-24 10:46 KST까지 24시간·5분 간격 읽기 전용 관찰을 진행 중입니다. 상한에 도달하면 수집기만 종료합니다.

같은 부팅의 프로세스 종료 복구, 다른 부팅 문맥에서의 Dots 시작 명령 실행, 완전 무인 자연 장애 복구를 구분합니다. 마지막 항목은 여전히 미검증이며, VM 재부팅/교체의 정확한 플랫폼 의미와 workspace 전체 보존도 단정하지 않습니다. watchdog은 사용자 요청에 따라 중지된 상태를 유지합니다.

목적

dots-tailscale의 상태 보존, 재기동, 실행 위치별 접근 차이, 장시간 연결 복구 및 플랫폼 프록시 의존성을 증거 기반으로 확인합니다. 다섯 주제를 하나의 리서치 이슈로 추적하고, 재현된 결함이나 구체적인 구현 과제는 관련 이슈와 중복되지 않도록 분리합니다.

이 이슈는 지원 가능한 조건과 한계를 정리하기 위한 연구입니다. 자동 복구 구현이나 특정 릴리스 포함을 약속하지 않습니다.

현재 문서에 기록된 사실과 미검증 사항

한국어 사용 가이드의 2026-10-15 검토 기준:

  • 설치 파일·Tailscale state·SSH identity는 /workspace, socket·PID·로그는 /tmp에 둡니다.
  • 이전 버전에서 24시간 이상 동작하고 환경 교체 후 수동으로 재기동한 사용자 관찰이 기록돼 있습니다.
  • 2026-10-14 수정 shim 배포 후 DERP ping과 엄격한 호스트 키 검증을 유지한 SSH 공개키 로그인·명령 실행은 확인됐습니다. 수정본으로 이후 환경 교체를 거친 복구는 아직 관찰하지 않았습니다.
  • 자동 시작·Dots 자동화 등록 기능은 구현되지 않았고, Dots 자동화로 기동하는 방식도 시험하지 않았습니다.
  • 로그는 재기동 시 1 MiB 초과 파일을 한 세대 회전합니다. 계속 실행 중인 로그 크기에는 상한이 없습니다.
  • HOME 관찰 marker 변화만으로 HOME 전체 초기화나 VM 교체를 입증할 수 없습니다.

실제 배포본과 현재 소스의 일치 여부, 새 환경에서의 자동화 실행 가능성, 장기 단절 후 복구·자원 추이는 이번 이슈 등록으로 검증된 것이 아닙니다.

조사 범위

1. 환경 교체 후 상태 보존

  • /workspace, HOME, runtime 파일의 유지·소실 조건과 Tailscale 장치 신원·SSH 호스트 키 연속성을 확인합니다.
  • 단순 프로세스 재시작, HOME 파일 변화, 실제 환경 교체를 구분합니다.
  • 비밀을 포함하지 않는 관찰 결과를 환경 밖에 보관하고 전후 비교합니다.
  • 결과에 따라 보존 조건, 인증 상태 소실 시 중단 조건, 수동 복구 절차를 정리합니다.

2. 자동 재기동 가능성과 독립적인 실행 경로

  • Tailscale이 정지된 새 환경에서도 플랫폼 측 실행 경로로 start.sh를 호출할 수 있는지 확인합니다.
  • 호출 자체가 Tailscale 연결에 의존하는지, 필요한 권한·파일·인증 상태가 무엇인지 확인합니다.
  • 중복 호출과 실패 시 동작을 구분하고, 지원 가능한 자동 시작 범위 및 독립적인 수동 복구 경로를 정리합니다.
  • 자동화 등록·상시 서비스 도입은 연구 결과와 별도의 구현 결정으로 남깁니다.

3. 실행 위치별 접근 차이

  • 동일 버전·설정을 기준으로 Dots 에이전트, GUI 터미널, SSH의 UID, 파일 소유권·접근, PATH, socket, 프록시 및 네트워크 접근을 비교합니다.
  • “터미널에서는 되지만 에이전트에서는 안 되는” 경우를 관찰 가능한 차이로 설명합니다.
  • 접근 제한은 우회하지 않고 지원 조건과 제한으로 기록합니다. 실행 환경 차이로 확인할 수 없는 항목은 미검증으로 남깁니다.

4. 장시간 연결과 자동 복구

  • 격리 환경에서 프록시·DERP 연결 단절과 복구를 시험합니다.
  • 복구 시간, 연결 수, 프로세스·스레드·파일 디스크립터 및 로그 증가를 기록합니다.
  • 장기 관찰 기간, 부하, 단절 시나리오, 성공·중단 조건은 시험 전에 정합니다.
  • 자동 복구되는 조건과 재시작이 필요한 조건을 구분합니다. 기존 연결의 생존과 새 연결 성공도 별도로 확인합니다.

5. 플랫폼 프록시 변경에 대한 호환성

  • shim이 의존하는 HTTP CONNECT, TLS, Upgrade/WebSocket 동작과 단계별 실패 지점을 문서화합니다.
  • 격리 fixture로 호환성 회귀 확인 절차를 마련하고, 현재 플랫폼에서 관찰된 동작과 가정을 구분합니다.
  • 지원 조건과 실패 시 진단·복구 안내를 정리합니다. 미래 플랫폼 변경에 대한 호환성을 보장하지 않습니다.

완료 조건

  • 다섯 주제별로 시험 조건, 소스·배포 리비전, 재현 절차, 관찰 결과, 한계 및 미검증 사항이 정리돼 있습니다.
  • 상태 보존 결과는 실제 환경 교체 증거와 구분됩니다. 교체를 관찰하지 못했다면 관찰 대기로 명시하고 검증 완료로 처리하지 않습니다.
  • 자동 재기동의 가능·조건부 가능·불가 또는 근거 부족 판정과 독립적인 수동 복구 경로가 정리돼 있습니다.
  • 실행 위치별 차이를 비교하고, #17의 CLI·doctor 설계에 필요한 진단 근거를 연결합니다.
  • 사전에 정한 관찰 범위에서 연결 복구와 자원 증가를 평가하고 재시작 필요 조건·알려진 한계를 정리합니다.
  • 플랫폼 프록시의 지원 조건, 단계별 실패 지점 및 격리 호환성 점검 절차를 제공합니다.
  • 확인된 결과와 복구 안내를 영어·한국어 문서에 반영하고, 미실행 시험이나 관찰 대기 항목을 명확히 남깁니다.
  • 후속 구현이 필요하면 근거와 범위를 정리해 기존 관련 이슈에 연결하거나 별도 제안으로 분리합니다.

안전 및 범위 제한

  • 상태·개인키를 삭제하거나 복제하지 않습니다. 공개 결과에는 자격 증명, 실제 내부 호스트·tailnet 식별자, 민감한 로그를 포함하지 않습니다.
  • 격리 시험을 우선합니다. 서비스 중단을 유발하는 실환경 시험은 별도 승인, 제한된 범위, 독립적인 복구 경로 및 롤백 계획을 확보한 뒤 수행합니다.
  • 플랫폼 보안·네트워크 제한 우회, 전역 프록시 변경, Exit Node 구현은 범위 밖입니다.
  • 이슈 등록 자체는 코드 실행, 실환경 장애 주입, 자동화 등록 또는 배포 승인을 의미하지 않습니다.

관련 작업

Activity

  1. abruption commented on Oct 15, 2026

    @abruption
    OwnerAuthor

    1차 조사 결과 — 2026-10-15

    현재 소스의 정적 조사와 실제 Dots 클라우드 GUI 터미널의 읽기 전용 관찰을 진행했습니다. 배포된 setup/shim은 검토 소스와 hash가 다릅니다. 따라서 아래 소스 분석과 실환경 관찰을 구분합니다.

    검토 기준과 배포 비교

    검토 커밋: 643484b35dadd46ce4a257b4256717e16d6b99d9. 조사 시점 default branch의 setup/shim/probe 파일 blob이 해당 커밋과 각각 일치했습니다. 소스 본문의 SHA-256과 배포 파일의 SHA-256을 비교했습니다.

    SHA-256 비교 결과:

    • 배포 setup.sh와 검토 소스 tailscale-setup.sh: 불일치
    • 배포 shim.py와 검토 소스 shim.py: 불일치
    • 배포 start.sh와 검토 소스가 생성하는 wrapper: 일치

    배포 hash 원문은 생략합니다. 정확한 배포 리비전과 차이의 원인은 아직 확인하지 못했습니다. wrapper 일치만으로 배포된 setup/shim이 현재 main 또는 v0.2.0과 같다고 판단하지 않습니다.

    1. 환경 교체 후 상태 보존

    소스에서 확인한 내용

    • 기본 설치·state·SSH identity는 /workspace, runtime socket·로그는 UID별 /tmp 경로를 사용합니다.
    • 인증 이력 marker가 있는데 state가 없으면 start가 중단됩니다. 기존 설치의 SSH host key 소실 시 자동 신원 교체를 거부하는 조건도 있습니다.
    • HOME 관찰 도구는 marker·latest·history를 쓰는 도구입니다. marker 소실만으로 HOME 전체 초기화나 VM 교체를 입증하지 않습니다.

    근거: 기본 경로, 기동 전 상태 확인, 관찰 도구의 판정과 쓰기.

    현재 환경 관찰

    • 현재 클라우드 셸의 파일시스템 정보를 읽기 전용으로 확인했습니다. 실제 환경 교체 전후 비교가 없으므로 영속성의 증거로 삼지 않습니다. 세부 mount·소유자 정보는 공개하지 않습니다.

    2. 자동 재기동과 독립적인 실행 경로

    소스에서 확인한 내용

    • start.sh는 자기 디렉터리의 setup.sh를 로컬 Bash로 호출합니다. 설치된 start 경로에 다운로드나 SSH 호출은 없습니다.
    • setup은 필요한 shim → tailscaled → sshd를 기동하고, 실행 중인 구성요소는 재사용합니다. flock으로 동시 작업을 거부합니다.
    • 기존 tailnet 연결이 있어야 로컬 start 호출을 할 수 있다는 의존성은 이 코드에 없습니다. 다만 플랫폼 자동화가 새 환경에서 이 명령을 실행할 수 있는지는 별도 검증 대상입니다.
    • setup에 상시 감시·자동 재실행 루프는 없습니다. nohup만으로 프로세스나 환경 교체 후 자동 기동이 보장되지는 않습니다.
    • start는 파일·권한·프로세스·marker를 변경하므로 이번 읽기 전용 실측에서는 실행하지 않았습니다.

    근거: wrapper와 구성요소 기동, lock·인증 분기·종료 상태.

    현재 환경 관찰

    • 일반 사용자 권한의 namespaced 클라우드 셸에서 관찰했습니다. systemd 기반 자동 기동의 가용성은 확인하지 않았습니다.
    • 이 관찰만으로 모든 자동 시작 수단의 가능·불가를 판단하지 않습니다. 플랫폼의 독립적인 자동화 실행은 미검증입니다.

    3. 실행 위치별 접근 차이

    소스에서 확인한 내용

    • runtime socket은 UID에 따라 정해지고 내부 CLI는 설치된 바이너리에 --socket을 명시합니다. 전역 tailscale 명령과 조건이 다릅니다.
    • preflight는 Linux x86_64, 필요한 명령의 PATH 해석, /usr/sbin/sshd, 일반 사용자 22번 포트 바인딩 조건을 확인합니다.
    • setup의 프록시·CA 환경변수는 해당 프로세스와 자식에 전달됩니다. 다른 셸·에이전트·MCP·플러그인으로 자동 전파하는 코드는 없습니다.

    근거: socket·CLI, preflight, 프로세스 환경.

    현재 환경 관찰

    • 이번 실측은 실제 Dots 클라우드 GUI 터미널 한 실행 문맥에 한정됩니다.
    • 에이전트·GUI·SSH 전체가 같은 머신/namespace, 파일 가시성, PATH, socket 접근성을 가진다고 일반화할 수 없습니다. 세 문맥의 동시 비교는 하지 않았습니다. 사용자·그룹 ID와 namespace 식별 정보는 공개하지 않습니다.

    4. 장시간 연결·자원·복구

    소스에서 확인한 내용

    • shim의 연결 준비 timeout은 15초이고 성립한 raw/control/DERP stream은 blocking 장기 연결로 전환됩니다.
    • handler 종료 시 shutdown → worker join → close 정리 경로가 있습니다. 새 연결마다 handler thread를 생성합니다.
    • shim에 실패한 동일 upstream 세션을 복원하는 재접속 루프는 없습니다. 상위 tailscaled의 재접속과 새 연결 성공은 실측으로 구분해야 합니다.
    • 로그 회전은 해당 프로세스를 기동하는 분기에서만 호출합니다. 1 MiB 초과 파일을 .1 한 세대로 이동하며, 실행 중 주기적인 크기 제한은 없습니다.
    • 이러한 구조만으로 누수나 복구 실패가 입증되지는 않습니다.

    근거: timeout 정책, blocking 전환, 종료 정리·listener, 로그 회전.

    현재 환경에서의 짧은 관찰

    • 06:15:12 → 06:18:31 UTC, 199초 동안 동일 tailscaled 프로세스를 비교했습니다.
    • process elapsed: 13,902 → 14,101초
    • RSS: 40,888 KiB → 40,888 KiB
    • threads: 14 → 14
    • ps의 process-lifetime CPU 표시: 0.2% → 0.2%. 이 값은 199초 구간 CPU 사용률이 아닙니다.
    • FD: 19 → 19. FD 첫 표본은 약 06:16:29 UTC이며 위 06:15:12 표본과 시작 시점이 다릅니다.
    • 약 06:16:29 → 06:18:31 UTC의 로그 크기: tailscaled 11,835 bytes, sshd 327 bytes, shim 39 bytes로 각각 변화가 없었습니다.
    • 약 06:19:27 UTC에 최대 10초로 제한한 로컬 status에서 BackendState만 추출한 결과는 Running이었습니다. 원시 status나 peer 정보를 공개하지 않았습니다.

    이 결과는 해당 짧은 정상 관찰 구간의 안정 상태입니다. 장기 안정성, 누수 부재, 프록시/DERP 단절 후 복구, 새 원격 연결 성공 또는 SSH 인증 성공을 검증한 결과가 아닙니다.

    5. 플랫폼 프록시 호환성

    소스에서 확인한 내용

    • setup은 인증정보 없는 HTTP proxy URL을 지원합니다.
    • tailscaled는 localhost shim과 CA bundle을 사용하는 환경으로 기동합니다.
    • shim은 업스트림 TLS에서 http/1.1 ALPN을 지정하고 Tailscale control/DERP의 raw Upgrade를 WebSocket으로 변환하도록 작성됐습니다.

    근거: shim 설계·TLS 설정, proxy URL 처리·자식 환경.

    현재 플랫폼의 실패 응답·단절·호환성 변경을 주입하지 않았습니다. 현재 배포 shim도 검토 소스와 다르므로 이 정적 설명을 배포본의 전체 동작이나 미래 호환성 보장으로 해석하지 않습니다.

    남은 검증과 다음 순서

    1. 배포 setup/shim의 정확한 리비전 또는 검토 소스와의 차이를 읽기 전용으로 확인해 분석 기준을 일치시킵니다. 자동 업데이트나 재시작은 하지 않습니다.
    2. 동일 시점·동일 설치를 기준으로 에이전트/GUI/SSH 실행 문맥의 UID·namespace·PATH·socket 접근 차이를 비교합니다.
    3. 실제 환경 교체를 관찰할 때 비밀 없는 전후 기록과 신원 연속성을 비교합니다. 단순 process restart를 환경 교체 검증으로 대체하지 않습니다.
    4. 별도로 범위·관찰 기간·부하·복구 및 중단 조건을 정한 뒤 장기 관찰과 격리 단절 시험을 진행합니다. 서비스에 영향을 주는 실환경 시험은 승인과 독립 복구 경로가 필요합니다.
    5. 새 환경에서 플랫폼 측 경로로 start를 호출할 수 있는지 확인하기 전까지 자동 재기동은 미검증으로 유지합니다.

    이번에는 코드·설정·서비스·인증 상태를 변경하지 않았고, 장애 주입·VM 교체·새 원격 연결·인증 시험·자동화 등록을 수행하지 않았습니다. 이슈의 완료 체크박스와 마일스톤도 변경하지 않습니다.

  2. added
    priority: highInvestigate or implement next; unblocks current reliability or planned work.
    on Oct 17, 2026
  3. added this to the Research milestone on Oct 17, 2026
  4. abruption commented on Oct 17, 2026

    @abruption
    OwnerAuthor

    Research update — 2026-10-18

    Priority: high. Assigned to Research. Investigate the independent restart path and execution contexts first; treat long-duration and replacement observations as continuing research.

    Confirmed observations

    • The 2026-10-17 bounded test launched a detached Python process over SSH, closed that SSH session, and observed three ticks at four-second intervals from a new session. The probe then exited/was cleaned up. This establishes short-term survival after SSH disconnect, not survival after VM replacement or long-term supervision.
    • Today's SSH context is UID/GID 1000, PID 1 bwrap, with UID mapping 1000 0 1. /workspace is writable and the per-user Tailscale socket is visible. cron/crond/crontab and the user systemd bus are absent, consistent with the earlier systemctl --user offline result.
    • Installed setup.sh and shim/shim.py hashes match the v0.2.0 release. Backend is Running with no reported health warnings. No daemon restart or configuration change was performed in this investigation.
    • Three read-only samples over ten seconds found one shim and one tailscaled. Shim held nine threads, twelve file descriptors and about 18.5 MiB RSS; tailscaled held fourteen threads, twenty-one file descriptors and about 40.5–40.7 MiB RSS. The daemon log increased by 192 bytes. This is a sampling-method baseline, not a leak or long-duration stability result.

    Independent scheduling path

    Official Dots documentation describes recurring work with saved schedules and cloud-computer execution. This makes a platform-scheduled recovery task a candidate worth testing. The consulted docs do not establish a VM-creation hook, guaranteed access to the same workspace after replacement, or guaranteed unattended execution of this startup script. The inspected dot action menu exposes reboot, but no startup-hook setting was observed there; this limited UI observation does not establish that no such feature exists elsewhere.

    Sources: Dots tasks and memory, computers and apps, scheduled tasks.

    Next bounded experiment

    1. Use a single platform-triggered read-only probe to record execution location, UID, workspace readability, socket visibility and timestamps without relying on tailnet SSH. Confirm where the run actually executed.
    2. Compare that result with GUI-terminal and SSH probes. Do not infer agent-context visibility from an SSH result.
    3. If the independent path is established, evaluate a bounded, idempotent startup request and externally verify backend readiness plus actual SSH. Observe a natural later environment change; retain evidence outside the VM.
    4. For long-duration recovery testing, define duration, fault fixture, resource thresholds and abort/rollback conditions before running it.

    No schedule or permanent background loop was created, no VM replacement was forced, and no long-duration recovery claim is made. The application-proxy research in #18 can proceed alongside this investigation; its resulting diagnostics feed #17.

  5. abruption commented on Oct 17, 2026

    @abruption
    OwnerAuthor

    Execution-context comparison — 2026-10-18

    Performed the next bounded read-only experiment at approximately 08:50–08:54 KST. The same probe inspected code-file metadata/hashes, namespace fingerprints, tool availability and the local Tailscale socket. No key or authentication-state content was read; no daemon was restarted and no scheduled task was registered.

    Provenance

    • SSH: executed directly over strict-host-key SSH; JSON collected outside the VM.
    • GUI terminal: executed by keyboard through the platform's cloud-computer web UI, without SSH as the execution transport. Only the diagnostic stdout was redirected into a private research directory; the resulting JSON was retrieved separately over SSH.
    • Dots direct Bash: requested through the Dots conversation UI, explicitly excluding SSH, GUI, connected personal computers and fallback routes. Dots reported functions.exec → tools.exec_command, /bin/bash, login=false, and returned the JSON stdout. This is agent-reported execution evidence, not a separately captured raw tool trace.

    Results

    Observation SSH GUI terminal Dots direct Bash (reported)
    Installed setup/shim hashes v0.2.0 match same same
    Python 3.13.5 3.13.5 3.12.14
    PID 1 command bwrap bwrap codex
    mount/user/PID/network namespace fingerprints baseline all match SSH all differ from SSH
    Workspace access readable/writable readable/writable readable, not writable
    Installed start script readable/executable readable/executable readable/executable, not writable
    Private Tailscale socket visible visible missing
    Local backend query Running Running not attempted: socket missing
    Global tailscale in PATH absent absent absent

    All three report the same effective UID/GID; equal UID alone therefore does not establish identical execution context or socket visibility. The agent also reported proxy/CA environment variables present, whereas SSH had those variables absent. Values were not collected.

    A second direct-Bash read-only statvfs(...).f_flag & ST_RDONLY check reported /workspace and the installation directory read-only, and its own /tmp writable. No write attempt, permission change, namespace entry or remount was used to test/override that restriction.

    Implications for recovery and #17

    1. A one-shot platform-triggered agent probe can read the persisted installation, without using tailnet SSH to execute it.
    2. The tested direct-Bash context cannot access the existing daemon socket, and its installation/state location is read-only. Readable/executable start.sh alone is insufficient evidence that the current startup procedure can recover the GUI/SSH environment from this context.
    3. The cloud GUI is a distinct platform execution entry point and shares the tested SSH runtime. This run establishes successful GUI diagnostic execution; it did not stop Tailscale first or prove unattended recovery after replacement.
    4. CLI/doctor results must distinguish missing socket in the current context from a daemon being globally stopped. A healthy SSH environment must not be generalized to the direct agent context. This is diagnostic/documentation input for feat: add socket-aware CLI and layered doctor diagnostics #17/feat: add v0.3.0 CLI diagnostics and opt-in outbound proxies #24, not evidence of a new transport defect.

    Remaining work

    • Determine whether a scheduled Dots task can deliberately use the supported cloud-GUI execution path, and record its actual execution context; direct Bash cannot be assumed equivalent.
    • Only after that path is established, plan a bounded startup/recovery test with an independent recovery route. No permanent schedule or background supervisor was created here.
    • Natural environment replacement, persistent identity continuity, long-duration resource trends and injected-disconnection recovery remain unverified. Keep research: validate Dots lifecycle, recovery, and proxy compatibility #20 open in Research.

    Official product documentation describes cloud-computer and recurring-task entry points, but does not establish a VM-start hook or guarantee the execution namespace: computers and apps, tasks and memory.

  6. abruption commented on Oct 18, 2026

    @abruption
    OwnerAuthor

    후속 이슈 연결 — 2026-10-18

    논의한 구현 과제를 별도 등록했습니다. 이 이슈는 예약 실행·독립 복구 경로·환경 교체·장시간/단절 복구 연구를 계속 담당하며 동일 연구 이슈를 중복 생성하지 않습니다.

    Next release는 차기 계획 묶음이며 버전 번호나 출시일은 확정하지 않았습니다. 자동 업데이트는 VM 교체 뒤 실행 주체가 없는 문제의 해결책으로 간주하지 않습니다. 이번 등록에서 예약·상시 서비스·실환경 장애 주입은 수행하지 않았습니다.

  7. abruption commented on Oct 19, 2026

    @abruption
    OwnerAuthor

    Bounded watchdog trial started — 2026-10-19

    User-authorized 24-hour trial began at 2026-10-19 13:12:59 KST, planned completion 2026-10-20 13:12:59 KST. This is an operational experiment, not a package feature or a completed stability result.

    • Standalone Python watchdog under /workspace, detached from the SSH session in the GUI/SSH execution environment. Single-instance flock; approximately 60-second observations; three-minute failure grace.
    • Read-only samples include local backend, SSH banner, component presence, RSS/thread/FD counts for watchdog/tailscaled and log sizes. Credentials and raw status output are not logged.
    • Recovery only invokes the installed start.sh, with a bounded startup/readiness period, installation lock checks, 15/30/60-minute cooldown and at most three attempts. Authentication-required states do not trigger login. Pending/uncertain proxy changes defer recovery.
    • It does not kill existing service processes or remove stale sockets; those conditions may require manual intervention. A timed-out startup disables further automatic recovery attempts.
    • A separate Mac observer collects strict-host-key SSH status every five minutes and retains results outside Dots. The existing Telegram monitor remains unchanged. Both trial processes are time-bounded.
    • Six isolated decision-policy checks passed; the initial live sample reported healthy backend/components/SSH and zero recovery attempts. No intentional live fault injection is scheduled.

    Evaluation: observation continuity, duplicated/repeated actions, local and external readiness, resource/log growth, and any natural recovery attempts. No-fault operation would establish observation stability only, not fault recovery. VM replacement can end this watchdog and is not automatically repaired by it. Results will be evaluated after the observation window.

    Current service-manager inspection: PID 1 is bwrap; systemctl system/user both report offline; cron/crond/crontab are absent; system directories are not writable in this context. A userspace scheduler could be investigated separately but would still need a post-replacement bootstrap.

  8. added
    researchFeasibility work; implementation and release scope remain conditional on evidence.
    on Oct 19, 2026
  9. abruption commented on Oct 19, 2026

    @abruption
    OwnerAuthor

    Observation extended to continuous mode — 2026-10-19

    At the maintainer's request, removed the planned next-day termination. The original bounded watchdog was explicitly stopped and its records retained; this is an early transition, not a completed 24-hour trial. No recovery attempts had occurred before transition.

    A new continuous watchdog started at 2026-10-19 15:04:01 KST, reporting continuous=true, planned_end_utc=null, healthy backend/components/local SSH and zero attempts. Only the watchdog process was replaced; Tailscale was not restarted.

    • Approximately one-minute checks and three-minute grace remain.
    • Recovery is capped at three attempts in a rolling 24-hour window, with 15/30/60-minute cooldown. Total lifetime attempts are recorded separately. Seven isolated policy tests passed, including recovery-budget rollover.
    • Startup timeout disables further automatic recovery pending manual attention; authentication-required states do not initiate login.
    • The Mac external observer also continues without a planned expiry. Local observations and remote events rotate at 2MiB with one previous file; sanitized remote snapshots are retained outside Dots approximately hourly.
    • Existing Telegram monitoring is unchanged. This does not add a VM-creation hook or restart the watchdog after VM destruction.

    Natural faults/recovery and replacement survival still require evidence; healthy observation alone does not prove those properties. The scripts remain an operational experiment outside the published package.

  10. abruption commented on Oct 20, 2026

    @abruption
    OwnerAuthor

    Continuous watchdog results and runtime loss — 2026-10-20

    Follow-up to the continuous observation started on 2026-10-19 at 15:04:01 KST. The watchdog remains an operational experiment outside the published package. This investigation used existing logs, strict-host-key SSH, process metadata and the local experimental scripts; no fault was injected and no watchdog or daemon was restarted by this investigation. The maintainer separately reported manually restoring connectivity.

    Timeline (KST, UTC+09:00)

    Time Evidence
    Oct 19 15:04:01 Continuous watchdog started, with no planned expiry.
    Oct 20 18:39:04 Last successful external observation before loss: process alive, heartbeat at 18:38:45, elapsed 99,283 seconds (27h 34m 43s), healthy, zero recovery attempts.
    18:44:08–19:09:48 Six consecutive external SSH failures, exit 255. The observer did not retain stderr, so the SSH failure layer cannot be classified from these rows.
    Approximately 18:46:03 Current kernel boot time estimated from wall clock minus /proc/uptime.
    Approximately 18:53:08 Current PID 1 (bwrap) start estimated from process start ticks and uptime.
    Approximately 19:11:34 Current Tailscale daemon and SSH server start times; consistent with the maintainer's manual restoration.
    Subsequent inspection Tailscale reports Running/online and SSH works, but the old watchdog process is absent.

    The current kernel's uptime is much shorter than the previous watchdog's measured lifetime. Together with the lost process and newly started runtime, this strongly supports runtime reboot/replacement. It does not identify the platform trigger or distinguish every kind of VM replacement, reboot or restored runtime. There is no stored pre-event boot ID for direct before/after comparison. Times derived from wall clock/uptime are estimates.

    Workspace persistence: older log contents returned

    Current Dots heartbeat.json and events.jsonl end at 17:39:43, but external observations prove that the same watchdog remained alive until 18:39. The external events snapshot includes records through 18:33:45.

    A byte comparison shows that the entire current events file is an exact prefix of the external snapshot: 1,597 current records versus 1,651 snapshot records, with 54 later records absent on Dots. This is stronger than an mtime-only observation. It is consistent with older persisted contents being restored or a different older workspace view becoming active; the storage mechanism is unverified.

    Consequently, the current remote file's last timestamp must not be treated as the watchdog death time. An initial investigation inference of a 17:39 termination was corrected using the external evidence. File presence under /workspace also must not be interpreted as a guarantee that every latest write survives a runtime change. No authentication-state or private-key contents were inspected, and this result does not establish that those files rolled back.

    Stability before loss

    The preserved external observations contain 326 successful live-watchdog samples, all healthy, and zero recovery attempts. This establishes sampled observation stability for approximately 27h 35m, not successful fault recovery or uninterrupted application traffic between samples.

    Resource Observed range across external samples
    Watchdog RSS 16,512–17,064 KiB
    Watchdog threads / FDs 1 / 5 throughout
    Tailscale daemon RSS 25,088–45,280 KiB
    Tailscale daemon threads / FDs 14–15 / 19–21

    Daemon log size increased from 57,247 to 684,123 bytes; SSH log size from 13,072 to 188,017 bytes. Watchdog memory/thread/FD observations show no sustained growth in this window. This is not a general memory-leak guarantee.

    What the remaining logs cannot establish

    • Launcher output is empty; retained events contain no recovery attempt, exception report, normal stop or completion record.
    • Current watchdog source matches the locally retained experimental source by SHA-256.
    • Current runtime exposes neither the checked cgroup memory-event files nor a persistent journal directory; kernel messages are not readable with the current permissions. These checks cannot diagnose an OOM or termination in the previous runtime. Restrictions were not bypassed.
    • The current connection is manually restored, so it must not be counted as automatic watchdog recovery.
    • The exact prior termination time, platform shutdown trigger and workspace checkpoint policy remain unknown.

    Concrete follow-up work

    1. Observer correctness: derive status from process identity/liveness and heartbeat freshness, not only the persisted state=running. The current observer's summary can otherwise display running for a dead process. Retain a bounded, sanitized SSH error classification as well as exit status.
    2. Restart lifecycle: the experimental launcher intentionally refuses to reuse an existing trial directory/identity. Running launch again against old results does not restart a dead watchdog. Any supported bootstrap must create a new run identity and preserve prior evidence, with single-instance and recovery-budget behavior explicitly defined.
    3. Persistence experiment: record boot ID, namespace fingerprints, monotonically increasing sequence numbers and external receipt times before/after the next natural transition. A small controlled append/fsync/checkpoint experiment would help characterize lost-write windows; fsync alone must not be presented as a platform persistence guarantee. This experiment was not performed in this investigation.
    4. Independent startup path: test a supported platform/GUI startup route that works while tailnet SSH is unavailable. A watchdog inside the destroyed runtime cannot restart itself. Saved files, cron or another in-runtime supervisor do not alone solve that bootstrap dependency.
    5. Bounded fault recovery: still test recovery while the runtime remains alive, with a defined failure fixture and independent recovery route. This observation had no attempted recovery, so the restart policy is not validated by it.

    Sanitized evidence snapshots and the detailed local investigation notes were preserved separately before periodic observer snapshots could overwrite them. Raw private operational logs and host identifiers are not attached to this public issue. Keep #20 open: long-duration observation now has evidence, while persistence semantics, independent startup and actual fault recovery remain incomplete. No claim that the deployed package was upgraded to the latest release is made by this watchdog-only investigation.

  11. abruption commented on Oct 21, 2026

    @abruption
    OwnerAuthor

    Watchdog follow-up: boot changed and the new run directory disappeared — 2026-10-21

    After the maintainer manually restarted Tailscale, strict-host-key SSH works again and the local daemon reports Running/online. The watchdog itself is absent: no visible watchdog process exists, and the entire directory for the Oct 21 run (script, identity, heartbeat and logs) is missing. Older Oct 19 watchdog directories remain in the writable workspace.

    Evidence and timeline (KST)

    • 08:04: continuous watchdog launched; its boot ID was saved outside Dots.
    • 09:31: last successful external sample showed the watchdog alive/healthy after 5,222 seconds, with zero recovery attempts.
    • 09:34:37: peer last-seen time observed from the Mac.
    • 09:36: first failed external SSH sample.
    • Approximately 09:49: current kernel boot time, derived from wall clock minus uptime. The current boot ID differs from the saved launch boot ID.
    • Approximately 09:52: current PID1 runtime start.
    • Approximately 10:14:46: current Tailscale daemon and OpenSSH server started, consistent with the maintainer's manual restart.

    Unlike a heartbeat timestamp alone, the independently saved before/after boot IDs establish a boot/runtime change. They do not identify the platform trigger or storage restore mechanism. The missing new directory while older directories remain is consistent with an older restored workspace view; it does not prove that all workspace contents were lost.

    Why no automatic recovery can be claimed

    1. The current runtime has no watchdog process or even its new script directory. It cannot execute the recovery policy after this transition.
    2. The watchdog has a connectivity blind spot. Source inspection confirms healthy means local BackendState Running + local SSH banner + expected processes. It never probes peer/DERP connectivity or remote SSH. A Running daemon with broken external connectivity can still be marked healthy. The separate Mac observer only records results and has no recovery trigger.
    3. The blackout is not fully observed. There are no retained internal records after 09:31. The zero attempt count is the last confirmed value, not proof that no attempt occurred later. External failure preceded the current kernel's estimated boot by about 13 minutes, so runtime loss alone does not explain the entire earlier gap.

    The existing recovery action invokes start.sh, which normally reuses apparently running components. Adding a connectivity probe alone would not establish that a Running-but-isolated daemon is restarted or reconnected.

    Follow-up needs both a bounded connectivity-aware policy for a surviving runtime and a supported independent bootstrap after runtime loss. Preserve boot metadata, fresh heartbeat/liveness, and external evidence across each run. Sanitized observations and source snapshots were retained outside Dots. No new watchdog, daemon restart, configuration change or fault injection was performed by this investigation.

  12. abruption commented on Oct 21, 2026

    @abruption
    OwnerAuthor

    Bounded monitoring and recovery validation plan — 2026-10-21

    The maintainer authorized monitoring-accuracy improvements and recovery-scope validation before starting v0.4.0 implementation.

    Monitoring: keep external peer ping and fresh strict-host-key SSH separate from local backend readiness. Derive watchdog state from boot identity, PID/start ticks, heartbeat age and run sequence. Explicitly report missing scripts/metadata, dead process, stale heartbeat, changed boot, sequence regression, SSH authentication/host-key rejection and unavailable external transport. The Mac probe must still run when the watchdog directory disappears. Save sanitized evidence outside the VM every sample.

    Recovery tests: one fault at a time, exact same-UID executable/script/config identity revalidated with a pidfd. Send one SIGTERM to the shim or daemon for a bounded one-shot installed-start.sh recovery test; do not remove sockets, credentials or state. Separately stop only the SSH listener to exercise the continuous watchdog's real 60-second polling / 180-second grace. Preserve existing SSH sessions where OpenSSH supports this. No SIGKILL, forced VM replacement, route/ACL change, or authentication operation is part of these cases.

    Independent recovery: the maintainer confirmed that their cloud GUI terminal is controllable. This agent's browser control path has not worked, so that distinction will be recorded. Before each fault, arm a detached, single-attempt installed-start.sh fallback (180 seconds for a one-shot case; 420 seconds for the policy case). Stop further faults if graceful termination, local recovery, invariants, or fresh external SSH validation fails.

    Acceptance: same boot and public node identity, unchanged static configuration/code and public host-key fingerprint, new identity only for the deliberately terminated component, local readiness, and a new strict-host-key authenticated SSH command from the Mac. One-shot cases validate recovery mechanics, not production grace/backoff. Offline policy tests cover cooldown, attempt limit, auth-required and uncertain-process conditions; the listener case exercises the normal loop. Local readiness alone is not external recovery.

    Limits: an all-processes-present connectivity failure is observed externally but does not trigger a blind local restart. VM destruction still requires an independent bootstrap. Missing post-outage evidence remains unknown rather than zero attempts. The experimental scripts remain outside the released package.

  13. abruption commented on Oct 21, 2026

    @abruption
    OwnerAuthor

    2026-10-21 감시 정확도 및 제한된 복구 실측

    시험 범위

    • 실제 설치는 네 소스 파일의 체크섬 기준 v0.3.0입니다. 저장소의 v0.3.1과 구분하며 시험 중 패키지를 업그레이드하지 않았습니다.
    • 별도 실험용 watchdog으로 같은 VM에서 구성요소 하나씩 SIGTERM 종료했습니다. 개인키/인증 상태 초기화, SIGKILL, VM 교체는 수행하지 않았습니다.
    • 독립 복구 경로는 사용자가 제어 가능한 클라우드 터미널로 확인했고, 시험마다 분리된 지연 복구 프로세스를 준비했습니다. 에이전트가 웹 터미널을 직접 조작한 것은 아닙니다.

    실측 결과

    항목 결과 해석
    실행 디렉터리/identity 누락 각각 run_missing / identity_missing 과거 healthy 기록만으로 정상 판정하지 않음
    watchdog 일시 정지 process_suspended → 재개 후 verified_running 서비스 정상과 감시자 정상 구분
    shim 종료 후 명시적 단발 복구 3.41초, 새 SSH 및 ping 성공 시작 절차 검증; 주기적 자동 복구 성공으로 계산하지 않음
    tailscaled 정상 종료 후 명시적 단발 복구 6.89초, 새 SSH 및 ping 성공 정상 종료 시 소켓은 데몬이 정리; 강제 삭제하지 않음
    SSH 리스너 종료: 첫 자동 복구 시험 390.46초 내 복구 안 됨, 시도 0회 아래의 실험용 감시 판정 문제 발견
    첫 시험의 독립 fallback 420초 지연 후 start.sh 실행, 10:50:58 KST 로컬 복구 완료, 10:51:03 KST 새 SSH 확인 watchdog 자동 복구 성공과 구분
    판정 수정 후 SSH 리스너 종료 재시험 219.79초, 자동 복구 1회, 11:00:36 KST 로컬 검증 완료 새 엄격 SSH 접속과 Tailscale ping 별도 성공; fallback 불필요
    watchdog 중지 후 명시적 resume 정책 원장 전체 동일, 복구 횟수 1회 및 다음 시도 시간 유지 새 run ID가 이전 실행을 참조하며 연속 실행 재개

    각 구성요소 복구에서 같은 부팅, 같은 Tailscale 공개 노드 식별 정보, 동일 정적 파일 및 SSH 공개 호스트 키, 대상 프로세스만 교체, 다른 구성요소 PID 유지 조건을 확인했습니다. 비밀키/상태 파일은 해시하지 않았습니다.

    첫 자동 복구 실패 원인과 수정

    설치된 프로세스 검사기가 읽을 수 없는 같은 UID의 /proc 항목을 발견하면 전체 검사에 불확실성이 남습니다. SSH 리스너가 종료돼도 결과가 not_running 대신 unknown이 되어, 이번에 추가한 실험용 watchdog의 보수적 중단 조건이 복구를 막았습니다.

    수정한 감시자는 같은 부팅에서 직접 확인한 기존 PID/시작 시각/실행 파일의 종료를 입증하고, 대체 프로세스가 없고, IPv4/IPv6 리스너까지 없을 때만 해당 구성요소를 not_running으로 판정합니다. 접근 권한 오류만으로 종료를 추정하지 않습니다. 설치 스크립트의 독립적인 안전 검사도 유지합니다.

    이 원인은 이번 실험용 감시 코드의 실패를 설명합니다. 과거 VM 교체/실행 디렉터리 소실 사건의 원인으로 소급해서 단정하지 않습니다.

    감시 운영 및 남은 한계

    • 외부 감시는 ping과 새 SSH 접속, 현재 부팅/run ID, heartbeat 신선도, 실제 감시 프로세스 상태를 함께 확인합니다. 로컬 준비 상태와 외부 연결 확인을 구분합니다.
    • 시험의 10초 외부 감시 간격을 60초로 복귀했습니다. watchdog도 60초 간격으로 계속 실행하며, 24시간 내 최대 3회 및 재시도 대기 정책을 유지합니다.
    • 원격 시험 결과와 정책/이벤트 기록은 VM 외부에도 보존했습니다. 공개 댓글에는 원시 로그/개인 호스트 정보/식별 UUID를 포함하지 않습니다.
    • VM 교체나 감시 프로세스·실행 디렉터리 자체 소실 이후 자동 기동은 여전히 해결되지 않았습니다. 모든 프로세스가 살아 있으면서 네트워크만 고장난 경우도 이번 성공 범위에 포함하지 않습니다.
    • #20은 연구 이슈로 유지합니다. 현재 검증은 같은 VM에서 확인 가능한 개별 프로세스 종료 복구에 한정하며, 이 결과를 기준으로 v0.4.0 패키지 버전/업데이트 기능 개발로 진행합니다.
  14. abruption commented on Oct 21, 2026

    @abruption
    OwnerAuthor

    2026-10-21 추가 실측: 업데이트 시험 전 외부 연결 단절과 새 부팅 확인

    • Mac의 마지막 새 SSH/ping 정상 관측: 12:43:46 KST.
    • 그 뒤 첫 SSH timeout + ping 무응답: 12:44:51 KST. 외부 감시는 이를 external_unreachable로 기록했습니다.
    • 이 시점에는 feat: check for newer stable GitHub releases #28–feat: add verified manual updates with backup and rollback #30 후보를 Dots에 전송·적용하거나 서비스 재시작하지 않았습니다. 복구 직후 네 설치 소스의 체크섬도 공개 v0.3.0과 그대로 일치했습니다.
    • 사용자가 독립 클라우드 터미널에서 bash /workspace/.dots-tailscale/start.sh를 실행한 뒤, Mac에서 새 엄격 SSH 접속과 DERP ping이 성공했습니다.
    • 복구 후 부팅 ID가 이전과 달랐습니다. 새로 부팅된 환경임은 확인했지만, 동일 VM 재부팅과 VM 교체 중 어느 것인지는 이 정보만으로 구분하지 않습니다.

    이전 watchdog 기록과 현재 상태 구분

    /workspace에 이전 실행 디렉터리는 남아 있었습니다. 그러나 그 heartbeat는 이전 boot/run의 state=running이므로 현재 프로세스가 실행 중이라는 증거가 아닙니다.

    특히 복구된 heartbeat 파일은 12:13:45 / sequence 72였고, Mac 외부 감시는 같은 실행의 12:43:46 / sequence 101까지 이미 관측했습니다. 즉, 복구 후 보이는 해당 파일은 마지막 외부 관측보다 과거 내용입니다. 이 차이를 VM 밖에 보존했으며, /workspace 전체의 스냅샷·복원 정책이나 다른 파일의 손실까지 단정하지 않습니다. 남아 있는 로컬 로그만으로 실제 종료 직전 상태나 추가 복구 시도 유무를 확정할 수 없습니다.

    후속 운영

    이후 사용자 승인하에 검토된 v0.4.0 개발 후보의 정상 적용·기동 실패 원복 시험을 수행했고, 두 경우 모두 별도 외부 SSH/ping을 확인했습니다. 이 시험은 위 단절보다 뒤의 별도 사건입니다.

    13:23:40 KST, 새 부팅 환경에 새 watchdog 실행을 시작했습니다. 60초 간격의 연속 실행이며 외부 관측도 새 실행으로 전환했습니다. 이전 부팅의 monotonic 시간 기반 정책 원장을 재개하지 않고 이전 기록을 보존한 채 새 실행의 예산을 시작했습니다. 13:24:38 KST 외부 관측은 verified_running입니다.

    결론은 유지됩니다. 같은 VM에서 식별 가능한 개별 프로세스 종료 복구는 검증됐지만, 실행 환경이 사라지고 새 부팅이 시작된 뒤 watchdog 자체를 자동 기동하는 경로는 없습니다. #20은 계속 열린 연구 과제로 유지합니다.

  15. abruption commented on Oct 21, 2026

    @abruption
    OwnerAuthor

    2026-10-21 야간 추가 관측을 기록합니다. 시각은 KST입니다.

    • 외부 마지막 정상 SSH·ping: 20:31:54. 당시 watchdog은 같은 실행의 sequence 429, 실제 프로세스 정상, 복구 시도 0회였습니다. 이 실행은 13:23 시작 후 약 7시간 8분까지 외부 정상 관측됐습니다.
    • 그 뒤 첫 SSH timeout·ping 무응답: 20:32:59. 사용자의 별도 알림은 21:14:50에 발생했습니다.
    • 사용자가 독립 클라우드 터미널에서 start.sh를 실행한 뒤 새 엄격 SSH와 DERP(ord) ping 174ms가 성공했습니다. v0.4.0 소스 네 파일의 무결성은 match, 내부 Tailscale은 1.102.4였습니다.
    • 복구 후 부팅 ID가 달랐고, uptime과 시계로 추정한 현재 환경 부팅 시각은 21:11:55경입니다. 따라서 새 부팅은 확인했지만, 20:32의 최초 단절이 그 부팅보다 먼저 시작됐으므로 최초 원인을 부팅 변경만으로 확정할 수 없습니다. 재부팅·VM 교체·일시 중단 중 정확한 플랫폼 동작도 구분하지 못했습니다.

    복구 후 /workspace에 남은 이전 heartbeat는 18:25:47 / sequence 303이었습니다. 같은 run을 Mac이 20:31 / sequence 429까지 관측한 기록보다 과거 내용입니다. 이전 부팅의 state=running은 현재 실행 증거가 아니며, 현 부팅에서 이전 watchdog 프로세스는 없었습니다. 해당 메타데이터·이벤트와 외부 기록을 VM 밖에 보존했습니다. 단절 이후 복구 시도 유무는 오래된 원격 기록으로 재구성할 수 없으며, /workspace 전체의 지속성 정책도 이 사례만으로 확정하지 않습니다.

    실제 현재 프로세스의 시작 시각은 shim 21:17:43, tailscaled·sshd 21:17:46으로 확인했습니다. start.sh의 running: Tailscale and local SSH ready는 start_all 이후 출력되는 성공 상태이며, 기존 프로세스 재사용과 신규 기동을 그 문구만으로 구분할 수 없습니다. 이 메시지는 watchdog 실행 상태도 포함하지 않습니다.

    21:19:39, 새 부팅에 새 watchdog 실행을 시작했습니다. 60초 간격·자동 종료 없는 연속 실행이며 이전 부팅의 monotonic 정책 원장은 재개하지 않았습니다. 외부 감시 대상도 새 실행으로 변경했고, 21:21:36 관측은 verified_running, 복구 시도 0회였습니다.

    현재 확인된 복구 범위는 계속 같은 부팅에서 식별 가능한 개별 프로세스 종료입니다. 실행 환경이 사라진 뒤 watchdog 자체를 자동 시작하는 경로는 여전히 미해결입니다.

  16. abruption commented on Oct 21, 2026

    @abruption
    OwnerAuthor

    2026-10-21 22시대 재발 관측입니다. 시각은 KST입니다.

    • 마지막 외부 정상: 22:01:10, watchdog sequence 42, 프로세스 정상, 복구 시도 0회. 21:19 시작한 실행이 약 41분 31초까지 정상 관측됐습니다.
    • 다음 첫 실패: 22:02:15, SSH timeout과 Tailscale ping 무응답. 별도 알림은 22:15:07에 발생했습니다.
    • 사용자가 클라우드 터미널에서 start.sh를 실행한 뒤 새 엄격 SSH와 DERP(ord) ping 175ms가 성공했습니다.
    • 부팅 ID는 다시 변경됐습니다. 현재 환경의 uptime으로 추정한 커널 부팅 시각은 22:00:19경입니다. 이 값은 현재 환경의 관측이며, 이전 환경에서의 마지막 성공이나 실제 전환 시각과 동일하게 취급하지 않습니다.
    • 이번에는 이전 watchdog 실행 디렉터리가 현재 SSH 환경의 /workspace에서 보이지 않았습니다. 이전 원격 identity/heartbeat/이벤트를 복구할 수 없으므로 최초 단절 원인이나 단절 이후 복구 시도 유무를 확정하지 않습니다. Mac의 단절 전후 외부 기록은 별도로 보존했습니다.
    • 반면 설치된 v0.4.0 소스 네 파일과 manifest는 match, 내부 Tailscale은 1.102.4였습니다. 일부 설치 파일 보존과 /workspace 전체의 지속성은 구분해야 합니다.

    로컬에 보존한 실험용 감시 코드를 전송해 22:18:24, 새 부팅에서 새 watchdog 실행을 시작했습니다. 60초 간격·자동 종료 없는 연속 실행이며 새 실행 예산은 0회에서 시작합니다. 외부 감시도 새 실행을 보도록 전환했습니다. 과거 부팅의 monotonic 원장은 재개하지 않았습니다.

    이번에도 확인된 한계는 동일합니다. Tailscale 수동 시작은 복구됐지만, 새 실행 환경에서 watchdog 자체를 자동 기동하거나 사라진 감시 파일을 자동 복원하는 경로는 아직 없습니다.

  17. abruption commented on Oct 23, 2026

    @abruption
    OwnerAuthor

    수명 주기·상태 보존·자원 관찰 현행화 — 2026-10-23

    Draft PR #46에 영어·한국어 연구 문서, 비밀 없는 기준값 및 제한된 수집기를 추가했습니다.

    주제 새 확인과 남은 범위
    상태 보존 설치 네 소스·manifest가 Git v0.4.0과 일치하고 기존 SSH 공개 호스트 키가 유지됩니다. 부팅 문맥은 이전 정상 관측과 다르지만 정확한 VM 재부팅/교체 종류 및 workspace 전체 지속성은 미확인입니다.
    독립 실행 Dots가 start.sh를 한 번 실행하고 외부 SSH·ping이 회복된 구간은 확인했습니다. 재인증·지침 수정·재개 요청이 있었으므로 완전 무인 시험으로 계산하지 않습니다.
    실행 문맥 현재 SSH UID 1000, PID 1 bwrap, socket 접근을 확인했습니다. 직접 Bash·GUI와 같은 시점의 전체 비교는 남아 있습니다.
    장시간·자원 20초 표본에서 shim RSS 약19MiB, tailscaled 약44.5MiB, FD·threads에 큰 증가가 없었습니다. 이는 누수 부재 증명이 아닙니다. 24시간 읽기 전용 관찰을 실제 시작했습니다.
    프록시 호환성 현재 배포가 정상 연결되며 소스와 기존 fixture를 검토할 기준을 맞췄습니다. 실환경 단계별 단절·미래 플랫폼 호환성은 별도 범위로 남깁니다.

    24시간 관찰은 10월23일 10:46:20 KST 시작 → 10월24일 10:46:20 종료 예정, 300초 간격입니다. 시작 기한은 먼저 저장돼 재실행해도 연장되지 않습니다. 원격 명령15초/전체20초, stdout64KiB·증거10MiB 및 자원·로그 상한을 적용했습니다. 상한에서는 수집기만 종료하고 Dots 서비스는 조작하지 않습니다. 설치 소스만 해시하고 키·인증 state 내용은 수집/해시하지 않습니다.

    수집기11개 검증은 실제 과다 stdout·stderr 및 장시간 대기 자식의 종료·회수를 포함합니다. 현재 첫 정상 표본과 지속 실행을 확인했습니다. 장기 결과와 다음 무인 자연 장애는 아직 진행 중이므로 #20은 열린 연구 과제로 유지합니다.

  18. abruption commented on Oct 25, 2026

    @abruption
    OwnerAuthor

    Additional lifecycle observations — 2026-10-25 (KST)

    First failed observation First healthy SSH + ping observation Observed interval
    Oct 24 13:26:06 Oct 24 13:33:41 7m 35s
    Oct 25 00:30:18 Oct 25 00:40:03 9m 45s
    Oct 25 06:43:56 Oct 25 06:51:30 7m 34s

    The boot ID changed in each case and the local watchdog remained stopped. This supports recovery after a new boot, but does not establish VM replacement. Times are external sampling boundaries, not exact execution timestamps or webhook latency.

    Dots reported one startup invocation and successful result recording for each case. The external observer independently confirms restored connectivity; this check did not reread the protected broker claim ledger, so exact execution counts are not independently established here.

    The Oct 24 03:10:47–09:46:40 interval was blocked by the former three-claims-per-day policy and required manual resumption; exclude it from unattended recovery statistics.

    A separate Mac relay interruption followed replacement/removal of its running Homebrew Python runtime. A fresh interpreter delivered successfully and a relay-only restart restored fresh ACKs at Oct 25 12:02:36, with active subscription and zero consecutive failures. The exact swallowed child exception is unavailable; see #43 for evidence and remaining runtime-maintenance work. The current findings do not close all lifecycle/recovery scenarios in this issue.

  19. modified the milestones: v0.5.0, v0.6.0 on Oct 25, 2026
  20. abruption commented on Oct 25, 2026

    @abruption
    OwnerAuthor

    v0.5.0 scope decision: PR #46 will deliver the current experimental research implementation, operational documentation and validated package metadata/artifacts. This issue remains open; its uncompleted acceptance criteria move to v0.6.0 rather than being marked complete. Repeated boot-change recovery is evidence for the experiment, not a guarantee of arbitrary VM replacement, general-account setup or unattended operation under every monitoring-host failure.

  21. modified the milestones: v0.6.0, Research on Oct 26, 2026
  22. abruption commented on Oct 26, 2026

    @abruption
    OwnerAuthor

    v0.6.0은 #49/#51 범위로 준비합니다. 이 이슈는 지속적인 수명 주기·복구 범위 연구이므로 Research 마일스톤으로 이동하고, 특정 릴리스의 전체 해결 조건으로 취급하지 않습니다. 기존 실측과 미검증 범위는 유지합니다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    priority: highInvestigate or implement next; unblocks current reliability or planned work.researchFeasibility work; implementation and release scope remain conditional on evidence.

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions