{
  "ct --help": {
    "code": 0,
    "stdout": "usage: ct.py [-h]\n             [{status,stop,start,observe,work,connection,apply,edit,logs,access,auth,profile,config,net,ca,emergency,diagnose}]\n             ...\n\nContextra 현장 유지보수. status/stop/start/observe/work/connection\n\npositional arguments:\n  {status,stop,start,observe,work,connection,apply,edit,logs,access,auth,profile,config,net,ca,emergency,diagnose}\n  arguments\n\noptions:\n  -h, --help            show this help message and exit\n",
    "stderr": ""
  },
  "ct profile list": {
    "code": 0,
    "stdout": "field 폐쇄 현장망 /workspace/contextra/setup/profiles/field.json\noffice 스인 내부망 /workspace/contextra/setup/profiles/office.json\n",
    "stderr": ""
  },
  "ct profile paths": {
    "code": 0,
    "stdout": "환경: 스인 내부망\n일반 설정(si 편집): /workspace/contextra/setup/profiles/office.json\n계정 파일(소유자 전용, 값 출력 없음): /workspace/contextra/setup/profiles/office.private/main.credentials.json\n선택 Web의 공개 CA: /workspace/contextra/setup/profiles/office.private/main.ca.crt\nNIC 실행 설정(root): /etc/netplan/*.yaml\n앱 실행 site(root): /workspace/contextra/runtime/state/site.json\n앱 실행 Compose(root): /workspace/contextra/runtime/state/transactions/offline-source-20260928T165350/compose.json\n기존 env 입력(root, 내용은 출력하지 않음):\n  /workspace/contextra/data/site/runtime.env\n  /workspace/contextra/data/site/secure-bridge.env\n설정 편집: ct profile edit / ct profile file\nNIC 적용: ct net apply / 앱 준비: ct config prepare / 명시적 연결: ct config connect\n기존 파일 변경 가져오기: ct emergency / 계정 저장: ct profile credentials / CA: ct ca\n",
    "stderr": ""
  },
  "ct config status": {
    "code": 0,
    "stdout": "선택 환경: 스인 내부망 ( office )\n환경: 스인 내부망\n일반 설정(si 편집): /workspace/contextra/setup/profiles/office.json\n계정 파일(소유자 전용, 값 출력 없음): /workspace/contextra/setup/profiles/office.private/main.credentials.json\n선택 Web의 공개 CA: /workspace/contextra/setup/profiles/office.private/main.ca.crt\nNIC 실행 설정(root): /etc/netplan/*.yaml\n앱 실행 site(root): /workspace/contextra/runtime/state/site.json\n앱 실행 Compose(root): /workspace/contextra/runtime/state/transactions/offline-source-20260928T165350/compose.json\n기존 env 입력(root, 내용은 출력하지 않음):\n  /workspace/contextra/data/site/runtime.env\n  /workspace/contextra/data/site/secure-bridge.env\n설정 편집: ct profile edit / ct profile file\nNIC 적용: ct net apply / 앱 준비: ct config prepare / 명시적 연결: ct config connect\n기존 파일 변경 가져오기: ct emergency / 계정 저장: ct profile credentials / CA: ct ca\n실제 NIC IPv4: ['192.168.50.7']\n앱 설정 AI 주소: 192.168.30.70 transaction: offline-source-20260928T165350\n실행 설정 지문: 일치\n계정 등록: False CA 준비: False\nWeb: 주 연결 Web 주 연결 미측정 (ct diagnose로 TCP만 확인)\n현재 실행 Sidecar: {'auth_error': 'STATUS_UNAVAILABLE', 'connected': False}\n",
    "stderr": ""
  },
  "ct net status": {
    "code": 0,
    "stdout": "환경: 스인 내부망 프로필: /workspace/contextra/setup/profiles/office.json\n방식: dhcp 저장 주소: (DHCP 자동)\nenp128s31f6      UP             192.168.50.7/24 metric 100 \n\ndefault via 192.168.50.1 dev enp128s31f6 proto dhcp src 192.168.50.7 metric 100 \n172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown \n172.18.0.0/16 dev br-cdbbb65bb605 proto kernel scope link src 172.18.0.1 linkdown \n192.168.50.0/24 dev enp128s31f6 proto kernel scope link src 192.168.50.7 metric 100 \n192.168.50.1 dev enp128s31f6 proto dhcp scope link src 192.168.50.7 metric 100 \n\nLink 2 (enp128s31f6)\n    Current Scopes: DNS\n         Protocols: +DefaultRoute -LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported\nCurrent DNS Server: 192.168.50.1\n       DNS Servers: 192.168.50.1\n\n현장 전환은 물리 콘솔 권장. netplan 적용은 ct net apply, 복구는 ct net restore.\n",
    "stderr": ""
  },
  "root menu": {
    "code": 0,
    "stdout": "\nContextra 현장 관리 / field maintenance (0 Exit)\n1 상태/status  2 환경선택/profile  3 설정/edit  4 계정저장/credentials  5 CA 파일\n6 NIC 상태  7 NIC 적용  8 앱준비/prepare  9 명시적 연결/connect  10 앱적용/apply\n11 서비스 Start  12 정상 Stop  13 긴급/emergency  14 진단/diagnose\n15 적용재개/resume  16 설정복구/restore  17 파일경로/paths  18 파일편집/nano\n19 기록반출/export  20 Python APP 패치  21 LLM chat  22 LLM API\n23 사용자 확인기록  24 수동메모  25 주 Web 선택\n번호 [Enter=메뉴 유지]: ",
    "stderr": ""
  },
  "si paths": {
    "code": 0,
    "stdout": "{\"/workspace/contextra/setup/profiles/office.json\": {\"read\": true, \"write\": true, \"mode\": \"0o600\", \"uid\": 1001}, \"/workspace/contextra/setup/profiles/field.json\": {\"read\": true, \"write\": true, \"mode\": \"0o600\", \"uid\": 1001}}\n",
    "stderr": ""
  },
  "wait": {
    "code": 0,
    "stdout": "TimeoutStartUSec=1min\nExecStart={ path=/lib/systemd/systemd-networkd-wait-online ; argv[]=/lib/systemd/systemd-networkd-wait-online --ipv4 --timeout=60 -i enp128s31f6:degraded ; ignore_errors=no ; start_time=[n/a] ; stop_time=[n/a] ; pid=0 ; code=(null) ; status=0/0 }\nFragmentPath=/usr/lib/systemd/system/systemd-networkd-wait-online.service\nDropInPaths=/run/systemd/system/systemd-networkd-wait-online.service.d/10-netplan.conf /etc/systemd/system/systemd-networkd-wait-online.service.d/90-contextra-bound.conf\n",
    "stderr": ""
  },
  "listeners": {
    "code": 0,
    "stdout": "State  Recv-Q Send-Q Local Address:Port Peer Address:PortProcess\nLISTEN 0      4096      127.0.0.54:53        0.0.0.0:*          \nLISTEN 0      4096   127.0.0.53%lo:53        0.0.0.0:*          \nLISTEN 0      4096         0.0.0.0:1023      0.0.0.0:*          \nLISTEN 0      4096            [::]:1023         [::]:*          \n",
    "stderr": ""
  },
  "code_verify": "offline-source-20260928T165350",
  "profile_prepared": {
    "office": {
      "label": "스인 내부망",
      "network": {
        "interface": "enp128s31f6",
        "mode": "dhcp",
        "address": "",
        "gateway": "",
        "dns": [],
        "ssh_port": 1023
      },
      "credentials_exist": false,
      "ca_exists": false
    },
    "field": {
      "label": "폐쇄 현장망",
      "network": {
        "interface": "enp128s31f6",
        "mode": "static",
        "address": "192.168.105.40/24",
        "gateway": "",
        "dns": [],
        "ssh_port": 1023
      },
      "credentials_exist": false,
      "ca_exists": false
    }
  },
  "pending": {
    "pending.json": false,
    "apply-pending.json": false,
    "network-pending.json": false
  },
  "running": {
    "code": 0,
    "stdout": "",
    "stderr": ""
  },
  "installed": {
    "stop_channels.py": "6bc8817bd15924dabc881bca0820e5cc95a9f4391bb09688a39d403d8d17a964",
    "workspace_access.py": "45db58a3c9308231419f41421052dc966d224e46df5d8791e52dfc8a3eeaff30",
    "field_network.py": "4682a08034b476edc810bfd6d8ba024f226c5c21bb89d3fef53d029adc7ded45",
    "field_ca.py": "80b3be5e373dc8286f384dba99139f4beb89ebae85678d4225ff6775da365012",
    "source_prepare.py": "60339cefce9b90a7140f3dc29adcc23a7948cc0b6b650009f1413cd9be62f911",
    "field_cli.py": "b5210dcc726f3106223e1ff15a72369aeed2c78fc6367b227b26d867cc52d34b",
    "ct.py": "cde7e89a5253f1034f51a71ad43dc82e0a9998f14da056566bb927ef1d343150",
    "apply_source.py": "e594a24843fd65262fec84d8dd913a38f60d82a7c7d4f4d543ba36c50d7c9c59",
    "auth_control.py": "2565a3835aa367d530300910bb86f1f30742edd271ec411b8b282a6f55ff6e50",
    "connection.py": "f2e8d121d67891722841eaf9752879fc3848232e0027c9f3a4ea80d757193a66",
    "maintenance_guard.py": "367424221c035b0f0915cb11bfd12cbd8aeee7b881c226debaf5b0b86652848f",
    "field_runtime.py": "e18489f8e7d328a35e29409208f87f5aab3b73559c78b63bb69d31b53e4f54d0",
    "field_profiles.py": "2318225fe317144cd33a154a81cf4fe87ebacb5c2b9185688167b1d786d2fa5b",
    "network_apply.py": "6483706f4121c77093d87481989b1000f46ad7746568d4a08f93f1ffdbd7c6b6",
    "network_prepare.py": "7a44189974d12e60bbaa8fdf219ccb6443706ea16d5e9ab8d1301eb6a281b6bb",
    "gpu_metrics.py": "eb2e24fa39cf7d655bd47782332345dc1745d32b9cd09bebeaca1d5530356575",
    "work_record.py": "547e25a592baab997f3d1df8e2a1259bb87d80489d4f1e0b59bf7776f1427727",
    "observability.py": "9298a1f30291783503a4137ca54ba0c105c9fedb1fbdfe556c333b306b71e33f"
  }
}
