{"record":{"id":"f2e0168831f70c01","repo":"can1357/oh-my-pi","slug":"robomp-orchestrator-requires-robomp-gh-proxy-url-a-f2e016","errorCode":null,"errorMessage":"robomp orchestrator requires ROBOMP_GH_PROXY_URL and ROBOMP_GH_PROXY_HMAC_KEY (run gh-proxy in a sibling container).","messagePattern":"robomp orchestrator requires ROBOMP_GH_PROXY_URL and ROBOMP_GH_PROXY_HMAC_KEY \\(run gh-proxy in a sibling container\\)\\.","errorType":"exception","errorClass":"SystemExit","httpStatus":null,"severity":"critical","filePath":"python/robomp/src/server.py","lineNumber":243,"sourceCode":"                \"html_url\": s.html_url,\n                \"processed\": make_issue_key(s.repo, s.number) in processed_keys,\n            }\n            for s in entry.issues\n        ],\n        \"errors\": [dict(error) for error in entry.errors],\n        \"repos\": list(entry.repos),\n        \"cache\": {\"hit\": cache_hit, \"fetched_at\": entry.fetched_at},\n    }\n\n\ndef _require_proxy_mode(cfg: Settings) -> tuple[str, bytes]:\n    if cfg.github_token is not None:\n        raise SystemExit(\n            \"robomp orchestrator refuses to start with GITHUB_TOKEN set in env. \"\n            \"The PAT must live only in the gh-proxy container.\"\n        )\n    if cfg.gh_proxy_url is None or cfg.gh_proxy_hmac_key is None:\n        raise SystemExit(\n            \"robomp orchestrator requires ROBOMP_GH_PROXY_URL and \"\n            \"ROBOMP_GH_PROXY_HMAC_KEY (run gh-proxy in a sibling container).\"\n        )\n    return cfg.gh_proxy_url, cfg.gh_proxy_hmac_key.get_secret_value().encode(\"utf-8\")\n\n\ndef _build_orchestrator(cfg: Settings) -> tuple[GitHubBackend, ProxyGitTransport]:\n    base_url, key = _require_proxy_mode(cfg)\n    github = GitHubProxyClient(base_url=base_url, hmac_key=key)\n    transport = ProxyGitTransport(base_url=base_url, hmac_key=key)\n    return github, transport\n\n\ndef _build_state(settings: Settings) -> dict[str, Any]:\n    db = get_database(settings.sqlite_path)\n    github, git_transport = _build_orchestrator(settings)\n    natives_cache: NativesCache | None = None\n    if settings.natives_cache_enabled:","sourceCodeStart":225,"sourceCodeEnd":261,"githubUrl":"https://github.com/can1357/oh-my-pi/blob/969062200754ea02cfac922e5ebb8c608c079e15/python/robomp/src/server.py#L225-L261","documentation":"_require_proxy_mode() requires ROBOMP_GH_PROXY_URL and ROBOMP_GH_PROXY_HMAC_KEY to be set when GITHUB_TOKEN is absent; missing either raises SystemExit at orchestrator startup because there is no way to authenticate GitHub requests without the gh-proxy sidecar.","triggerScenarios":"Starting `robomp serve` with no GITHUB_TOKEN and either ROBOMP_GH_PROXY_URL or ROBOMP_GH_PROXY_HMAC_KEY unset/empty in Settings.","commonSituations":"Fresh deployment where .env was copied incompletely from .env.example; typo'd variable name (e.g. ROBOMP_GH_PROXY_KEY); running the container without --env-file; HMAC key deliberately blanked for local testing.","solutions":["Set both ROBOMP_GH_PROXY_URL and ROBOMP_GH_PROXY_HMAC_KEY in .env / container env and restart.","Deploy the gh-proxy sibling container (compose default) and point ROBOMP_GH_PROXY_URL at it.","Compare your .env against .env.example — it is the authoritative required-var list.","Alternatively set GITHUB_TOKEN to use direct PAT mode (proxy vars then must be removed)."],"exampleFix":"// before (.env)\nROBOMP_GH_PROXY_URL=http://gh-proxy:8080\n# HMAC key missing\n// after (.env)\nROBOMP_GH_PROXY_URL=http://gh-proxy:8080\nROBOMP_GH_PROXY_HMAC_KEY=<same-key-as-gh-proxy-container>","handlingStrategy":"validation","validationCode":"import os\nrequired = ('ROBOMP_GH_PROXY_URL', 'ROBOMP_GH_PROXY_HMAC_KEY')\nmissing = [v for v in required if not os.environ.get(v)]\nif missing and not os.environ.get('GITHUB_TOKEN'):\n    raise SystemExit(f'missing env: {missing}')","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Start every deployment from .env.example (authoritative var list)","Use compose --env-file and verify with `docker compose config`","Set both proxy vars to the same values as the gh-proxy sidecar"],"tags":["configuration","environment","startup","authentication"],"backgroundTag":"missing-env-var","analyzedSha":"969062200754ea02cfac922e5ebb8c608c079e15","analyzedAt":"2026-08-31T10:29:35.737Z","schemaVersion":2},"datasetVersion":"2026-08-31T14:17:45.589Z"}