{"record":{"id":"9b8de1b02eeceee8","repo":"rohitg00/ai-engineering-from-scratch","slug":"tool-name-name-r-must-match-self-name-re-patte","errorCode":null,"errorMessage":"tool name {name!r} must match {self._NAME_RE.pattern}","messagePattern":"tool name (.+?) must match (.+?)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"phases/19-capstone-projects/21-tool-registry-schema-validation/code/main.py","lineNumber":81,"sourceCode":"\n    _NAME_RE = re.compile(r\"^[a-z][a-z0-9_]*(\\.[a-z][a-z0-9_]*)*$\")\n\n    def __init__(self) -> None:\n        self._records: dict[str, ToolRecord] = {}\n        self._order: list[str] = []\n\n    def register(\n        self,\n        name: str,\n        schema: dict,\n        handler: Callable[..., Any],\n        description: str = \"\",\n        idempotent: bool = False,\n        timeout_ms: int = 30_000,\n        override: bool = False,\n    ) -> ToolRecord:\n        if not self._NAME_RE.match(name):\n            raise ValueError(f\"tool name {name!r} must match {self._NAME_RE.pattern}\")\n        if name in self._records and not override:\n            raise ValueError(f\"tool {name!r} already registered; pass override=True to replace\")\n        validate_schema_shape(schema)\n        rec = ToolRecord(\n            name=name, description=description, schema=schema, handler=handler,\n            idempotent=idempotent, timeout_ms=timeout_ms,\n        )\n        if name not in self._records:\n            self._order.append(name)\n        self._records[name] = rec\n        return rec\n\n    def get(self, name: str) -> ToolRecord:\n        if name not in self._records:\n            raise KeyError(f\"unknown tool {name!r}\")\n        return self._records[name]\n\n    def names(self) -> list[str]:","sourceCodeStart":63,"sourceCodeEnd":99,"githubUrl":"https://github.com/rohitg00/ai-engineering-from-scratch/blob/39ea8a1c6d0b61f071226eff7ede4d4105fed820/phases/19-capstone-projects/21-tool-registry-schema-validation/code/main.py#L63-L99","documentation":"Naming rule at the top of ToolRegistry.register: tool names must be lowercase dot-segmented identifiers matching ^[a-z][a-z0-9_]*(\\.[a-z][a-z0-9_]*)*$ (e.g. repo.search). Uppercase letters, hyphens, leading digits, or empty segments all fail, because the name becomes the callable API surface and a routing key.","triggerScenarios":"Thrown at phases/19-capstone-projects/21-tool-registry-schema-validation/code/main.py:81 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Rename the tool to lowercase ASCII segments separated by dots","Replace hyphens with underscores and drop leading digits","Generate names from the pattern in code when deriving them from file or class names","Add a registration test asserting the naming contract"],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"39ea8a1c6d0b61f071226eff7ede4d4105fed820","analyzedAt":"2026-08-26T03:13:46.626Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}