{
 "action": "Not for automatic application — format add: the entry does not say where the added code goes. Show this correction to the user as a lead. Subclasses of Logger must now implement enabled. Signature in opentelemetry-api 1.45.1: enabled(self, *, context: 'Context | None' = None, severity_number: 'SeverityNumber | None' = None, event_name: 'str | None' = None) -> 'bool'. Add it to your subclass; the version shown passed in the sandbox.",
 "alternatives": [
  {
   "action": "Not for automatic application — format add: the entry does not say where the added code goes. Show this correction to the user as a lead. Subclasses of Logger must now implement enabled. Signature in opentelemetry-api 1.45.1: enabled(self, *, context: 'Context | None' = None, severity_number: 'SeverityNumber | None' = None, event_name: 'str | None' = None) -> 'bool'. Add it to your subclass; the version shown passed in the sandbox.",
   "applicability": {
    "method": "literal_patch",
    "reason": "format add: the entry does not say where the added code goes",
    "run_on": "1.45.1",
    "status": "not_applicable"
   },
   "by_notes": true,
   "changelog_ref": {
    "quote": "[BREAKING] `opentelemetry-api`: subclasses of `Logger` need to implement the `enabled` method",
    "url": "https://github.com/open-telemetry/opentelemetry-python/releases/tag/v1.43.0"
   },
   "confirmations": 4,
   "detect": [
    "Logger"
   ],
   "equivalence": "same",
   "format": "add",
   "kind": "new_required",
   "required": {
    "base": "Logger",
    "class_in_code": "InMemoryLogger",
    "names": [
     "enabled"
    ],
    "signature": {
     "enabled": "enabled(self, *, context: 'Context | None' = None, severity_number: 'SeverityNumber | None' = None, event_name: 'str | None' = None) -> 'bool'"
    },
    "what": "method"
   },
   "right": "def enabled(self, *args, **kwargs):\n    return True",
   "script_right": "import inspect\nimport time\nfrom typing import List\n\nfrom opentelemetry._logs import Logger, LogRecord, SeverityNumber\n\n\nclass InMemoryLogger(Logger):\n    \"\"\"A minimal Logger that stores emitted LogRecords in a list.\"\"\"\n\n    def __init__(self, name, version=None, schema_url=None):\n        super().__init__(name, version=version, schema_url=schema_url)\n        self.records: List[LogRecord] = []\n\n    def enabled(self, *args, **kwargs):\n        return True\n\n    def emit(self, record=None, *args, **kwargs):\n        # Newer API versions allow emit() to be called with keyword arguments\n        # instead of a LogRecord; handle both styles.\n        if record is None:\n            accepted = inspect.signature(LogRecord.__init__).parameters\n            filtered = {k: v for k, v in kwargs.items() if k in accepted}\n            record = LogRecord(**filtered)\n        self.records.append(record)\n\n\ndef main():\n    logger = InMemoryLogger(\"in-memory-demo\", version=\"1.0.0\")\n\n    samples = [\n        (\"INFO\", SeverityNumber.INFO, \"Application started\"),\n        (\"WARN\", SeverityNumber.WARN, \"Disk space running low\"),\n        (\"ERROR\", SeverityNumber.ERROR, \"Failed to connect to database\"),\n    ]\n\n    for text, number, body in samples:\n        logger.emit(\n            LogRecord(\n                timestamp=time.time_ns(),\n                severity_text=text,\n                severity_number=number,\n                body=body,\n            )\n        )\n\n    for rec in logger.records:\n        print(f\"{rec.severity_text}: {rec.body}\")\n\n\nif __name__ == \"__main__\":\n    main()",
   "script_wrong": "import inspect\nimport time\nfrom typing import List\n\nfrom opentelemetry._logs import Logger, LogRecord, SeverityNumber\n\n\nclass InMemoryLogger(Logger):\n    \"\"\"A minimal Logger that stores emitted LogRecords in a list.\"\"\"\n\n    def __init__(self, name, version=None, schema_url=None):\n        super().__init__(name, version=version, schema_url=schema_url)\n        self.records: List[LogRecord] = []\n\n    def emit(self, record=None, *args, **kwargs):\n        # Newer API versions allow emit() to be called with keyword arguments\n        # instead of a LogRecord; handle both styles.\n        if record is None:\n            accepted = inspect.signature(LogRecord.__init__).parameters\n            filtered = {k: v for k, v in kwargs.items() if k in accepted}\n            record = LogRecord(**filtered)\n        self.records.append(record)\n\n\ndef main():\n    logger = InMemoryLogger(\"in-memory-demo\", version=\"1.0.0\")\n\n    samples = [\n        (\"INFO\", SeverityNumber.INFO, \"Application started\"),\n        (\"WARN\", SeverityNumber.WARN, \"Disk space running low\"),\n        (\"ERROR\", SeverityNumber.ERROR, \"Failed to connect to database\"),\n    ]\n\n    for text, number, body in samples:\n        logger.emit(\n            LogRecord(\n                timestamp=time.time_ns(),\n                severity_text=text,\n                severity_number=number,\n                body=body,\n            )\n        )\n\n    for rec in logger.records:\n        print(f\"{rec.severity_text}: {rec.body}\")\n\n\nif __name__ == \"__main__\":\n    main()",
   "seen_in_models": [
    "claude-sonnet-5-5",
    "gpt-6.1-sol"
   ],
   "wrong": "class InMemoryLogger(Logger):"
  },
  {
   "action": "Not for automatic application — format add: the entry does not say where the added code goes. Show this correction to the user as a lead. Review before applying: this fix runs on opentelemetry-api 1.45.1, but its printed output differs from what the original printed on 1.40.0 (observed stdout of one example) — it may do different work. Subclasses of Logger must now implement enabled. Add it to your subclass; the version shown passed in the sandbox.",
   "applicability": {
    "method": "literal_patch",
    "reason": "format add: the entry does not say where the added code goes",
    "run_on": "1.45.1",
    "status": "not_applicable"
   },
   "by_notes": false,
   "changelog_ref": {
    "quote": "",
    "url": ""
   },
   "confirmations": 1,
   "detect": [
    "Logger"
   ],
   "equivalence": "differs",
   "format": "add",
   "kind": "behavior_changed",
   "required": {
    "base": "Logger",
    "class_in_code": "StdoutLogger",
    "names": [
     "enabled"
    ],
    "signature": {},
    "what": "method"
   },
   "right": "def enabled(self, *args, **kwargs):\n    return True",
   "script_right": "\"\"\"Emit and display an event using only opentelemetry-api.\"\"\"\n\ntry:\n    from opentelemetry._events import (\n        Event,\n        EventLogger,\n        EventLoggerProvider,\n        get_event_logger,\n        set_event_logger_provider,\n    )\nexcept ImportError:\n    # Newer releases represent events as log records with an event_name.\n    from opentelemetry._logs import (\n        LogRecord,\n        Logger,\n        LoggerProvider,\n        get_logger,\n        set_logger_provider,\n    )\n\n    class StdoutLogger(Logger):\n        def __init__(self):\n            pass\n\n        def enabled(self, *args, **kwargs):\n            return True\n\n        def emit(self, record=None, **kwargs):\n            name = record.event_name if record is not None else kwargs[\"event_name\"]\n            attributes = record.attributes if record is not None else kwargs[\"attributes\"]\n            print(f\"name={name!r}, attributes={dict(attributes)!r}\")\n\n    class StdoutProvider(LoggerProvider):\n        def get_logger(self, name, version=None, schema_url=None, attributes=None):\n            return StdoutLogger()\n\n    def main():\n        set_logger_provider(StdoutProvider())\n        logger = get_logger(\"checkout-service\")\n        logger.emit(\n            LogRecord(\n                event_name=\"order.placed\",\n                attributes={\"order_id\": \"A123\", \"total\": 42.5},\n            )\n        )\n\nelse:\n    class StdoutEventLogger(EventLogger):\n        def __init__(self):\n            pass\n\n        def emit(self, event):\n            print(f\"name={event.name!r}, attributes={dict(event.attributes)!r}\")\n\n    class StdoutProvider(EventLoggerProvider):\n        def get_event_logger(\n            self, name, version=None, schema_url=None, attributes=None\n        ):\n            return StdoutEventLogger()\n\n    def main():\n        set_event_logger_provider(StdoutProvider())\n        logger = get_event_logger(\"checkout-service\")\n        logger.emit(\n            Event(\n                name=\"order.placed\",\n                attributes={\"order_id\": \"A123\", \"total\": 42.5},\n            )\n        )\n\n\nif __name__ == \"__main__\":\n    main()",
   "script_wrong": "\"\"\"Emit and display an event using only opentelemetry-api.\"\"\"\n\ntry:\n    from opentelemetry._events import (\n        Event,\n        EventLogger,\n        EventLoggerProvider,\n        get_event_logger,\n        set_event_logger_provider,\n    )\nexcept ImportError:\n    # Newer releases represent events as log records with an event_name.\n    from opentelemetry._logs import (\n        LogRecord,\n        Logger,\n        LoggerProvider,\n        get_logger,\n        set_logger_provider,\n    )\n\n    class StdoutLogger(Logger):\n        def __init__(self):\n            pass\n\n        def emit(self, record=None, **kwargs):\n            name = record.event_name if record is not None else kwargs[\"event_name\"]\n            attributes = record.attributes if record is not None else kwargs[\"attributes\"]\n            print(f\"name={name!r}, attributes={dict(attributes)!r}\")\n\n    class StdoutProvider(LoggerProvider):\n        def get_logger(self, name, version=None, schema_url=None, attributes=None):\n            return StdoutLogger()\n\n    def main():\n        set_logger_provider(StdoutProvider())\n        logger = get_logger(\"checkout-service\")\n        logger.emit(\n            LogRecord(\n                event_name=\"order.placed\",\n                attributes={\"order_id\": \"A123\", \"total\": 42.5},\n            )\n        )\n\nelse:\n    class StdoutEventLogger(EventLogger):\n        def __init__(self):\n            pass\n\n        def emit(self, event):\n            print(f\"name={event.name!r}, attributes={dict(event.attributes)!r}\")\n\n    class StdoutProvider(EventLoggerProvider):\n        def get_event_logger(\n            self, name, version=None, schema_url=None, attributes=None\n        ):\n            return StdoutEventLogger()\n\n    def main():\n        set_event_logger_provider(StdoutProvider())\n        logger = get_event_logger(\"checkout-service\")\n        logger.emit(\n            Event(\n                name=\"order.placed\",\n                attributes={\"order_id\": \"A123\", \"total\": 42.5},\n            )\n        )\n\n\nif __name__ == \"__main__\":\n    main()",
   "seen_in_models": [
    "gpt-6.1-sol"
   ],
   "wrong": "class StdoutLogger(Logger):"
  }
 ],
 "applicability": {
  "method": "literal_patch",
  "reason": "format add: the entry does not say where the added code goes",
  "run_on": "1.45.1",
  "status": "not_applicable"
 },
 "by_notes": true,
 "changelog_ref": {
  "quote": "[BREAKING] `opentelemetry-api`: subclasses of `Logger` need to implement the `enabled` method",
  "url": "https://github.com/open-telemetry/opentelemetry-python/releases/tag/v1.43.0"
 },
 "confirmations": {
  "failed": 0,
  "worked": 10
 },
 "detect": [
  "Logger"
 ],
 "ecosystem": "pypi",
 "equivalence": "same",
 "error_kind": "type_error",
 "error_signature": {
  "message": "Can't instantiate abstract class InMemoryLogger with abstract method enabled",
  "norm": "type_error:",
  "type": "TypeError"
 },
 "first_seen": "2026-10-20T16:11:13+00:00",
 "format": "add",
 "format_version": 2,
 "id": "pypi/opentelemetry-api/1.45.1/0001",
 "kind": "new_required",
 "license": "https://creativecommons.org/licenses/by/4.0/",
 "package": "opentelemetry-api",
 "proof": {
  "applicability": {
   "method": "literal_patch",
   "reason": "format add: the entry does not say where the added code goes",
   "run_on": "1.45.1",
   "status": "not_applicable"
  },
  "auto_apply": false,
  "auto_apply_reason": "the patch gives not_applicable when applied word for word",
  "auto_apply_rule": "Automatic application is allowed only when proof.equivalent is true and proof.applicability.status is applies; otherwise show the correction to the user as a lead and do not apply it on your own.",
  "equivalence": "same",
  "equivalent": true,
  "fails_on": "1.45.1",
  "fixed_on": "1.45.1",
  "level": "differential",
  "method": {
   "fix_on": "1.45.1",
   "name": "stdout_match",
   "normalization": "lines stripped, blank lines dropped, runs of whitespace collapsed; memory addresses, timestamps and temporary paths masked",
   "original_on": "1.40.0",
   "scope": "the observable stdout of one example script; return values, files, other inputs and exception types are not compared, so a match is not a proof of equivalent behaviour"
  },
  "script_right": "from typing import List\n\nfrom opentelemetry._logs import Logger, LogRecord, SeverityNumber\n\n\nclass InMemoryLogger(Logger):\n    \"\"\"A minimal Logger that stores emitted LogRecords in a list instead of exporting them.\"\"\"\n\n    def __init__(self, name: str = \"in-memory-logger\") -> None:\n        super().__init__(name)\n        self.records: List[LogRecord] = []\n\n    def enabled(self, *args, **kwargs) -> bool:\n        return True\n\n    def emit(self, record=None, *args, **kwargs) -> None:\n        # Newer API versions also allow keyword-based emit; build a record in that case.\n        if record is None:\n            record = LogRecord(**kwargs)\n        self.records.append(record)\n\n\ndef main() -> None:\n    logger = InMemoryLogger()\n\n    logger.emit(\n        LogRecord(\n            severity_text=\"INFO\",\n            severity_number=SeverityNumber.INFO,\n            body=\"Application started\",\n        )\n    )\n    logger.emit(\n        LogRecord(\n            severity_text=\"WARN\",\n            severity_number=SeverityNumber.WARN,\n            body=\"Disk usage is above 80%\",\n        )\n    )\n    logger.emit(\n        LogRecord(\n            severity_text=\"ERROR\",\n            severity_number=SeverityNumber.ERROR,\n            body=\"Failed to connect to database\",\n        )\n    )\n\n    for record in logger.records:\n        print(f\"{record.severity_text}: {record.body}\")\n\n\nif __name__ == \"__main__\":\n    main()",
  "script_wrong": "from typing import List\n\nfrom opentelemetry._logs import Logger, LogRecord, SeverityNumber\n\n\nclass InMemoryLogger(Logger):\n    \"\"\"A minimal Logger that stores emitted LogRecords in a list instead of exporting them.\"\"\"\n\n    def __init__(self, name: str = \"in-memory-logger\") -> None:\n        super().__init__(name)\n        self.records: List[LogRecord] = []\n\n    def emit(self, record=None, *args, **kwargs) -> None:\n        # Newer API versions also allow keyword-based emit; build a record in that case.\n        if record is None:\n            record = LogRecord(**kwargs)\n        self.records.append(record)\n\n\ndef main() -> None:\n    logger = InMemoryLogger()\n\n    logger.emit(\n        LogRecord(\n            severity_text=\"INFO\",\n            severity_number=SeverityNumber.INFO,\n            body=\"Application started\",\n        )\n    )\n    logger.emit(\n        LogRecord(\n            severity_text=\"WARN\",\n            severity_number=SeverityNumber.WARN,\n            body=\"Disk usage is above 80%\",\n        )\n    )\n    logger.emit(\n        LogRecord(\n            severity_text=\"ERROR\",\n            severity_number=SeverityNumber.ERROR,\n            body=\"Failed to connect to database\",\n        )\n    )\n\n    for record in logger.records:\n        print(f\"{record.severity_text}: {record.body}\")\n\n\nif __name__ == \"__main__\":\n    main()",
  "works_on": "1.40.0"
 },
 "required": {
  "base": "Logger",
  "class_in_code": "InMemoryLogger",
  "names": [
   "enabled"
  ],
  "signature": {
   "enabled": "enabled(self, *, context: 'Context | None' = None, severity_number: 'SeverityNumber | None' = None, event_name: 'str | None' = None) -> 'bool'"
  },
  "what": "method"
 },
 "right": "def enabled(self, *args, **kwargs) -> bool:\n    return True",
 "seen_in_models": [
  "claude-sonnet-5-5",
  "gemini-3.8-flash",
  "gpt-6.1-sol"
 ],
 "seq": 1,
 "slug": "logger-enabled",
 "source": "pipeline",
 "symbol": "Logger.enabled",
 "updated": "2026-10-27T17:20:00+00:00",
 "url": "https://formachines.ai/errata/pypi/opentelemetry-api/0001-logger-enabled/",
 "variant_confirmations": 5,
 "variant_models": [
  "claude-sonnet-5-5",
  "gemini-3.8-flash",
  "gpt-6.1-sol"
 ],
 "verified": "sandbox",
 "versions": {
  "changed_in": ">1.40.0,<=1.45.1",
  "fails_on": "1.45.1",
  "works_on": "1.40.0"
 },
 "wrong": "class InMemoryLogger(Logger):"
}