{"record":{"id":"87f3f5ee7991fb0d","repo":"HKUDS/Vibe-Trading","slug":"unknown-panel-column-column","errorCode":null,"errorMessage":"unknown panel column: {column}","messagePattern":"unknown panel column: (.+?)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"agent/src/factors/registry.py","lineNumber":84,"sourceCode":"Universe = Literal[\"equity_us\", \"equity_cn\", \"equity_hk\", \"equity_in\", \"equity_kr\", \"crypto\", \"futures\"]\n\n\ndef validate_columns_required(cols: list[str]) -> None:\n    \"\"\"Validate required panel columns for alpha metadata.\n\n    Args:\n        cols: Declared panel columns from ``__alpha_meta__``.\n\n    Raises:\n        ValueError: If a column is neither a known price column nor a\n            ``fund:``-prefixed fundamental column.\n    \"\"\"\n    for column in cols:\n        if column in _PRICE_COLS:\n            continue\n        if column.startswith(\"fund:\"):\n            continue\n        raise ValueError(f\"unknown panel column: {column}\")\n\n\nclass AlphaMeta(BaseModel):\n    \"\"\"Strict metadata schema; matches the ``__alpha_meta__`` dict literal.\"\"\"\n\n    model_config = ConfigDict(extra=\"forbid\", frozen=True)\n\n    id: str = Field(pattern=r\"^[a-z][a-z0-9]+_[a-z0-9_]+$\")\n    nickname: str | None = None\n    theme: list[Theme]\n    formula_latex: str\n    columns_required: list[PanelColumn]\n    extras_required: list[str] = Field(default_factory=list)\n    requires_sector: bool = False\n    universe: list[Universe]\n    frequency: list[str]\n    decay_horizon: int = Field(ge=0, le=512)\n    min_warmup_bars: int = Field(ge=0)","sourceCodeStart":66,"sourceCodeEnd":102,"githubUrl":"https://github.com/HKUDS/Vibe-Trading/blob/80ffdda44c5c4db0dd84d70e051cca591cea67df/agent/src/factors/registry.py#L66-L102","documentation":"validate_columns_required checks that every column a factor declares is either a known price column (in _PRICE_COLS) or a fund-prefixed column ('fund:...'). Any other column name raises ValueError because the panel builder would not know how to supply it.","triggerScenarios":"Declaring a column like 'turnover' or 'pe_ratio' in a factor's required columns when it is not in _PRICE_COLS and lacks the 'fund:' prefix.","commonSituations":"Adding a new factor that depends on an unsupported data field, typos in column names ('Close' vs 'close'), or forgetting the fund: namespace for fundamental data.","solutions":["Fix the column name to match a known _PRICE_COLS entry","Use the 'fund:' prefix if it is fundamental data","Extend _PRICE_COLS in the registry if a genuinely new column type is supported by your panel builder"],"exampleFix":"# before\n__alpha_meta__ = {..., 'columns': ['turnover']}\n# after\n__alpha_meta__ = {..., 'columns': ['fund:turnover']}","handlingStrategy":"validation","validationCode":"from factors.registry import _PRICE_COLS\nbad = [c for c in cols if c not in _PRICE_COLS and not c.startswith('fund:')]\nassert not bad, f'unknown columns: {bad}'","typeGuard":"def is_known_column(c: str) -> bool:\n    return c in _PRICE_COLS or c.startswith('fund:')","tryCatchPattern":"try:\n    validate_columns_required(cols)\nexcept ValueError as e:\n    raise ConfigError(f'factor spec rejected: {e}') from e","preventionTips":["Author factors against the documented column whitelist","Use the fund: prefix for fundamentals"],"tags":["registry","column-validation","factor-spec"],"backgroundTag":"unknown-column-reference","analyzedSha":"80ffdda44c5c4db0dd84d70e051cca591cea67df","analyzedAt":"2026-08-28T12:46:38.989Z","schemaVersion":2},"datasetVersion":"2026-08-28T16:17:29.566Z"}