{"record":{"id":"840fa98ff3b92ee2","repo":"xai-org/x-algorithm","slug":"shard-sources-entry-must-be-name-fname-offset","errorCode":null,"errorMessage":"shard_sources entry must be (name, fname, offset, size) for name {key}","messagePattern":"shard_sources entry must be \\(name, fname, offset, size\\) for name (.+?)","errorType":"validation","errorClass":"PyTypeError","httpStatus":null,"severity":"error","filePath":"phoenix/crates/serving/xai-recsys-engine/src/emb_table.rs","lineNumber":1433,"sourceCode":"        let tuple = t.downcast::<PyTuple>().map_err(|_| err0())?;\n        if tuple.len() != 4 {\n            return Err(err0());\n        }\n        let k = tuple.get_item(0)?;\n        let key: String = k.extract().map_err(|_| {\n            PyTypeError::new_err(format!(\n                \"shard_sources name {} must be a string\",\n                k.repr()\n                    .map(|s| s.to_string())\n                    .unwrap_or(\"<unknown>\".to_string())\n            ))\n        })?;\n        let err = || {\n            PyTypeError::new_err(format!(\n                \"shard_sources entry must be (name, fname, offset, size) for name {key}\"\n            ))\n        };\n        let fname: String = tuple.get_item(1)?.extract().map_err(|_| err())?;\n        let offset: usize = tuple.get_item(2)?.extract().map_err(|_| err())?;\n        let size: usize = tuple.get_item(3)?.extract().map_err(|_| err())?;\n        parsed.push((key, fname, offset, size));\n    }\n    let path = path.to_string();\n    let urls = urls.to_string();\n    let tensor_slice = tensor.as_slice_mut()?;\n    py.detach(|| {\n        load_tensor_into(\n            &path,\n            &urls,\n            &parsed,\n            tensor_slice,\n            row_size,\n            num_row_segments,\n        )\n        .map_err(PyOSError::new_err)\n    })","sourceCodeStart":1415,"sourceCodeEnd":1451,"githubUrl":"https://github.com/xai-org/x-algorithm/blob/24c60942c5c5fdad3a6addffb4c6e6d2f228f04f/phoenix/crates/serving/xai-recsys-engine/src/emb_table.rs#L1415-L1451","documentation":"PyTypeError raised by load_tensor when the fname (element 1) of a shard_sources entry cannot be extracted as a String. Each entry must be a 4-tuple (name, fname, offset, size); this specific line is the fname extraction failing.","triggerScenarios":"Calling load_tensor with a shard_sources entry whose second element is not a string — e.g. a Path object in some contexts, an int, None, or the tuple having elements in the wrong order.","commonSituations":"Building shard_sources from JSON where fname is null or numeric; passing pathlib.Path without str(); misordered tuple fields when offset/fname are swapped.","solutions":["Ensure each entry is exactly (str name, str fname, int offset, int size)","Verify fname is a plain Python str, not Path/None/int","Check the tuple field order matches the manifest you generated"],"exampleFix":"# before\nentries = [(name, offset, fname, size)]\n# after\nentries = [(name, str(fname), int(offset), int(size))]","handlingStrategy":"type-guard","validationCode":"assert all(isinstance(e, tuple) and len(e) == 4 and isinstance(e[1], str) for e in shard_sources.values())","typeGuard":"def valid_shard_entries(srcs): return all(isinstance(e,(tuple,list)) and len(e)==4 and isinstance(e[0],str) and isinstance(e[1],str) and isinstance(e[2],int) and isinstance(e[3],int) for e in srcs)","tryCatchPattern":"except TypeError: log the offending entry's repr and types before re-raising","preventionTips":["Build shard_sources from a typed dataclass or validated loader","Never pass raw parsed JSON straight into load_tensor"],"tags":["pyo3","tuple-validation","shard-loading"],"backgroundTag":"invalid-tuple-argument","analyzedSha":"24c60942c5c5fdad3a6addffb4c6e6d2f228f04f","analyzedAt":"2026-08-28T11:40:14.686Z","schemaVersion":2},"datasetVersion":"2026-08-28T16:17:29.566Z"}