{"record":{"id":"8941fa28b2c87072","repo":"HKUDS/Vibe-Trading","slug":"delivery-target-ref-is-required-for-configured-del","errorCode":null,"errorMessage":"delivery.target_ref is required for configured delivery","messagePattern":"delivery\\.target_ref is required for configured delivery","errorType":"validation","errorClass":"ValueError","httpStatus":400,"severity":"error","filePath":"agent/src/scheduled_research/service.py","lineNumber":174,"sourceCode":"        validate_timezone_shape(timezone)\n    else:\n        validate_timezone(timezone)\n    next_run_at = now\n    if timezone is not None and not is_interval_schedule(expression):\n        next_run_at = next_due(expression, now, timezone)\n\n    end_at = _parse_end_at(draft.get(\"end_at\"))\n    if end_at is not None and end_at <= now:\n        raise ValueError(\"end_at must be in the future\")\n    if end_at is not None and next_run_at > end_at:\n        raise ValueError(\"the first scheduled run occurs after end_at\")\n\n    mode = str(delivery_spec.get(\"mode\") or \"in_app\")\n    delivery_channel = delivery_target = target_ref = target_label = None\n    if mode == \"configured\":\n        target_ref = str(delivery_spec.get(\"target_ref\") or \"\").strip()\n        if not target_ref:\n            raise ValueError(\"delivery.target_ref is required for configured delivery\")\n        target = resolve_delivery_target(target_ref)\n        delivery_channel, delivery_target = target.channel, target.target\n        target_label = target.label\n    elif mode == \"origin\":\n        delivery_channel, delivery_target, target_ref, target_label = _origin_target(\n            session_id\n        )\n    elif mode != \"in_app\":\n        raise ValueError(\"delivery.mode must be 'in_app', 'origin', or 'configured'\")\n\n    return ScheduledResearchJob(\n        id=str(draft.get(\"id\") or f\"sr-{uuid.uuid4().hex[:12]}\"),\n        title=title,\n        prompt=prompt,\n        source_type=source_type,\n        playbook_slug=playbook_slug,\n        schedule=expression,\n        timezone=timezone,","sourceCodeStart":156,"sourceCodeEnd":192,"githubUrl":"https://github.com/HKUDS/Vibe-Trading/blob/80ffdda44c5c4db0dd84d70e051cca591cea67df/agent/src/scheduled_research/service.py#L156-L192","documentation":"When delivery.mode is 'configured', the draft must include a non-empty delivery.target_ref that names a pre-configured delivery target (resolved via resolve_delivery_target into channel + target).","triggerScenarios":"delivery={\"mode\":\"configured\"} with target_ref missing, empty, or whitespace; referencing a ref that doesn't resolve (which raises separately in resolve_delivery_target).","commonSituations":"Admin-configured targets not yet created; UI letting users pick 'configured' without choosing a target; ref renamed in config.","solutions":["Include delivery.target_ref matching a configured target, e.g. {\"mode\":\"configured\",\"target_ref\":\"team-ops\"}","Verify the ref exists via your delivery target configuration before submitting","Default the UI to require target selection when mode is configured"],"exampleFix":"// before\n{\"delivery\": {\"mode\": \"configured\"}}\n// after\n{\"delivery\": {\"mode\": \"configured\", \"target_ref\": \"team-ops\"}}","handlingStrategy":"validation","validationCode":"if draft.get(\"delivery\", {}).get(\"mode\") == \"configured\":\n    assert str(draft[\"delivery\"].get(\"target_ref\") or \"\").strip(), \"target_ref required\"","typeGuard":"def configured_delivery_valid(d: dict) -> bool:\n    return d.get(\"mode\") != \"configured\" or bool(str(d.get(\"target_ref\") or \"\").strip())","tryCatchPattern":"try:\n    propose_create(draft)\nexcept ValueError as e:\n    if \"target_ref is required\" in str(e):\n        draft[\"delivery\"] = {\"mode\": \"in_app\"}  # fallback","preventionTips":["Require target selection when mode='configured' in the UI","Maintain the delivery-target registry and validate refs exist before submit"],"tags":["scheduled-research","delivery","validation","required-field"],"backgroundTag":"missing-required-field","analyzedSha":"80ffdda44c5c4db0dd84d70e051cca591cea67df","analyzedAt":"2026-08-28T12:46:38.989Z","schemaVersion":2},"datasetVersion":"2026-08-28T16:17:29.566Z"}