{"record":{"id":"cc4a702753cf6e20","repo":"mvanhorn/last30days-skill","slug":"delivery-channel-must-be-an-https-url-got-val","errorCode":null,"errorMessage":"delivery_channel must be an https:// URL, got {value!r}","messagePattern":"delivery_channel must be an https:// URL, got (.+?)","errorType":"console","errorClass":"SystemExit","httpStatus":null,"severity":"error","filePath":"skills/last30days/scripts/watchlist.py","lineNumber":264,"sourceCode":"            run_id,\n            status=\"failed\",\n            error_message=f\"Invalid JSON output: {exc}\",\n            duration_seconds=duration,\n        )\n        return {\"topic\": topic[\"name\"], \"status\": \"failed\", \"error\": f\"parse error: {exc}\"}\ndef cmd_config(args):\n    if args.key == \"budget\":\n        store.set_setting(\"daily_budget\", str(args.value))\n        print(json.dumps({\"action\": \"config\", \"key\": \"daily_budget\", \"value\": str(args.value)}))\n        return\n    if args.key == \"delivery\":\n        value = str(args.value)\n        # Reject a non-https channel at write time so the operator gets\n        # immediate feedback, rather than discovering it via a stderr line\n        # buried in a research run hours later. Matches the delivery-time guard\n        # in _deliver_findings.\n        if value and urllib.parse.urlparse(value).scheme != \"https\":\n            raise SystemExit(f\"delivery_channel must be an https:// URL, got {value!r}\")\n        store.set_setting(\"delivery_channel\", value)\n        print(json.dumps({\"action\": \"config\", \"key\": \"delivery_channel\", \"value\": value}))\n        return\n    raise SystemExit(f\"Unknown config key: {args.key}\")\n\n\ndef build_parser() -> argparse.ArgumentParser:\n    parser = argparse.ArgumentParser(description=\"Manage the last30days watchlist\")\n    sub = parser.add_subparsers(dest=\"command\")\n\n    add = sub.add_parser(\"add\")\n    add.add_argument(\"topic\")\n    add.add_argument(\"--schedule\")\n    add.add_argument(\"--weekly\", action=\"store_true\")\n    add.add_argument(\"--queries\")\n    add.set_defaults(func=cmd_add)\n\n    remove = sub.add_parser(\"remove\")","sourceCodeStart":246,"sourceCodeEnd":282,"githubUrl":"https://github.com/mvanhorn/last30days-skill/blob/c7460f6114449ddfe6ea3fc2f23c3d910c0e740c/skills/last30days/scripts/watchlist.py#L246-L282","documentation":"Error \"delivery_channel must be an https:// URL, got {value!r}\" thrown in mvanhorn/last30days-skill.","triggerScenarios":"Fires when the user sets the watchlist delivery_channel config key to a value that is not an https:// URL. Plain http:// URLs, bare hostnames, webhook paths without scheme, or empty strings all fail this validation.","commonSituations":"See trigger scenarios.","solutions":["Pass an https:// URL for the delivery channel, e.g. watchlist.py config delivery https://example.com/webhook.","Use an empty value to clear the delivery channel if you do not want delivery configured."],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"c7460f6114449ddfe6ea3fc2f23c3d910c0e740c","analyzedAt":"2026-08-15T03:34:49.540Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}