Debugging RepoDesk
VPS access
Operator-provided SSH destination, recorded at the user's request on 2026-10-06:
ssh root@169.58.58.71
Admin site: https://dev.stonegate.me. Deployment directory: /opt/repodesk.
Compose project: repodesk. Observed containers: repodesk-app-1,
repodesk-worker-1, repodesk-postgres-1, repodesk-codex-runner-1.
Use the existing SSH credentials and verified host key; keep credentials,
encryption keys, private messages and database dumps out of debugging reports.
Missing Telegram replies
Start with a run ID from Runs & delivery. Check run status, error, model
attempts, transcript roles/stop reasons, answer length and delivery state.
Read only the relevant workspace and runs. Summarize tool names and outcomes;
avoid dumping full workspace JSON, credentials or chat history.
ssh root@169.58.58.71 'docker ps --format "{{.Names}} {{.Status}}"'
ssh root@169.58.58.71 'docker logs --since 30m --tail 200 repodesk-worker-1'
Interpret the states separately:
partialwith an empty result and no delivery can indicate the older silent completion bug documented in the 2026-10-06 incident.turn_limitmeans all allowed model turns were consumed before a final answer. Tool calls consume turns too. Check redundant retrieval and tool failures before deciding to increase Workspace settings → Maximum model turns and its budget.tool_limiton older builds means the chat assistant attempted a ninth tool call, even if model turns and budget remained. Normal workspace requests now have no fixed tool-call count limit; model-turn, spending, timeout, cancellation and permission checks still apply. A model turn can contain several tool calls. Explicit internal/evaluation caps retain a specific limit failure message.- No matching connected repository means the coding request has no resolved target. Use its full connected repository name; confirm workspace selection and actor grants. Do not assume a coding task started.
- A
start_development_taskfailure with no task record can be a policy mismatch, before GitHub is contacted. Reviewed (also the default when omitted) needspropose_coding_taskand Telegram approval; only Direct supports the start tool. Older builds hidecoding_direct_execution_disabledasextension_tool_failed. See the routing incident. github_app_permissions_missingmeans GitHub rejected a scoped installation token because its requested permissions are not granted. Verify the App and installation both allow Contents and Pull requests read/write for Codex publication, plus Issues write for the Reviewed issue workflow. Contents read alone can read the checkout while a Direct token (also requesting Pull requests read) or publication token still fails. Older builds report this asgithub_unavailable. Changing execution policy does not add GitHub permissions.coding_intent_unverifiedmeans the completed intake result did not quote the consumed authenticated input at its recorded revision. This occurs after repository preparation and Codex execution; it is not a GitHub reachability error. Older runner builds allowed a narrative evidence field, causing short retries to stop. Updated intake schemas pin the current text and revision while preserving the guard. See the evidence incident.- Repeated Codex requests for a screenshot can indicate the text-only task handoff, even when Pi has received the image. Check source attachment metadata, Pi transcript image-block counts and the task's persisted attempt inputs without dumping image data. In the incident's 0.1.21 build, initial task inputs omit attachments, Codex turns contain only text, and photo-only or captioned task answers bypass task routing. The 0.1.22 correction passes authorized media to Codex and routes photo-only answers to the bound task. Update app, worker, supervisor and task image together. See the screenshot incident.
coding_execution_failedon v0.1.20 can hide an implementation app-server or completed-result error. The old device-auth cleanup removed its session logs without persisting a safe failure marker. A task's token total equaling its old quota can represent missing usage, not an actual provider token-limit error. The updated adapter records a specific safe code plus reported usage and thread identity before cleanup. Provider usage/rate limits, connection failures, rejected requests, context overflow, sandbox errors and missing/invalid results are distinct; raw provider messages are never recorded. See the implementation failure incident. An operator-authorized live VPS retest on 0.1.21 completed the same wallshader request with 694350 reported tokens and passing repository checks; this workload would exceed the removed 200000-token guard.coding_base_branch_missingmeans Git reported that the configured base branch does not exist during preparation. Confirm the saved branch in Plugins → Codex → Repositories and choose an existing intended branch before a new request.coding_checkout_failedmeans cloning failed for another reason; it does not prove that a branch is missing or permission was revoked. Both failures stop before Codex starts and return safe repository context to Telegram. Older builds preserve onlycoding_execution_failedfor these failures.coding_result_invalidmeans the final JSON failed application validation. The updated runner generates field constraints from the validator and allows one read-only result correction before stopping. InspectresultIssuesin the runner status/state or the task's tenant-scopedcoding_task_attempts.data.too_bigidentifies an overlong field,invalid_typea missing/wrong type, andcustomonverificationCommandsorquestionan unmet status-specific requirement. Diagnostics contain only known field paths and issue codes, never rejected text. Old attempts without these details cannot identify the exact rejected field after temporary session cleanup. See the final-result incident.- Repeated check/repair cycles without a terminal error can indicate a malformed
frozen verification plan. Inspect only the task's runner
verificationCommandsand sanitized/task/check-diagnostics; compare actual command length with the 2,000-character schema limit and confirm that the plan includes repository checks. A missing argument in a frozen setup command cannot be fixed by ordinary source repair. Use a repository script for longer preparation/check logic, and preserve the checkpoint before operator-authorized recovery with a fresh plan. See the progress/verification incident. coding_runner_unavailablemeans runner communication or engine reconciliation failed; it does not establish an implementation failure. During the 2026-10-06 release, the old worker remained active while the runner was replaced and marked an already verified task failed before its queued follow-up could start. Check attemptcheckPassed, saved checkpoint and container creation times before starting another task. The updated deployment waits for checkpoints and stops writers before replacing the runner; temporary outages and checkpoint cleanup acknowledgements remain retryable. See the deployment handoff incident.- A pending delivery is queued separately from generation. A failed delivery has a Telegram or policy error. An unknown delivery must be inspected before any resend, because Telegram might already have accepted it.
The local fix creates a durable notice when an addressed run finishes without answer text, including the specific limit when known. Pending approvals keep their existing delivery flow. Duplicate run jobs do not create a second notice; revoked actors cannot receive a new delivery. Empty notices are not saved as model answers or committed as discussion memory. Old terminal runs are not replayed.
SSH inspection does not itself authorize deployment, configuration changes or manual Telegram messages. Follow the VPS release runbook for an authorized rollout.