{
  "commands": {
    "ct --help": {
      "returncode": 0,
      "stdout": "usage: ct.py [-h]\n             [{status,stop,start,observe,work,connection,apply,edit,logs,access,auth,profile,config,net,ca,emergency,diagnose,resources,lang,vscode,usb}]\n             ...\n\nContextra field maintenance.\nstatus/stop/start/profile/config/resources/usb/lang\n\npositional arguments:\n  {status,stop,start,observe,work,connection,apply,edit,logs,access,auth,profile,config,net,ca,emergency,diagnose,resources,lang,vscode,usb}\n  arguments\n\noptions:\n  -h, --help            show this help message and exit\n",
      "stderr": "",
      "ascii_stdout": true
    },
    "ct profile paths": {
      "returncode": 0,
      "stdout": "Environment: Office LAN\nEditable profile (si): /workspace/contextra/setup/profiles/office.json\nCredentials (owner-only; values hidden): /workspace/contextra/setup/profiles/office.private/main.credentials.json\nSelected Web public CA: /workspace/contextra/setup/profiles/office.private/main.ca.crt\nNIC runtime files (root): /etc/netplan/*.yaml\nRuntime site (root): /workspace/contextra/runtime/state/site.json\nRuntime Compose (root): /workspace/contextra/runtime/state/transactions/offline-source-20260928T165350/compose.json\nExisting env inputs (root; contents hidden):\n  /workspace/contextra/data/site/runtime.env\n  /workspace/contextra/data/site/secure-bridge.env\nEdit source: ct profile edit / ct profile file\nNIC: ct net apply / app: ct config prepare / explicit login: ct config connect\nImport runtime edits: ct emergency / credentials: ct profile credentials / CA: ct ca\nEditable source: network/webs/ports/redis_allow/media in the profile. Format version stays 1.\nConnection revision: webs[].connection_version or ct config version NUMBER; then prepare.\nRuntime site/Compose/env: supported imports only via ct emergency; do not edit active hashes or prepared files.\nCredentials and CA: use ct profile credentials / ct ca; never publish private files.\n",
      "stderr": "",
      "ascii_stdout": true
    },
    "ct config version status": {
      "returncode": 0,
      "stdout": "Web: https://192.168.50.101 AI ID: AI-01\nconnection_version override: auto\nLocal prepared version: unknown\nLocal successful version: unknown\nWeb current version: UNKNOWN (no remote query or login).\nProfile version=1 is its file format. It is NOT connection_version.\nSet: ct config version NUMBER | auto (no login)\n",
      "stderr": "",
      "ascii_stdout": true
    },
    "ct config status": {
      "returncode": 0,
      "stdout": "Selected environment: Office LAN ( office )\nEnvironment: Office LAN\nEditable profile (si): /workspace/contextra/setup/profiles/office.json\nCredentials (owner-only; values hidden): /workspace/contextra/setup/profiles/office.private/main.credentials.json\nSelected Web public CA: /workspace/contextra/setup/profiles/office.private/main.ca.crt\nNIC runtime files (root): /etc/netplan/*.yaml\nRuntime site (root): /workspace/contextra/runtime/state/site.json\nRuntime Compose (root): /workspace/contextra/runtime/state/transactions/offline-source-20260928T165350/compose.json\nExisting env inputs (root; contents hidden):\n  /workspace/contextra/data/site/runtime.env\n  /workspace/contextra/data/site/secure-bridge.env\nEdit source: ct profile edit / ct profile file\nNIC: ct net apply / app: ct config prepare / explicit login: ct config connect\nImport runtime edits: ct emergency / credentials: ct profile credentials / CA: ct ca\nEditable source: network/webs/ports/redis_allow/media in the profile. Format version stays 1.\nConnection revision: webs[].connection_version or ct config version NUMBER; then prepare.\nRuntime site/Compose/env: supported imports only via ct emergency; do not edit active hashes or prepared files.\nCredentials and CA: use ct profile credentials / ct ca; never publish private files.\nSelected Web: https://192.168.50.101 Event: https://192.168.50.101/api/v1/events AI ID: AI-01\nProfile ports: control/WSS 38443 Redis 16379 SSH 1023\nAllowed Redis clients: 192.168.50.101\nActual NIC IPv4: ['192.168.50.7']\nApp-configured AI address: 192.168.30.70 transaction: offline-source-20260928T165350\nActive app settings: {\"ai_ip\": \"192.168.30.70\", \"manager\": \"https://192.168.30.68\", \"web_host\": \"192.168.30.68\", \"event_url\": \"https://192.168.30.68/api/v1/events\", \"control_port\": 38443, \"redis_port\": 16379, \"artifact_lan_cidr\": \"192.168.30.0/24\", \"server_id\": \"AI-01\"}\nAddress differs: app still uses old settings. Next: ct config prepare/connect/apply\nRuntime fingerprint: match\nCredentials present: True CA present: True\nPending: pending.json ct config resume / ct net restore\nLast enrollment result: {'returncode': 2, 'result': 'UNCONFIRMED', 'error': 'LOGIN_REJECTED', 'http_status': 400}\nWeb: control Web Web control Web Not probed (ct diagnose checks TCP only)\nRunning Sidecar: {'auth_error': 'STATUS_UNAVAILABLE', 'connected': False}\nWeb: https://192.168.50.101 AI ID: AI-01\nconnection_version override: auto\nLocal prepared version: unknown\nLocal successful version: unknown\nWeb current version: UNKNOWN (no remote query or login).\nProfile version=1 is its file format. It is NOT connection_version.\nNext: ct config status (preserve pending; inspect before retry/cancel)\n",
      "stderr": "",
      "ascii_stdout": true
    },
    "ct usb status": {
      "returncode": 0,
      "stdout": "{'name': '/dev/sdb1', 'maj:min': '8:17', 'uuid': 'D2E5-DC8E', 'fstype': 'exfat', 'size': 2048405798912, 'label': 'T31', 'mountpoints': ['/mnt/ct-usb']}\nct usb mount | ct usb unmount. /backup, /training, system/data disks are protected.\n",
      "stderr": "",
      "ascii_stdout": true
    },
    "ct vscode status": {
      "returncode": 0,
      "stdout": "Remote settings: /home/si/.vscode-server/data/Machine/settings.json managed differences: 0\nOnly managed keys: {\"npm.autoDetect\": \"off\", \"npm.enableScriptExplorer\": false, \"npm.enableRunFromFolder\": false, \"search.followSymlinks\": false, \"git.autoRepositoryDetection\": \"openEditors\", \"python.analysis.languageServerMode\": \"light\", \"python.analysis.indexing\": false, \"python.analysis.diagnosticMode\": \"openFilesOnly\", \"python.analysis.exclude\": [\"**\"], \"python.analysis.autoSearchPaths\": false, \"python.analysis.userFileIndexFollowSymlinkedFolders\": false, \"python-envs.workspaceSearchPaths\": [], \"search.exclude\": {\"**/proc/**\": true, \"**/sys/**\": true, \"**/dev/**\": true, \"**/backup/**\": true, \"**/training/**\": true, \"**/contextra/data/**\": true, \"**/.vscode-server/**\": true, \"**/node_modules/**\": true, \"**/.git/**\": true}, \"files.watcherExclude\": {\"**/proc/**\": true, \"**/sys/**\": true, \"**/dev/**\": true, \"**/backup/**\": true, \"**/training/**\": true, \"**/contextra/data/**\": true, \"**/.vscode-server/**\": true, \"**/node_modules/**\": true, \"**/.git/**\": true}}\n",
      "stderr": "",
      "ascii_stdout": true
    },
    "ct net arp status": {
      "returncode": 0,
      "stdout": "Environment: Office LAN interface: enp128s31f6 Web: 192.168.50.101\nKernel neighbor: [{\"dst\": \"192.168.50.101\", \"lladdr\": \"bc:24:11:8a:6e:f4\", \"state\": [\"PERMANENT\"]}]\nPERMANENT here is not reboot persistence. Never reuse a MAC from a different network.\nAfter independent MAC verification only: ct net arp set aa:bb:cc:dd:ee:ff\nReturn to dynamic discovery: ct net arp clear\n",
      "stderr": "",
      "ascii_stdout": true
    },
    "ct resources": {
      "returncode": 0,
      "stdout": "CPU: one logical core=100%; RAM: process RSS; shared pages may overlap.\nPID  UID  COMMAND  CPU%  RAM(MiB)  age(s)  role\n19095 1001 node 100.2 674 10852 other\n73511 1001 node 4.0 548 219 vscode-extensionHost\n19055 1001 node 0.0 120 10852 other\n1735 0 dockerd 0.0 111 22751 other\n19115 1001 node 0.0 77 10852 other\n1422 0 containerd 0.0 69 22850 other\n73611 1001 node 0.0 59 217 other\n73533 1001 node 0.0 52 218 other\n643 0 multipathd 0.0 26 22853 other\n33570 1001 nvtop 1.0 25 5516 other\n76680 0 python3.12 1.0 18 1 other\n589 0 systemd-journald 0.0 17 22853 other\n1 0 systemd 0.0 13 22855 other\n33517 1001 htop 1.0 5 5520 other\nExplicit single-process stop: ct resources stop PID (no broad cleanup).\n",
      "stderr": "",
      "ascii_stdout": true
    },
    "menu en": {
      "returncode": 0,
      "stdout": "\nContextra field maintenance (0 Exit)\n1 Status  2 Select profile  3 Edit profile  4 Credentials  5 CA file\n6 NIC status  7 Apply NIC  8 Prepare app  9 Connect explicitly  10 Apply app\n11 Start services  12 Stop services  13 Emergency import  14 Diagnose\n15 Resume apply  16 Restore config  17 File paths  18 Edit file (nano)\n19 Export record  20 Python APP patch  21 LLM chat  22 LLM API\n23 Record acceptance  24 Add note  25 Select control Web\n26 Connection version  27 CPU/RAM resources  28 Language  29 ARP status\n30 VSCode safety status (settings only; no automatic restart)\n31 USB status (ct usb mount / ct usb unmount)\nNumber [Enter=keep menu]: ",
      "stderr": "",
      "ascii_stdout": true
    },
    "menu ko": {
      "returncode": 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 선택\n26 연결 설정 버전  27 CPU/RAM 진단  28 언어  29 ARP 상태\n30 VSCode 안전 설정 상태 (자동 재시작 없음)\n31 USB 상태 (ct usb mount / ct usb unmount)\n번호 [Enter=메뉴 유지]: ",
      "stderr": "",
      "ascii_stdout": false
    }
  },
  "installed": {
    "maintenance/ct.py": "d2755a78b8d5e86e62b056bdb3c2bff07e5b28b854f6664f69418494b94a9470",
    "maintenance/auth_control.py": "c52e5715804ebdbfefd4f9ea5b155d1e6e30520081a556a29ce1fef946d0686a",
    "maintenance/connection.py": "bedda78ac83351ef9dbc41837836ac6eafb144aae1644c450a4ca6d1ba0d0ac9",
    "maintenance/network_prepare.py": "99c9d62ccc0c0dff68a43ec8d7aa38c0c07e9961af28ac71ea3771468b24fd4f",
    "maintenance/field_profiles.py": "9c0a4e8f4110487c3365d87d934e5078988f18edc14e1200b08e528d9dfeca0f",
    "maintenance/field_network.py": "cf60e1fdf564ff785a86d95ae80c413bc091bffc791c11152114f1784ed53de6",
    "maintenance/field_ca.py": "b2acaf1b20e42b74b6a1dbbf724016856c3b98988d63c9b3293fb401b5b810eb",
    "maintenance/field_runtime.py": "ae51989e9b355e1fb5071b07d44c0a9f84ad934afc790f0cf00ae05ca554efe9",
    "maintenance/field_cli.py": "fc2c9a03fe8002d64ad4fda8564bcabb177d37d053d7096bff78faf2b9948629",
    "maintenance/connection_versions.py": "c8bb2df181e53e4ae9a2c94d506b68c29f9f3890d9bbd6efb6ff20b5e3673a6c",
    "maintenance/field_diagnostics.py": "0d1c70888dc2cd7bac51e902d917ab79b013c66b18fa28938fffeb9ca4e94102",
    "maintenance/field_resources.py": "1950beff9bc592aa6a73b72ed344878f87176680a32d0fe472e8f7e85e72b7b7",
    "maintenance/field_ui.py": "352a7a1eb52eb10ac4a4517b7c7af4be8aa386498fbf21a5039342aaff406b16",
    "maintenance/field_usb.py": "a336521433ce27265175dac42d0a1dc5e086905ce0796c2dda3f3e2724c6cd3c",
    "maintenance/maintenance_process.py": "9efdbdfdbdfe0be5a15a0f62b438c40c3238824d542b1d24d063587a338ee58c",
    "maintenance/vscode_safety.py": "ce53ea82b8e0efd090acbcbe3144460e74551728713c227123a9f1a5c3f86c4e",
    "vendor/tools/secure_bridge_enroll.py": "6be2927b3258e8414a327d7dd84341541e47f08a637ddaf8e997890d3020a1c7",
    "guides/ICERTI_OFFLINE_MAINTENANCE.ko.md": "834be9937b392fd20851128cd19f47cb2939c111890213d608e3a704986aca3a"
  },
  "gui_acceptance": "PENDING",
  "login_requests": 0,
  "services_started": false,
  "pending_verified": true,
  "pending_stage": "/workspace/contextra/data/site/field-20260930T125714-23731",
  "active_verified": "offline-source-20260928T165350",
  "vscode": {
    "path": "/home/si/.vscode-server/data/Machine/settings.json",
    "mode": "0o600",
    "uid": 1001,
    "settings_match": true
  },
  "processes": [
    {
      "pid": 73511,
      "ppid": 19055,
      "role": "vscode-extensionHost",
      "rss_bytes": 574312448
    }
  ],
  "usb_candidates": [
    {
      "name": "/dev/sdb1",
      "maj:min": "8:17",
      "uuid": "D2E5-DC8E",
      "fstype": "exfat",
      "size": 2048405798912,
      "label": "T31",
      "mountpoints": [
        "/mnt/ct-usb"
      ]
    }
  ],
  "data_mounts": {
    "/backup": "/backup /dev/sda1 ext4   rw,relatime",
    "/training": "/training /dev/nvme1n1p1 ext4   rw,relatime",
    "/workspace/contextra/data/artifacts": "/workspace/contextra/data/artifacts /dev/sda1[/contextra/artifacts] ext4   rw,relatime",
    "/workspace/contextra/data/training": "/workspace/contextra/data/training /dev/sda1[/contextra/training] ext4   rw,relatime"
  },
  "root_free_bytes": 599734509568
}
