{"record":{"id":"1b578bbee91661fd","repo":"HKUDS/Vibe-Trading","slug":"weights-name-symbols-not-in-the-basket-sorted-un","errorCode":null,"errorMessage":"weights name symbols not in the basket: {sorted(unknown)}","messagePattern":"weights name symbols not in the basket: (.+?)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"agent/src/tools/portfolio_risk_tool.py","lineNumber":142,"sourceCode":"                \"start_date\": start_date,\n                \"end_date\": end_date,\n                \"interval\": interval,\n                \"source\": source,\n                \"unresolved_symbols\": list(unresolved or []),\n            },\n        }\n        return json.dumps(envelope, ensure_ascii=False, indent=2, allow_nan=False)\n\n    # ------------------------------------------------------------------\n    @staticmethod\n    def _parse_weights(raw: Any, symbols: list[str]) -> dict[str, float]:\n        if raw is None:\n            return {sym: 1.0 / len(symbols) for sym in symbols}\n        if not isinstance(raw, Mapping):\n            raise ValueError(\"weights must be an object mapping symbol → number\")\n        unknown = [sym for sym in raw if sym not in symbols]\n        if unknown:\n            raise ValueError(f\"weights name symbols not in the basket: {sorted(unknown)}\")\n        missing = [sym for sym in symbols if sym not in raw]\n        if missing:\n            raise ValueError(f\"weights missing basket symbols: {sorted(missing)}\")\n        return {sym: raw[sym] for sym in symbols}\n\n    @staticmethod\n    def _parse_dates(start_raw: Any, end_raw: Any) -> tuple[str, str]:\n        end = (\n            datetime.strptime(end_raw, \"%Y-%m-%d\").date()\n            if isinstance(end_raw, str) and end_raw\n            else datetime.now(timezone.utc).date()\n        )\n        start = (\n            datetime.strptime(start_raw, \"%Y-%m-%d\").date()\n            if isinstance(start_raw, str) and start_raw\n            else end - timedelta(days=_DEFAULT_LOOKBACK_DAYS)\n        )\n        if start >= end:","sourceCodeStart":124,"sourceCodeEnd":160,"githubUrl":"https://github.com/HKUDS/Vibe-Trading/blob/80ffdda44c5c4db0dd84d70e051cca591cea67df/agent/src/tools/portfolio_risk_tool.py#L124-L160","documentation":"When weights is a Mapping, _parse_weights requires its keys to be exactly the basket: keys not present in symbols raise 'weights name symbols not in the basket' with the sorted unknown names (missing keys raise a separate error).","triggerScenarios":"weights={\"AAPL\": 0.5, \"TSLA\": 0.5} when symbols=[\"AAPL\",\"MSFT\"] — TSLA is unknown.","commonSituations":"Editing the basket without updating weights, case/ticker mismatches (BRK.B vs BRK-B), or stale weight dicts from previous runs.","solutions":["Make weights keys exactly match the symbols list (after trimming)","Rebuild weights from symbols: dict(zip(symbols, itertools.repeat(1/len(symbols)))) or similar","Normalize ticker formatting (case, dot/dash share classes) between both arguments"],"exampleFix":"# before\nexecute(symbols=[\"AAPL\",\"MSFT\"], weights={\"AAPL\": 0.5, \"TSLA\": 0.5})\n# after\nexecute(symbols=[\"AAPL\",\"MSFT\"], weights={\"AAPL\": 0.5, \"MSFT\": 0.5})","handlingStrategy":"validation","validationCode":"symbols = [s.strip() for s in symbols]\nweights = {k.strip(): v for k, v in weights.items()}\nunknown = sorted(set(weights) - set(symbols))\nmissing = sorted(set(symbols) - set(weights))\nassert not unknown and not missing","typeGuard":"def weights_match_basket(w: Mapping[str, float], symbols: list[str]) -> bool:\n    s = {x.strip() for x in symbols}\n    return {k.strip() for k in w} == s","tryCatchPattern":"try:\n    out = tool.execute(symbols=symbols, weights=weights)\nexcept ValueError as e:\n    if \"not in the basket\" in str(e):\n        weights = {k: v for k, v in weights.items() if k in symbols}\n        weights.update({s: 0.0 for s in symbols if s not in weights})\n        out = tool.execute(symbols=symbols, weights=weights)","preventionTips":["Generate weights from the symbols list itself","Normalize ticker formatting (case, dash/dot) on both sides","Regenerate weight dicts whenever the basket changes"],"tags":["portfolio-risk","weights","key-mismatch"],"backgroundTag":"schema-validation-failed","analyzedSha":"80ffdda44c5c4db0dd84d70e051cca591cea67df","analyzedAt":"2026-08-28T12:46:38.989Z","schemaVersion":2},"datasetVersion":"2026-08-28T16:17:29.566Z"}