{"record":{"id":"d177fb784fac188c","repo":"nikivdev/code","slug":"remote-review-requires-an-active-subscription-vis","errorCode":null,"errorMessage":"remote review requires an active subscription. Visit myflow to subscribe.","messagePattern":"remote review requires an active subscription\\. Visit myflow to subscribe\\.","errorType":"exception","errorClass":null,"httpStatus":402,"severity":"error","filePath":"src/commit.rs","lineNumber":5488,"sourceCode":"        commit_with_check_timeout_secs(),\n    ))\n    .context(\"failed to create HTTP client for remote review\")?;\n\n    let mut request = client.post(&review_url).json(&payload);\n    if let Some(token) = commit_with_check_review_token() {\n        request = request.bearer_auth(token);\n    }\n\n    let response = request\n        .send()\n        .context(\"failed to send remote review request\")?;\n\n    if !response.status().is_success() {\n        if response.status() == StatusCode::UNAUTHORIZED {\n            bail!(\"remote review unauthorized. Run `f auth` to login.\");\n        }\n        if response.status() == StatusCode::PAYMENT_REQUIRED {\n            bail!(\"remote review requires an active subscription. Visit myflow to subscribe.\");\n        }\n        bail!(\"remote review failed: HTTP {}\", response.status());\n    }\n\n    let payload: RemoteReviewResponse = response\n        .json()\n        .context(\"failed to parse remote review response\")?;\n\n    if !payload.stderr.trim().is_empty() {\n        debug!(stderr = payload.stderr.as_str(), \"remote claude stderr\");\n    }\n\n    let result = payload.output;\n    let mut review_json = parse_review_json(&result);\n    let future_tasks = review_json\n        .as_ref()\n        .map(|parsed| normalize_future_tasks(&parsed.future_tasks))\n        .unwrap_or_default();","sourceCodeStart":5470,"sourceCodeEnd":5506,"githubUrl":"https://github.com/nikivdev/code/blob/a747e741ae92c09071d0ae946ab48488adcff1ce/src/commit.rs#L5470-L5506","documentation":"The remote review service responded 402 Payment Required, which the library maps to this message. An account exists and authenticates, but the subscription tier does not permit remote reviews.","triggerScenarios":"Receiving StatusCode::PAYMENT_REQUIRED from the review endpoint while dispatching a remote review.","commonSituations":"Free/trial plan expired; subscription lapsed (payment failed); usage quota exhausted; account downgraded after previously working.","solutions":["Visit myflow and subscribe or renew the subscription.","Verify billing details/payment method on the myflow account page.","Check current plan and quota usage; upgrade if limits are hit.","If already subscribed, re-login (`f auth`) to refresh entitlements and contact support if it persists."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"// preflight entitlement check if the service exposes one\nlet plan_ok = client.get(format!(\"{base}/subscription\"))\n    .bearer_auth(token).send().await?\n    .json::<SubscriptionInfo>().await?\n    .active;\nif !plan_ok { anyhow::bail!(\"subscription inactive; visit myflow to subscribe\"); }","typeGuard":null,"tryCatchPattern":"match run_remote_review(&diff).await {\n    Err(e) if e.to_string().contains(\"active subscription\") => {\n        eprintln!(\"Remote review needs a subscription. Open myflow billing page.\");\n        open::that(\"https://myflow/billing\").ok();\n        Err(e)\n    }\n    other => other,\n}","preventionTips":["Check subscription status before automated/CI review runs","Set up billing alerts to avoid silent lapses","Renew trials before expiry in team accounts","Map 402 to a dedicated error type so tooling can surface it clearly"],"tags":["http-402","subscription","billing","remote-review"],"backgroundTag":"http-402-payment-required","analyzedSha":"a747e741ae92c09071d0ae946ab48488adcff1ce","analyzedAt":"2026-09-01T22:43:55.719Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}