{
  "__type": "IngestedDoc",
  "__tag": 4010,
  "_content": {},
  "_ordered_sections": [],
  "item_file": null,
  "item_line": null,
  "item_type": null,
  "aliases": [],
  "example_section_data": {
    "__type": "Section",
    "__tag": 4015,
    "children": [],
    "title": [],
    "level": 0,
    "target": null
  },
  "see_also": [],
  "signature": null,
  "references": null,
  "qa": "whatsnew:version9",
  "arbitrary": [
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "9.x Series"
        }
      ],
      "level": 0,
      "target": null
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "IPython 9.17"
        }
      ],
      "level": 1,
      "target": "version 9.17"
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "This release is mostly about how long IPython takes to start. Two further passes over the startup path -- deferring imports to their use sites, keeping pygments' plugin machinery out of it, and declaring IPython's own magics lazily -- together cut a large fraction off "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "import IPython"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " and off getting to a prompt, without any change in behaviour. Alongside that: a new "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "IPYTHON_KITTY_GRAPHICS"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " environment variable to override terminal graphics detection, "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "as"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " aliasing in "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "aimport"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ", and two input- and output-handling fixes."
            }
          ]
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "There are no backwards-incompatible changes in this release."
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "Summary"
        }
      ],
      "level": 2,
      "target": null
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "%aimport"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " now accepts the "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "module as alias"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " form, matching a plain "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "import"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " statement      "
            }
          ]
        },
        {
          "__type": "Code",
          "__tag": 4050,
          "value": "%aimport numpy as np",
          "execution_status": null,
          "out": ""
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "The module is marked for autoreloading as before, and is pushed into the user namespace under the alias rather than under its own name."
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "InlineCode",
          "__tag": 4051,
          "value": "%aimport"
        },
        {
          "__type": "Text",
          "__tag": 4046,
          "value": " understands "
        },
        {
          "__type": "InlineCode",
          "__tag": 4051,
          "value": "as"
        },
        {
          "__type": "Text",
          "__tag": 4046,
          "value": " aliases"
        }
      ],
      "level": 2,
      "target": null
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "Since Python 3.12 the tokenizer raises "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "TokenError"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " for malformed numeric literals such as "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "0b12"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ", "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "0o1239"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " or "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "1__2"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ". IPython did not recognise those errors, and the resulting token stream had no "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "ENDMARKER"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ", so "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "check_complete"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " reported the input as "
            },
            {
              "__type": "Emphasis",
              "__tag": 4047,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "incomplete"
                }
              ]
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ": typing one of them in the terminal left you at a continuation prompt instead of raising "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "SyntaxError"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ". They are now treated like the other hard tokenizer errors and the input is reported as invalid. Genuinely unfinished input -- an unterminated multiline string or expression -- is still reported as incomplete."
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "Malformed number literals are reported as syntax errors"
        }
      ],
      "level": 2,
      "target": null
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "CrossRef",
              "__tag": 4002,
              "value": "set_term_title",
              "reference": {
                "__type": "LocalRef",
                "__tag": 4022,
                "kind": "module",
                "path": "IPython.utils.terminal:set_term_title"
              },
              "kind": "module"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " writes the title inside a terminal escape sequence, so a title containing control characters -- an escape, a bell, or a newline -- could end the sequence early and have the rest interpreted by the terminal. This mattered for titles built from data IPython does not control, such as a directory name. Control characters are now removed before the title is written."
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "Control characters are stripped from the terminal title"
        }
      ],
      "level": 2,
      "target": null
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "IPython decides whether the terminal understands the "
            },
            {
              "__type": "Link",
              "__tag": 4049,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "kitty graphics protocol"
                }
              ],
              "url": "https://sw.kovidgoyal.net/kitty/graphics-protocol/",
              "title": ""
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " by walking up the process tree looking for a known terminal emulator. That guess can be wrong -- for instance inside "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "tmux"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ", a container, or an emulator not on the list -- and it is not free: it imports "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "psutil"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " and inspects the process tree on every startup that has a tty."
            }
          ]
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "The "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "IPYTHON_KITTY_GRAPHICS"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " environment variable now states the answer outright and skips the detection entirely      "
            }
          ]
        },
        {
          "__type": "Code",
          "__tag": 4050,
          "value": "IPYTHON_KITTY_GRAPHICS=1 ipython     # my terminal does support it\nIPYTHON_KITTY_GRAPHICS=0 ipython     # it does not; do not even look",
          "execution_status": null,
          "out": ""
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "Accepted values are "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "1"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "/"
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "true"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " and "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "0"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "/"
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "false"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ", case-insensitive. Leaving it unset, or setting it to the empty string, keeps the existing autodetection. Any other value is ignored with a warning, so a typo cannot silently turn graphics off."
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "Forcing kitty graphics support on or off"
        }
      ],
      "level": 2,
      "target": null
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "IPython's own magics are now declared lazily. Starting a shell used to import all fifteen modules under "
            },
            {
              "__type": "CrossRef",
              "__tag": 4002,
              "value": "IPython.core.magics",
              "reference": {
                "__type": "LocalRef",
                "__tag": 4022,
                "kind": "module",
                "path": "IPython.core.magics"
              },
              "kind": "module"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " and instantiate every "
            },
            {
              "__type": "CrossRef",
              "__tag": 4002,
              "value": "Magics",
              "reference": {
                "__type": "LocalRef",
                "__tag": 4022,
                "kind": "module",
                "path": "IPython.core.magic:Magics"
              },
              "kind": "module"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " class in them, even though a session typically uses a handful of magics at most. Only the magic "
            },
            {
              "__type": "Emphasis",
              "__tag": 4047,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "names"
                }
              ]
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " are now known up front, from a hand-maintained table in "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "IPython.core.magics._table"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ", and the module implementing a magic is imported the first time it is looked up. This takes roughly 25 ms off "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "import IPython"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " and shell startup."
            }
          ]
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "This reuses "
            },
            {
              "__type": "CrossRef",
              "__tag": 4002,
              "value": "lazy_magics",
              "reference": {
                "__type": "LocalRef",
                "__tag": 4022,
                "kind": "module",
                "path": "IPython.core.magic:MagicsManager.lazy_magics"
              },
              "kind": "module"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ", which already existed for extensions, so third-party code can declare its magics the same way      "
            }
          ]
        },
        {
          "__type": "Code",
          "__tag": 4050,
          "value": "shell.magics_manager.register_lazy(\"my_magic\", \"my_package.magics:MyMagics\")",
          "execution_status": null,
          "out": ""
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "Its values may now be either "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "\"package.module\""
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ", loaded as an IPython extension as before, or "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "\"package.module:MagicsClass\""
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ", imported and registered directly. Unlike before, a magic declared through "
            },
            {
              "__type": "CrossRef",
              "__tag": 4002,
              "value": "register_lazy",
              "reference": {
                "__type": "LocalRef",
                "__tag": 4022,
                "kind": "module",
                "path": "IPython.core.magic:MagicsManager.register_lazy"
              },
              "kind": "module"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " shows up in "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "%lsmagic"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " and in completion right away rather than only after its first use."
            }
          ]
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "Until a magic is loaded, "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "shell.magics_manager.magics[kind][name]"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " holds a "
            },
            {
              "__type": "CrossRef",
              "__tag": 4002,
              "value": "LazyMagic",
              "reference": {
                "__type": "LocalRef",
                "__tag": 4022,
                "kind": "module",
                "path": "IPython.core.magic:LazyMagic"
              },
              "kind": "module"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " placeholder. Calling it, or reading any attribute of it, loads and delegates to the real magic, so existing code that reaches into that table keeps working. A magics class only appears in "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "shell.configurables"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " once loaded; "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "%config"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " loads everything first, so the list of configurable classes it shows is unchanged."
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "Built-in magics are declared lazily"
        }
      ],
      "level": 2,
      "target": null
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "A second pass over what IPython does before it can show a prompt, on top of the lazy imports and lazy magic registration. Nothing here is visible in normal use; it is all work that used to happen on every start and is now either avoided or postponed until something actually needs it."
            }
          ]
        },
        {
          "__type": "BulletList",
          "__tag": 4053,
          "ordered": false,
          "start": 1,
          "children": [
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": "Resolving a theme's base pygments style no longer imports   "
                    },
                    {
                      "__type": "CrossRef",
                      "__tag": 4002,
                      "value": "pygments.styles",
                      "reference": {
                        "__type": "RefInfo",
                        "__tag": 4000,
                        "module": "pygments",
                        "version": "?",
                        "kind": "module",
                        "path": "pygments.styles"
                      },
                      "kind": "module"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": ", and with it the pygments plugin machinery,   "
                    },
                    {
                      "__type": "CrossRef",
                      "__tag": 4002,
                      "value": "importlib.metadata",
                      "reference": {
                        "__type": "RefInfo",
                        "__tag": 4000,
                        "module": "importlib",
                        "version": "?",
                        "kind": "module",
                        "path": "importlib.metadata"
                      },
                      "kind": "module"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " and "
                    },
                    {
                      "__type": "CrossRef",
                      "__tag": 4002,
                      "value": "email",
                      "reference": {
                        "__type": "RefInfo",
                        "__tag": 4000,
                        "module": "email",
                        "version": "?",
                        "kind": "module",
                        "path": "email"
                      },
                      "kind": "module"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": ". Only the base style's "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "styles"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": "   mapping was ever used, so for the builtin styles IPython's own themes are   based on the defining module is read directly. Styles that are not builtin --   including any provided by a pygments plugin -- still resolve exactly as   before."
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": "Detecting whether the terminal speaks the kitty graphics protocol no longer   imports psutil on Linux. The walk up the process tree needs each ancestor's   name and parent pid, and "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "/proc/<pid>/stat"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " has both. macOS still uses   psutil. This one only ever showed up in an actual terminal: a headless   "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "ipython -c ..."
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " stops at the "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "isatty"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " check before reaching it. Setting   "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "IPYTHON_KITTY_GRAPHICS"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " still skips detection entirely."
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": "The prompt style is built the first time it is drawn rather than each of the   several times it is invalidated while a shell is being set up, and not at all   for a run that never draws a prompt."
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": "More single-use imports moved to their use sites: "
                    },
                    {
                      "__type": "CrossRef",
                      "__tag": 4002,
                      "value": "platform",
                      "reference": {
                        "__type": "RefInfo",
                        "__tag": 4000,
                        "module": "platform",
                        "version": "?",
                        "kind": "module",
                        "path": "platform"
                      },
                      "kind": "module"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": ",   "
                    },
                    {
                      "__type": "CrossRef",
                      "__tag": 4002,
                      "value": "pprint",
                      "reference": {
                        "__type": "LocalRef",
                        "__tag": 4022,
                        "kind": "module",
                        "path": "IPython.lib.pretty:pprint"
                      },
                      "kind": "module"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": ", "
                    },
                    {
                      "__type": "CrossRef",
                      "__tag": 4002,
                      "value": "textwrap",
                      "reference": {
                        "__type": "RefInfo",
                        "__tag": 4000,
                        "module": "textwrap",
                        "version": "?",
                        "kind": "module",
                        "path": "textwrap"
                      },
                      "kind": "module"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": ", "
                    },
                    {
                      "__type": "CrossRef",
                      "__tag": 4002,
                      "value": "html",
                      "reference": {
                        "__type": "RefInfo",
                        "__tag": 4000,
                        "module": "html",
                        "version": "?",
                        "kind": "module",
                        "path": "html"
                      },
                      "kind": "module"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": ", "
                    },
                    {
                      "__type": "CrossRef",
                      "__tag": 4002,
                      "value": "mimetypes",
                      "reference": {
                        "__type": "RefInfo",
                        "__tag": 4000,
                        "module": "mimetypes",
                        "version": "?",
                        "kind": "module",
                        "path": "mimetypes"
                      },
                      "kind": "module"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": ",   "
                    },
                    {
                      "__type": "CrossRef",
                      "__tag": 4002,
                      "value": "locale",
                      "reference": {
                        "__type": "RefInfo",
                        "__tag": 4000,
                        "module": "locale",
                        "version": "?",
                        "kind": "module",
                        "path": "locale"
                      },
                      "kind": "module"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": ", "
                    },
                    {
                      "__type": "CrossRef",
                      "__tag": 4002,
                      "value": "glob",
                      "reference": {
                        "__type": "RefInfo",
                        "__tag": 4000,
                        "module": "glob",
                        "version": "?",
                        "kind": "module",
                        "path": "glob"
                      },
                      "kind": "module"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " and "
                    },
                    {
                      "__type": "CrossRef",
                      "__tag": 4002,
                      "value": "runpy",
                      "reference": {
                        "__type": "RefInfo",
                        "__tag": 4000,
                        "module": "runpy",
                        "version": "?",
                        "kind": "module",
                        "path": "runpy"
                      },
                      "kind": "module"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": ". The AST operator tables the   terminal shortcut filters need moved out of   "
                    },
                    {
                      "__type": "CrossRef",
                      "__tag": 4002,
                      "value": "IPython.core.guarded_eval",
                      "reference": {
                        "__type": "LocalRef",
                        "__tag": 4022,
                        "kind": "module",
                        "path": "IPython.core.guarded_eval"
                      },
                      "kind": "module"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " into a module of their own, so evaluating   a shortcut's filter expression no longer imports the whole guarded   evaluation machinery (and "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "typing_extensions"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": "). They are still importable   from "
                    },
                    {
                      "__type": "CrossRef",
                      "__tag": 4002,
                      "value": "IPython.core.guarded_eval",
                      "reference": {
                        "__type": "LocalRef",
                        "__tag": 4022,
                        "kind": "module",
                        "path": "IPython.core.guarded_eval"
                      },
                      "kind": "module"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": "."
                    }
                  ]
                }
              ]
            }
          ]
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "Together this takes another ~13% off starting an interactive "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "ipython"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " in a real terminal, ~9% off "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "ipython -c pass"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ", and another ~43 modules off an interactive start, on top of the previous rounds."
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "More startup work moved off the critical path"
        }
      ],
      "level": 2,
      "target": null
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "Thanks as well to the "
            },
            {
              "__type": "Link",
              "__tag": 4049,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "D. E. Shaw group"
                }
              ],
              "url": "https://deshaw.com/",
              "title": ""
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " for sponsoring work on IPython."
            }
          ]
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "As usual, you can find the full list of PRs on GitHub under "
            },
            {
              "__type": "Link",
              "__tag": 4049,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "the 9.17"
                }
              ],
              "url": "https://github.com/ipython/ipython/milestone/169?closed=1",
              "title": ""
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " milestone."
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "Thanks"
        }
      ],
      "level": 2,
      "target": null
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "IPython 9.16"
        }
      ],
      "level": 1,
      "target": "version 9.16"
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "This release contains two security-hardening fixes — HTML-attribute escaping in the display objects and closing an arbitrary-code-execution path in completion — a new "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "cell_meta"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " field on "
            },
            {
              "__type": "CrossRef",
              "__tag": 4002,
              "value": "ExecutionInfo",
              "reference": {
                "__type": "LocalRef",
                "__tag": 4022,
                "kind": "module",
                "path": "IPython.core.interactiveshell:ExecutionInfo"
              },
              "kind": "module"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ", several completion, autoreload, and path-handling fixes, and two backwards-incompatible changes ("
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "lsmagic"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " default output and the removal of long-deprecated APIs). It also includes a large amount of internal typing, test, and CI modernization."
            }
          ]
        },
        {
          "__type": "BulletList",
          "__tag": 4053,
          "ordered": false,
          "start": 1,
          "children": [
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15337"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15337",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Resolve attribute annotations under the policy in "
                    },
                    {
                      "__type": "CrossRef",
                      "__tag": 4002,
                      "value": "eval_node",
                      "reference": {
                        "__type": "LocalRef",
                        "__tag": 4022,
                        "kind": "module",
                        "path": "IPython.core.guarded_eval:eval_node"
                      },
                      "kind": "module"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15335"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15335",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Make "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "lsmagic"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " return plain text by default"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15334"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15334",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Escape URLs and file names interpolated into display HTML attributes"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15332"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15332",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Add yakuake to the list of Kitty-compatible terminals"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15330"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15330",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Add version information to deprecation warnings"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15317"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15317",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Only substitute "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "~"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " in "
                    },
                    {
                      "__type": "CrossRef",
                      "__tag": 4002,
                      "value": "compress_user",
                      "reference": {
                        "__type": "LocalRef",
                        "__tag": 4022,
                        "kind": "module",
                        "path": "IPython.utils.path:compress_user"
                      },
                      "kind": "module"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " on a path-component boundary"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15314"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15314",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Refactor banner property logic"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15310"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15310",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Deprecation cleanup and decorator-dependency removal"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15289"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15289",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Make caller locals visible to nested scopes in embedded shells"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15288"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15288",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Limit file completions to path contexts"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15287"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15287",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Centralize image format handling"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15285"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15285",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Disable path elision in tab-completion with "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "min_elide=0"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15276"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15276",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Make "
                    },
                    {
                      "__type": "CrossRef",
                      "__tag": 4002,
                      "value": "Image",
                      "reference": {
                        "__type": "LocalRef",
                        "__tag": 4022,
                        "kind": "module",
                        "path": "IPython.core.display:Image"
                      },
                      "kind": "module"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " with "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "retina=True"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " work with WebP"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15275"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15275",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Fix memory leak and error handling in the LLM autosuggester"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15274"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15274",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Reload "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "__kwdefaults__"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": ", "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "__annotations__"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": ", and "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "__type_params__"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " in autoreload"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15273"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15273",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Close the history database during shell shutdown"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15266"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15266",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Add test covering "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "%%timeit"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " cell magic output format with multiline code"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15260"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15260",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Fix doctest prompt stripping regression"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15071"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15071",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Add "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "cell_meta"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " to "
                    },
                    {
                      "__type": "CrossRef",
                      "__tag": 4002,
                      "value": "ExecutionInfo",
                      "reference": {
                        "__type": "LocalRef",
                        "__tag": 4022,
                        "kind": "module",
                        "path": "IPython.core.interactiveshell:ExecutionInfo"
                      },
                      "kind": "module"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " and pass it through "
                    },
                    {
                      "__type": "CrossRef",
                      "__tag": 4002,
                      "value": "run_cell",
                      "reference": {
                        "__type": "LocalRef",
                        "__tag": 4022,
                        "kind": "module",
                        "path": "IPython.core.interactiveshell:InteractiveShell.run_cell"
                      },
                      "kind": "module"
                    }
                  ]
                }
              ]
            }
          ]
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "In addition, this release lands a broad sweep of internal maintenance: strict "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "mypy"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " type checking and many new annotations, "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "pyupgrade"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "/modernized type annotations, additional "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "ruff"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " rules, narrowed bare "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "except:"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " clauses, removal of the deprecated "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "IPython.utils.py3compat"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " module, new test coverage, and a number of test-suite resource-leak and CI fixes."
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "Summary"
        }
      ],
      "level": 2,
      "target": null
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "Two fixes close paths that could execute unintended code or inject markup:"
            }
          ]
        },
        {
          "__type": "BulletList",
          "__tag": 4053,
          "ordered": false,
          "start": 1,
          "children": [
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": "Values passed to the display objects were interpolated unescaped into quoted   HTML attributes, so a quote character could close the attribute and have the   remainder parsed as markup. "
                    },
                    {
                      "__type": "CrossRef",
                      "__tag": 4002,
                      "value": "Image",
                      "reference": {
                        "__type": "LocalRef",
                        "__tag": 4022,
                        "kind": "module",
                        "path": "IPython.core.display:Image"
                      },
                      "kind": "module"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " and   "
                    },
                    {
                      "__type": "CrossRef",
                      "__tag": 4002,
                      "value": "Video",
                      "reference": {
                        "__type": "LocalRef",
                        "__tag": 4022,
                        "kind": "module",
                        "path": "IPython.core.display:Video"
                      },
                      "kind": "module"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " ("
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "src"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": "), "
                    },
                    {
                      "__type": "CrossRef",
                      "__tag": 4002,
                      "value": "IFrame",
                      "reference": {
                        "__type": "LocalRef",
                        "__tag": 4022,
                        "kind": "module",
                        "path": "IPython.lib.display:IFrame"
                      },
                      "kind": "module"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": "   and its "
                    },
                    {
                      "__type": "CrossRef",
                      "__tag": 4002,
                      "value": "YouTubeVideo",
                      "reference": {
                        "__type": "LocalRef",
                        "__tag": 4022,
                        "kind": "module",
                        "path": "IPython.lib.display:YouTubeVideo"
                      },
                      "kind": "module"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": "/"
                    },
                    {
                      "__type": "CrossRef",
                      "__tag": 4002,
                      "value": "VimeoVideo",
                      "reference": {
                        "__type": "LocalRef",
                        "__tag": 4022,
                        "kind": "module",
                        "path": "IPython.lib.display:VimeoVideo"
                      },
                      "kind": "module"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": "/"
                    },
                    {
                      "__type": "CrossRef",
                      "__tag": 4002,
                      "value": "ScribdDocument",
                      "reference": {
                        "__type": "LocalRef",
                        "__tag": 4022,
                        "kind": "module",
                        "path": "IPython.lib.display:ScribdDocument"
                      },
                      "kind": "module"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": "   subclasses ("
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "src"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": ", "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "width"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": ", "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "height"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": ", reachable through the id argument),   "
                    },
                    {
                      "__type": "CrossRef",
                      "__tag": 4002,
                      "value": "Audio",
                      "reference": {
                        "__type": "LocalRef",
                        "__tag": 4022,
                        "kind": "module",
                        "path": "IPython.lib.display:Audio"
                      },
                      "kind": "module"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " (url and "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "element_id"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": "), and the   "
                    },
                    {
                      "__type": "CrossRef",
                      "__tag": 4002,
                      "value": "FileLinks",
                      "reference": {
                        "__type": "LocalRef",
                        "__tag": 4022,
                        "kind": "module",
                        "path": "IPython.lib.display:FileLinks"
                      },
                      "kind": "module"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " formatter (names read off disk) now escape   these values. For example "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "YouTubeVideo('abc\"><script>')"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " no longer closes   the iframe and injects markup ("
                    },
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15334"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15334",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": ")."
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": "The attribute-completion branch in "
                    },
                    {
                      "__type": "CrossRef",
                      "__tag": 4002,
                      "value": "eval_node",
                      "reference": {
                        "__type": "LocalRef",
                        "__tag": 4022,
                        "kind": "module",
                        "path": "IPython.core.guarded_eval:eval_node"
                      },
                      "kind": "module"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": "   fell back to "
                    },
                    {
                      "__type": "CrossRef",
                      "__tag": 4002,
                      "value": "typing.get_type_hints",
                      "reference": {
                        "__type": "RefInfo",
                        "__tag": 4000,
                        "module": "typing",
                        "version": "?",
                        "kind": "module",
                        "path": "typing:get_type_hints"
                      },
                      "kind": "module"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " after the completion policy had   already refused an attribute. That call resolves stringized annotations with   "
                    },
                    {
                      "__type": "CrossRef",
                      "__tag": 4002,
                      "value": "eval",
                      "reference": {
                        "__type": "RefInfo",
                        "__tag": 4000,
                        "module": "builtins",
                        "version": "?",
                        "kind": "module",
                        "path": "builtins:eval"
                      },
                      "kind": "module"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": ", so completing "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "obj.attr"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " could run whatever an annotation   contained under the default "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "limited"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " policy. Annotations are now collected   with "
                    },
                    {
                      "__type": "CrossRef",
                      "__tag": 4002,
                      "value": "inspect.get_annotations",
                      "reference": {
                        "__type": "RefInfo",
                        "__tag": 4000,
                        "module": "annotationlib",
                        "version": "?",
                        "kind": "module",
                        "path": "annotationlib:get_annotations"
                      },
                      "kind": "module"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " ("
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "eval_str=False"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": ") and resolved through   "
                    },
                    {
                      "__type": "CrossRef",
                      "__tag": 4002,
                      "value": "eval_node",
                      "reference": {
                        "__type": "LocalRef",
                        "__tag": 4022,
                        "kind": "module",
                        "path": "IPython.core.guarded_eval:eval_node"
                      },
                      "kind": "module"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": ", routing them through the same   policy checks as the rest of the input ("
                    },
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15337"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15337",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": ")."
                    }
                  ]
                }
              ]
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "Security Hardening"
        }
      ],
      "level": 2,
      "target": null
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "The "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "cell_meta"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " field is now part of the "
            },
            {
              "__type": "CrossRef",
              "__tag": 4002,
              "value": "ExecutionInfo",
              "reference": {
                "__type": "LocalRef",
                "__tag": 4022,
                "kind": "module",
                "path": "IPython.core.interactiveshell:ExecutionInfo"
              },
              "kind": "module"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " object passed to IPython extensions in the "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "pre_run_cell"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " and "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "post_run_cell"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " callbacks, letting extensions read per-cell metadata forwarded through "
            },
            {
              "__type": "CrossRef",
              "__tag": 4002,
              "value": "run_cell",
              "reference": {
                "__type": "LocalRef",
                "__tag": 4022,
                "kind": "module",
                "path": "IPython.core.interactiveshell:InteractiveShell.run_cell"
              },
              "kind": "module"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " ("
            },
            {
              "__type": "Link",
              "__tag": 4049,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "#15071"
                }
              ],
              "url": "https://github.com/IPython/IPython/pull/15071",
              "title": ""
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ")."
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "InlineCode",
          "__tag": 4051,
          "value": "cell_meta"
        },
        {
          "__type": "Text",
          "__tag": 4046,
          "value": " in "
        },
        {
          "__type": "InlineCode",
          "__tag": 4051,
          "value": "ExecutionInfo"
        }
      ],
      "level": 2,
      "target": null
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "File-name completions are now limited to contexts where a path is expected: string literals, shell and magic contexts, and explicit path-looking tokens. Direct path completion is preserved for prefixes such as "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "./"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ", "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "../"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ", "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "~"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ", absolute paths, and Windows drive paths, and "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "name = !command"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " shell assignment is still recognized ("
            },
            {
              "__type": "Link",
              "__tag": 4049,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "#15288"
                }
              ],
              "url": "https://github.com/IPython/IPython/pull/15288",
              "title": ""
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ", fixes "
            },
            {
              "__type": "Link",
              "__tag": 4049,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "#14501"
                }
              ],
              "url": "https://github.com/IPython/IPython/issues/14501",
              "title": ""
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ")."
            }
          ]
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "Setting "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "c.TerminalInteractiveShell.min_elide = 0"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " now completely disables filename abbreviation (path elision) in tab-completion output, for users who prefer to always see full completion paths ("
            },
            {
              "__type": "Link",
              "__tag": 4049,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "#15285"
                }
              ],
              "url": "https://github.com/IPython/IPython/pull/15285",
              "title": ""
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ")."
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "Completion Improvements"
        }
      ],
      "level": 2,
      "target": null
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "BulletList",
          "__tag": 4053,
          "ordered": false,
          "start": 1,
          "children": [
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "autoreload"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " now also refreshes "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "__kwdefaults__"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": ", "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "__annotations__"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": ",   and "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "__type_params__"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " when reloading functions, keeping reloaded objects   consistent with the edited source ("
                    },
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15274"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15274",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": ")."
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": "Local variables of the calling frame are now visible to nested scopes (such   as comprehensions and nested functions) in embedded shells ("
                    },
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15289"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15289",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": ")."
                    }
                  ]
                }
              ]
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "Autoreload and Embedded Shells"
        }
      ],
      "level": 2,
      "target": null
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "A regression introduced in IPython 9.10 caused doctest prompts ("
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": ">>>"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " and "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "..."
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ") to stop being stripped inside multiline strings, after the input transformer's regex was tightened from "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "\\s"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " to "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "[ \\t]"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " to avoid eating newlines on bare continuation lines. The prompt stripper now strips leading PS1/PS2 prompts inside multiline strings only when they agree with the indentation of the outer stripped prompts, so genuine "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": ">>>"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "/"
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "..."
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " text inside a multiline string is preserved ("
            },
            {
              "__type": "Link",
              "__tag": 4049,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "#15260"
                }
              ],
              "url": "https://github.com/IPython/IPython/pull/15260",
              "title": ""
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ", fixes "
            },
            {
              "__type": "Link",
              "__tag": 4049,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "#15259"
                }
              ],
              "url": "https://github.com/IPython/IPython/issues/15259",
              "title": ""
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ")."
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "Doctest Prompt Stripping Regression"
        }
      ],
      "level": 2,
      "target": null
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "BulletList",
          "__tag": 4053,
          "ordered": false,
          "start": 1,
          "children": [
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "CrossRef",
                      "__tag": 4002,
                      "value": "compress_user",
                      "reference": {
                        "__type": "LocalRef",
                        "__tag": 4022,
                        "kind": "module",
                        "path": "IPython.utils.path:compress_user"
                      },
                      "kind": "module"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " — the reverse of   "
                    },
                    {
                      "__type": "CrossRef",
                      "__tag": 4002,
                      "value": "os.path.expanduser",
                      "reference": {
                        "__type": "RefInfo",
                        "__tag": 4000,
                        "module": "posixpath",
                        "version": "?",
                        "kind": "module",
                        "path": "posixpath:expanduser"
                      },
                      "kind": "module"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " used when   displaying paths — tested "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "path.startswith(home)"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " with no path-component   boundary, so a path merely sharing a string prefix with "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "$HOME"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " (for example   "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "/home/alice-backup/..."
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " when "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "$HOME"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " is "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "/home/alice"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": ") was rewritten   into a different, nonexistent "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "~"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": "-path. The substitution now only happens on   a path separator boundary ("
                    },
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15317"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15317",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": ")."
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "CrossRef",
                      "__tag": 4002,
                      "value": "Image",
                      "reference": {
                        "__type": "LocalRef",
                        "__tag": 4022,
                        "kind": "module",
                        "path": "IPython.core.display:Image"
                      },
                      "kind": "module"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " with "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "retina=True"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " now works with WebP   images ("
                    },
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15276"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15276",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": ")."
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": "A memory leak in the LLM autosuggester was fixed and its errors are now   handled gracefully ("
                    },
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15275"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15275",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": ")."
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": "The history database is now closed during shell shutdown, avoiding a leaked   connection ("
                    },
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15273"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15273",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": ")."
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "yakuake"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " is now recognized as a Kitty-graphics-compatible terminal   ("
                    },
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15332"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15332",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": ")."
                    }
                  ]
                }
              ]
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "Other Fixes"
        }
      ],
      "level": 2,
      "target": null
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "lsmagic"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " now returns plain text by default so that frontends render its human-readable output consistently. Use "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "%lsmagic --json"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " to retrieve the machine-readable mapping of registered magics ("
            },
            {
              "__type": "Link",
              "__tag": 4049,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "#15335"
                }
              ],
              "url": "https://github.com/IPython/IPython/pull/15335",
              "title": ""
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ")."
            }
          ]
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "A number of APIs that had been emitting deprecation warnings for several years have been removed ("
            },
            {
              "__type": "Link",
              "__tag": 4049,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "#15310"
                }
              ],
              "url": "https://github.com/IPython/IPython/pull/15310",
              "title": ""
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "):"
            }
          ]
        },
        {
          "__type": "BulletList",
          "__tag": 4053,
          "ordered": false,
          "start": 1,
          "children": [
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "IPCompleter.limit_to__all__"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " configuration option (deprecated since   IPython 5.0). Completion on "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "object.<tab>"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " now always uses "
                    },
                    {
                      "__type": "CrossRef",
                      "__tag": 4002,
                      "value": "dir",
                      "reference": {
                        "__type": "RefInfo",
                        "__tag": 4000,
                        "module": "builtins",
                        "version": "?",
                        "kind": "module",
                        "path": "builtins:dir"
                      },
                      "kind": "module"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": "-based   discovery, regardless of "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "__all__"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": "."
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "IPCompleter.python_matches"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " method (deprecated since IPython 8.27). Use   "
                    },
                    {
                      "__type": "CrossRef",
                      "__tag": 4002,
                      "value": "python_matcher",
                      "reference": {
                        "__type": "LocalRef",
                        "__tag": 4022,
                        "kind": "module",
                        "path": "IPython.core.completer:IPCompleter.python_matcher"
                      },
                      "kind": "module"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " instead."
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "OInfo.get()"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " (deprecated since IPython 8.13). Access the dataclass fields   directly, e.g. "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "oinfo.found"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " instead of "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "oinfo.get('found')"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": "."
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": "The module-level "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "backends"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " and "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "backend2gui"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " attributes of   "
                    },
                    {
                      "__type": "CrossRef",
                      "__tag": 4002,
                      "value": "IPython.core.pylabtools",
                      "reference": {
                        "__type": "LocalRef",
                        "__tag": 4022,
                        "kind": "module",
                        "path": "IPython.core.pylabtools"
                      },
                      "kind": "module"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " (deprecated since IPython 8.24). Matplotlib   backends are resolved by Matplotlib itself since 3.9."
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "CrossRef",
                      "__tag": 4002,
                      "value": "run_cell_async",
                      "reference": {
                        "__type": "LocalRef",
                        "__tag": 4022,
                        "kind": "module",
                        "path": "IPython.core.interactiveshell:InteractiveShell.run_cell_async"
                      },
                      "kind": "module"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " and   "
                    },
                    {
                      "__type": "CrossRef",
                      "__tag": 4002,
                      "value": "should_run_async",
                      "reference": {
                        "__type": "LocalRef",
                        "__tag": 4022,
                        "kind": "module",
                        "path": "IPython.core.interactiveshell:InteractiveShell.should_run_async"
                      },
                      "kind": "module"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " no   longer call "
                    },
                    {
                      "__type": "CrossRef",
                      "__tag": 4002,
                      "value": "transform_cell",
                      "reference": {
                        "__type": "LocalRef",
                        "__tag": 4022,
                        "kind": "module",
                        "path": "IPython.core.interactiveshell:InteractiveShell.transform_cell"
                      },
                      "kind": "module"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": "   automatically when "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "transformed_cell"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " is not passed (this fallback had   emitted a "
                    },
                    {
                      "__type": "CrossRef",
                      "__tag": 4002,
                      "value": "DeprecationWarning",
                      "reference": {
                        "__type": "RefInfo",
                        "__tag": 4000,
                        "module": "builtins",
                        "version": "?",
                        "kind": "module",
                        "path": "builtins:DeprecationWarning"
                      },
                      "kind": "module"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " since IPython 7.17); they now raise a   "
                    },
                    {
                      "__type": "CrossRef",
                      "__tag": 4002,
                      "value": "TypeError",
                      "reference": {
                        "__type": "RefInfo",
                        "__tag": 4000,
                        "module": "builtins",
                        "version": "?",
                        "kind": "module",
                        "path": "builtins:TypeError"
                      },
                      "kind": "module"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": ". Run   "
                    },
                    {
                      "__type": "CrossRef",
                      "__tag": 4002,
                      "value": "transform_cell",
                      "reference": {
                        "__type": "LocalRef",
                        "__tag": 4022,
                        "kind": "module",
                        "path": "IPython.core.interactiveshell:InteractiveShell.transform_cell"
                      },
                      "kind": "module"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": "   yourself and pass the result via the "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "transformed_cell"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " keyword argument (as   ipykernel 6.0 and newer already do).   "
                    },
                    {
                      "__type": "CrossRef",
                      "__tag": 4002,
                      "value": "run_cell",
                      "reference": {
                        "__type": "LocalRef",
                        "__tag": 4022,
                        "kind": "module",
                        "path": "IPython.core.interactiveshell:InteractiveShell.run_cell"
                      },
                      "kind": "module"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " is unaffected."
                    }
                  ]
                }
              ]
            }
          ]
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "The deprecated "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "IPython.utils.py3compat"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " module has also been removed, and its utilities inlined at their call sites ("
            },
            {
              "__type": "Link",
              "__tag": 4049,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "#15292"
                }
              ],
              "url": "https://github.com/IPython/IPython/pull/15292",
              "title": ""
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ")."
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "Backwards incompatible changes"
        }
      ],
      "level": 2,
      "target": null
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "Deprecation warnings emitted by IPython now include the version in which the feature was deprecated, making it easier to tell how long a warning has been outstanding ("
            },
            {
              "__type": "Link",
              "__tag": 4049,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "#15330"
                }
              ],
              "url": "https://github.com/IPython/IPython/pull/15330",
              "title": ""
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ")."
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "Deprecations"
        }
      ],
      "level": 2,
      "target": null
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "Thanks as well to the "
            },
            {
              "__type": "Link",
              "__tag": 4049,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "D. E. Shaw group"
                }
              ],
              "url": "https://deshaw.com/",
              "title": ""
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " for sponsoring work on IPython."
            }
          ]
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "As usual, you can find the full list of PRs on GitHub under "
            },
            {
              "__type": "Link",
              "__tag": 4049,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "the 9.16"
                }
              ],
              "url": "https://github.com/ipython/ipython/milestone/168?closed=1",
              "title": ""
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " milestone."
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "Thanks"
        }
      ],
      "level": 2,
      "target": null
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "IPython 9.15"
        }
      ],
      "level": 1,
      "target": "version 9.15"
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "This release adds a new "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "%xmode Doctest"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " ("
            },
            {
              "__type": "Link",
              "__tag": 4049,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "#15185"
                }
              ],
              "url": "https://github.com/IPython/IPython/pull/15185",
              "title": ""
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ") traceback mode and a number of robustness fixes around startup, history storage, the debugger, and the Sphinx directive. It also contains one backwards-incompatible change to "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "run"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " glob expansion and one deprecation."
            }
          ]
        },
        {
          "__type": "BulletList",
          "__tag": 4053,
          "ordered": false,
          "start": 1,
          "children": [
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15220"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15220",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Fix "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "debug"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " and ipdb with Python 3.15"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15219"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15219",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Add "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "exception"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " as an alias for the "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "exceptions"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " pdb command"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15236"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15236",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Hide "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "execfile"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " internals in debugger backtraces"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15072"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/issues/15072",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": "/"
                    },
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15246"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15246",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Fix oinspect "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "TypeError"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " with objects using a generic "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "__getattr__"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15249"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15249",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Skip ipython directive execution inside excluded "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "only"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " blocks"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15241"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/issues/15241",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": "/"
                    },
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15255"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15255",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Close SQLite connections before replacing the history database"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15068"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/issues/15068",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": "/"
                    },
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15255"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15255",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Deprecate "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "IPython.utils.generics.inspect_object"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15242"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15242",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Use "
                    },
                    {
                      "__type": "CrossRef",
                      "__tag": 4002,
                      "value": "print_stack_entry",
                      "reference": {
                        "__type": "LocalRef",
                        "__tag": 4022,
                        "kind": "module",
                        "path": "IPython.core.debugger:Pdb.print_stack_entry"
                      },
                      "kind": "module"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " to print frames on Python 3.14"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15247"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15247",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Avoid "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "psutil"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " requirement on Cygwin"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15252"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15252",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Narrow bare "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "except:"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " clauses in oinspect and interactiveshell"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15253"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15253",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Remove Python 2 references and fix links in the documentation"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15254"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15254",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Remove stale TODO comment in "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "DisplayObject.reload"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15100"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/issues/15100",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Fix test failures when the IPython source path contains spaces"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15193"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/issues/15193",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Honor PEP 263 coding cookies when reading sources in autoreload"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#12726"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/issues/12726",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Quoted arguments to "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "run"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " no longer undergo glob expansion"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#11424"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/issues/11424",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Strip ANSI escape sequences from Sphinx directive output"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#14538"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/issues/14538",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Hide "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "execfile"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " frames in debugger backtraces"
                    }
                  ]
                }
              ]
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "Summary"
        }
      ],
      "level": 2,
      "target": null
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "A new "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "%xmode Doctest"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " mode formats tracebacks for easy copy-paste into Python doctests. The output shows only the traceback header, a literal ellipsis, and the exception line      "
            }
          ]
        },
        {
          "__type": "Code",
          "__tag": 4050,
          "value": "Traceback (most recent call last):\n    ...\nZeroDivisionError: division by zero",
          "execution_status": null,
          "out": ""
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "Doctest Traceback Mode"
        }
      ],
      "level": 2,
      "target": null
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "The Kitty graphics protocol detection walks the process tree with "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "psutil"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " at import time. On shared multi-user systems where "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "/proc"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " is mounted with "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "hidepid"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " (common on HPC clusters), reaching an ancestor process owned by another user raised "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "psutil.AccessDenied"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ", which was unhandled and aborted the entire "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "import IPython"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ". Such errors are now caught and treated as \"graphics unsupported\"; detection capability for the user's own terminals is unchanged."
            }
          ]
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "psutil"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " is also no longer required on Cygwin, where it is not available ("
            },
            {
              "__type": "Link",
              "__tag": 4049,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "#15247"
                }
              ],
              "url": "https://github.com/IPython/IPython/pull/15247",
              "title": ""
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ")."
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "Robust Startup and Terminal Detection"
        }
      ],
      "level": 2,
      "target": null
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "sqlite3.Connection"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " used as a context manager only commits or rolls back; it does not close the connection. "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "ipython history trim"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " and "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "ipython history clear"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " therefore still held open handles on "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "history.sqlite"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " when unlinking and renaming it, which failed with "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "PermissionError"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " on Windows and left "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "history.sqlite.new*"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " files behind. The connections are now closed before any file shuffling ("
            },
            {
              "__type": "Link",
              "__tag": 4049,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "#15241"
                }
              ],
              "url": "https://github.com/IPython/IPython/issues/15241",
              "title": ""
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ")."
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "History Storage Robustness"
        }
      ],
      "level": 2,
      "target": null
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "BulletList",
          "__tag": 4053,
          "ordered": false,
          "start": 1,
          "children": [
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "debug"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " and ipdb work again under Python 3.15, and frames are printed with   "
                    },
                    {
                      "__type": "CrossRef",
                      "__tag": 4002,
                      "value": "print_stack_entry",
                      "reference": {
                        "__type": "LocalRef",
                        "__tag": 4022,
                        "kind": "module",
                        "path": "IPython.core.debugger:Pdb.print_stack_entry"
                      },
                      "kind": "module"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " on Python 3.14 ("
                    },
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15220"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15220",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": ", "
                    },
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15242"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15242",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": ")."
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "execfile"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " internals are now marked as the "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "__ipython_bottom__"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " traceback   boundary, so the file runner and the frames above it are hidden as IPython   internals while user script frames stay visible ("
                    },
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15236"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15236",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": ",   "
                    },
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#14538"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/issues/14538",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": ")."
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "exception"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " is now accepted as an alias for the "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "exceptions"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " pdb command   ("
                    },
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15219"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15219",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": ")."
                    }
                  ]
                }
              ]
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "Debugger Fixes"
        }
      ],
      "level": 2,
      "target": null
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "Objects whose "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "__getattr__"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " returns something other than a "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "dict"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " for "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "__custom_documentations__"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " (e.g. a polars "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "Expr"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ", which returns a new "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "Expr"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " for any attribute name) no longer raise a "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "TypeError"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " when inspected with "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "?"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " or "
            },
            {
              "__type": "InlineRole",
              "__tag": 4003,
              "value": "%pinfo",
              "domain": null,
              "role": "func",
              "inventory": null
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ". The lookup is now guarded with "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "isinstance(..., dict)"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " ("
            },
            {
              "__type": "Link",
              "__tag": 4049,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "#15072"
                }
              ],
              "url": "https://github.com/IPython/IPython/issues/15072",
              "title": ""
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ")."
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "Inspection ("
        },
        {
          "__type": "InlineCode",
          "__tag": 4051,
          "value": "?"
        },
        {
          "__type": "Text",
          "__tag": 4046,
          "value": ") Fix"
        }
      ],
      "level": 2,
      "target": null
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "The autoreload diffing logic now reads module sources with "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "tokenize.open"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ", honoring PEP 263 coding cookies the way the import system does, instead of assuming UTF-8. Sources declaring another encoding were previously read as empty, silently disabling hot-patching for those modules ("
            },
            {
              "__type": "Link",
              "__tag": 4049,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "#15193"
                }
              ],
              "url": "https://github.com/IPython/IPython/issues/15193",
              "title": ""
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ")."
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "Autoreload Encoding Fix"
        }
      ],
      "level": 2,
      "target": null
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "The IPython Sphinx directive now strips ANSI escape sequences from executed code-block output, so tracebacks and other colored output no longer appear as garbled text in rendered HTML/PDF documentation ("
            },
            {
              "__type": "Link",
              "__tag": 4049,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "#11424"
                }
              ],
              "url": "https://github.com/IPython/IPython/issues/11424",
              "title": ""
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "). Execution is also now skipped inside excluded "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "only"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " blocks ("
            },
            {
              "__type": "Link",
              "__tag": 4049,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "#15249"
                }
              ],
              "url": "https://github.com/IPython/IPython/pull/15249",
              "title": ""
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ")."
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "Sphinx Directive Fixes"
        }
      ],
      "level": 2,
      "target": null
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "Wrapping a "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "run"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " argument in single or double quotes now suppresses glob expansion of that argument, matching real shells. Previously quoting was documented as "
            },
            {
              "__type": "Emphasis",
              "__tag": 4047,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "not"
                }
              ]
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " suppressing expansion, which was surprising. For example with "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "foo.txt"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " and "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "bar.txt"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " in the working directory      "
            }
          ]
        },
        {
          "__type": "Code",
          "__tag": 4050,
          "value": "%run script.py \"*.txt\"    # before: ['foo.txt', 'bar.txt']\n                          # after:  ['*.txt']",
          "execution_status": null,
          "out": ""
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "The unquoted form ("
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "%run script.py *.txt"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ") and the backslash-escape form ("
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "%run script.py \\*.txt"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ") are unchanged. Pass "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "-G"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " to disable expansion entirely ("
            },
            {
              "__type": "Link",
              "__tag": 4049,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "#12726"
                }
              ],
              "url": "https://github.com/IPython/IPython/issues/12726",
              "title": ""
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ")."
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "Backwards incompatible changes"
        }
      ],
      "level": 2,
      "target": null
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "IPython.utils.generics.inspect_object"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " is deprecated since IPython 9.15 and will be removed in a future version. It is no longer used within IPython, so registering handlers on it has no effect. "
            },
            {
              "__type": "CrossRef",
              "__tag": 4002,
              "value": "complete_object",
              "reference": {
                "__type": "LocalRef",
                "__tag": 4022,
                "kind": "module",
                "path": "IPython.utils.generics:complete_object"
              },
              "kind": "module"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " is unaffected ("
            },
            {
              "__type": "Link",
              "__tag": 4049,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "#15068"
                }
              ],
              "url": "https://github.com/IPython/IPython/issues/15068",
              "title": ""
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ")."
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "Deprecations"
        }
      ],
      "level": 2,
      "target": null
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "Thanks as well to the "
            },
            {
              "__type": "Link",
              "__tag": 4049,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "D. E. Shaw group"
                }
              ],
              "url": "https://deshaw.com/",
              "title": ""
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " for sponsoring work on IPython."
            }
          ]
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "As usual, you can find the full list of PRs on GitHub under "
            },
            {
              "__type": "Link",
              "__tag": 4049,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "the 9.15"
                }
              ],
              "url": "https://github.com/ipython/ipython/milestone/165?closed=1",
              "title": ""
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " milestone."
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "Thanks"
        }
      ],
      "level": 2,
      "target": null
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "IPython 9.14"
        }
      ],
      "level": 1,
      "target": "version 9.14"
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "This release is mostly a maintenance release, with fixes for SQLite history handling, terminal image rendering, reproducible banner output, Pyodide support, and a number of documentation improvements."
            }
          ]
        },
        {
          "__type": "BulletList",
          "__tag": 4053,
          "ordered": false,
          "start": 1,
          "children": [
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15204"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15204",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Fix history memory fallback after SQLite lock"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15208"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15208",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Fix banner customization when "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "SOURCE_DATE_EPOCH"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " is set"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15196"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15196",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Handle stdout without "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "isatty"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " in kitty support check"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15190"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15190",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Avoid "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "psutil"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " requirement on emscripten"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15206"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15206",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Accept singular pdb exception command"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15203"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15203",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Fix incorrect "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "Configuration"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " type import"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15179"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15179",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Copyedit "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "prompt_line_number_format <TerminalInteractiveShell.prompt_line_number_format>"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " description"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15209"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15209",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Fix typos in user-facing documentation"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15211"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15211",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Fix duplicated words in "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "usage.py"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " and "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "oinspect.py"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " docstrings"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15215"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15215",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Fix terminal title config description"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15218"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15218",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Fix broken 'Edit on GitHub' link for auto-generated API docs"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15224"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15224",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Fix docstring formatting for "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "prompt_line_number_format <TerminalInteractiveShell.prompt_line_number_format>"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " help text"
                    }
                  ]
                }
              ]
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "Summary"
        }
      ],
      "level": 2,
      "target": null
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "When file-backed SQLite history could not create a new session (for example because the "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "history.sqlite"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " file was locked by another running session), the fallback only changed "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "hist_file"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " to "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": ":memory:"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " while the existing connection still pointed at the locked on-disk database. Later history writes could therefore keep raising "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "sqlite3.OperationalError: database is locked"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ". The fallback now closes the current connection, switches to an in-memory database, and creates a fresh history session there ("
            },
            {
              "__type": "Link",
              "__tag": 4049,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "#15204"
                }
              ],
              "url": "https://github.com/IPython/IPython/pull/15204",
              "title": ""
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ")."
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "SQLite History Fallback Fix"
        }
      ],
      "level": 2,
      "target": null
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "Banner customization now honors the "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "SOURCE_DATE_EPOCH"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " environment variable, fixing reproducible-build setups that pin the date ("
            },
            {
              "__type": "Link",
              "__tag": 4049,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "#15208"
                }
              ],
              "url": "https://github.com/IPython/IPython/pull/15208",
              "title": ""
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ")."
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "Reproducible Banner Output"
        }
      ],
      "level": 2,
      "target": null
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "The Kitty graphics protocol support check now handles the case where "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "stdout"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " has no "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "isatty"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " method, avoiding an "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "AttributeError"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " in some embedded or redirected-output environments ("
            },
            {
              "__type": "Link",
              "__tag": 4049,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "#15196"
                }
              ],
              "url": "https://github.com/IPython/IPython/pull/15196",
              "title": ""
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ")."
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "Terminal Image Rendering Robustness"
        }
      ],
      "level": 2,
      "target": null
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "IPython no longer requires "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "psutil"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " on the emscripten platform, where it is not available ("
            },
            {
              "__type": "Link",
              "__tag": 4049,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "#15190"
                }
              ],
              "url": "https://github.com/IPython/IPython/pull/15190",
              "title": ""
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ")."
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "Pyodide / Emscripten Support"
        }
      ],
      "level": 2,
      "target": null
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "Thanks as well to the "
            },
            {
              "__type": "Link",
              "__tag": 4049,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "D. E. Shaw group"
                }
              ],
              "url": "https://deshaw.com/",
              "title": ""
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " for sponsoring work on IPython."
            }
          ]
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "As usual, you can find the full list of PRs on GitHub under "
            },
            {
              "__type": "Link",
              "__tag": 4049,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "the 9.14"
                }
              ],
              "url": "https://github.com/ipython/ipython/milestone/164?closed=1",
              "title": ""
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " milestone."
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "Thanks"
        }
      ],
      "level": 2,
      "target": null
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "IPython 9.13"
        }
      ],
      "level": 1,
      "target": "version 9.13"
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "This release includes native terminal image rendering via the Kitty graphics protocol, a fix for illegible text in light-background themes, Python 3.11 support restoration, and type annotation corrections."
            }
          ]
        },
        {
          "__type": "BulletList",
          "__tag": 4053,
          "ordered": false,
          "start": 1,
          "children": [
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15184"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15184",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Implement support for "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "image/png"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " format in terminal"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15175"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15175",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Restore Python 3.11 support with conditional imports"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15156"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15156",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Fix illegible yellow text on yellow background in light themes"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15172"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15172",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Fix "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "CapturedIO.__init__"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " type annotations to accept "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "Optional[StringIO]"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15180"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15180",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Clarify custom prompts example in documentation"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15182"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15182",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Update Contributing.md"
                    }
                  ]
                }
              ]
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "Summary"
        }
      ],
      "level": 2,
      "target": null
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "IPython now renders "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "image/png"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " MIME output natively in supported terminals using the "
            },
            {
              "__type": "Link",
              "__tag": 4049,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "Kitty graphics protocol"
                }
              ],
              "url": "https://sw.kovidgoyal.net/kitty/graphics-protocol/",
              "title": ""
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ". Objects such as "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "PIL.Image"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " instances and SymPy expressions rendered with "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "sympy.init_printing(use_latex=\"png\")"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " will display as actual inline images in Kitty, Ghostty, and other compatible terminals. No configuration is required ("
            },
            {
              "__type": "Link",
              "__tag": 4049,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "#15184"
                }
              ],
              "url": "https://github.com/IPython/IPython/pull/15184",
              "title": ""
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ", closes "
            },
            {
              "__type": "Link",
              "__tag": 4049,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "#13287"
                }
              ],
              "url": "https://github.com/IPython/IPython/issues/13287",
              "title": ""
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ")."
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "Terminal Image Rendering via Kitty Protocol"
        }
      ],
      "level": 2,
      "target": null
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "Python 3.11 support has been restored. While IPython follows "
            },
            {
              "__type": "Link",
              "__tag": 4049,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "SPEC-0"
                }
              ],
              "url": "https://scientific-python.org/specs/spec-0000/",
              "title": ""
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " for determining the minimum supported Python version, continued Python 3.11 support is funded by the "
            },
            {
              "__type": "Link",
              "__tag": 4049,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "D. E. Shaw group"
                }
              ],
              "url": "https://deshaw.com/",
              "title": ""
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " ("
            },
            {
              "__type": "Link",
              "__tag": 4049,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "#15175"
                }
              ],
              "url": "https://github.com/IPython/IPython/pull/15175",
              "title": ""
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ")."
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "Python 3.11 Support Restored"
        }
      ],
      "level": 2,
      "target": null
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "Text that was previously rendered in a fixed yellow color—causing it to be illegible on terminals with a light or yellow background—is now rendered using a theme-aware color ("
            },
            {
              "__type": "Link",
              "__tag": 4049,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "#15156"
                }
              ],
              "url": "https://github.com/IPython/IPython/pull/15156",
              "title": ""
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ", fixes "
            },
            {
              "__type": "Link",
              "__tag": 4049,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "#14901"
                }
              ],
              "url": "https://github.com/IPython/IPython/issues/14901",
              "title": ""
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ")."
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "Theme-Aware Output Color Fix"
        }
      ],
      "level": 2,
      "target": null
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "Thanks as well to the "
            },
            {
              "__type": "Link",
              "__tag": 4049,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "D. E. Shaw group"
                }
              ],
              "url": "https://deshaw.com/",
              "title": ""
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " for sponsoring work on IPython including extended Python 3.11 support."
            }
          ]
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "As usual, you can find the full list of PRs on GitHub under "
            },
            {
              "__type": "Link",
              "__tag": 4049,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "the 9.13"
                }
              ],
              "url": "https://github.com/ipython/ipython/milestone/162?closed=1",
              "title": ""
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " milestone."
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "Thanks"
        }
      ],
      "level": 2,
      "target": null
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "IPython 9.12"
        }
      ],
      "level": 1,
      "target": "version 9.12"
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "This include a fix for "
            },
            {
              "__type": "Link",
              "__tag": 4049,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "CVE-2025-30167"
                }
              ],
              "url": "https://github.com/jupyter/jupyter_core/security/advisories/GHSA-33p9-3p43-82vq",
              "title": ""
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " that also affects IPython and should have been fixed as the same time than Jupyter-Core. This will be backported to 9.10.1 and 8.39"
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "Security Update"
        }
      ],
      "level": 2,
      "target": null
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "This release includes traceback rendering improvements, a SQLite resource leak fix, Python 3.15 compatibility, and type annotation additions."
            }
          ]
        },
        {
          "__type": "BulletList",
          "__tag": 4053,
          "ordered": false,
          "start": 1,
          "children": [
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15167"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15167",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Fix missing space in pdb chained exceptions warning message"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15166"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15166",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Interleave fast path when rendering large tracebacks"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15165"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15165",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Include function names when using the fast-traceback path"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15163"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15163",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Fix expected length in "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "test_unicode_range"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " for Python 3.15 alpha 7"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15157"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15157",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Clarify "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "xmode"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " docstring with mode descriptions"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15152"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15152",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Use "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "weakref.finalize"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " to close SQLite connections"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15146"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15146",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Add runtime type annotations to "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "IPython.utils"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " via MonkeyType"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15164"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15164",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Add return type hint in "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "alias.py"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15160"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15160",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Add return type hints in "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "compilerop.py"
                    }
                  ]
                }
              ]
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "Summary"
        }
      ],
      "level": 2,
      "target": null
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "The fast traceback path (used when "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "stack_data"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " is unavailable or too slow) now includes function names in all frames ("
            },
            {
              "__type": "Link",
              "__tag": 4049,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "#15165"
                }
              ],
              "url": "https://github.com/IPython/IPython/pull/15165",
              "title": ""
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "), and large tracebacks now interleave the fast and slow rendering paths ("
            },
            {
              "__type": "Link",
              "__tag": 4049,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "#15166"
                }
              ],
              "url": "https://github.com/IPython/IPython/pull/15166",
              "title": ""
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ") to preserve syntax highlighting on functions that live in small modules."
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "Traceback Rendering Improvements"
        }
      ],
      "level": 2,
      "target": null
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "SQLite connections are now closed via "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "weakref.finalize"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " instead of "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "__del__"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ". This eliminates "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "ResourceWarning"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " leaks that could surface when running tests with "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "-W error"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "."
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "SQLite Resource Leak Fix"
        }
      ],
      "level": 2,
      "target": null
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "Thanks as well to the "
            },
            {
              "__type": "Link",
              "__tag": 4049,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "D. E. Shaw group"
                }
              ],
              "url": "https://deshaw.com/",
              "title": ""
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " for sponsoring work on IPython."
            }
          ]
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "As usual, you can find the full list of PRs on GitHub under "
            },
            {
              "__type": "Link",
              "__tag": 4049,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "the 9.12"
                }
              ],
              "url": "https://github.com/ipython/ipython/milestone/161?closed=1",
              "title": ""
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " milestone."
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "Thanks"
        }
      ],
      "level": 2,
      "target": null
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "This release includes a new shell error-handling config option, a reproducible banner for builds, history thread management improvements, autoreload encoding fixes, Python 3.11 deprecation notices, and various type annotation improvements."
            }
          ]
        },
        {
          "__type": "BulletList",
          "__tag": 4053,
          "ordered": false,
          "start": 1,
          "children": [
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15073"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15073",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Add "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "system_raise_on_error <InteractiveShell.system_raise_on_error>"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " config option for "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "!"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " shell operator"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15121"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15121",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Start dropping Python 3.11"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15122"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15122",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Fix encoding to utf8 for autoreload"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15130"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15130",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Stricter config + add typing to "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "IPython/core/magic.py"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15133"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15133",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Inline and remove only usage of "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "on_off"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15144"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15144",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Have a static banner when setting "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "SOURCE_DATE_EPOCH"
                    }
                  ]
                }
              ]
            }
          ]
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "In addition there are many type annotations that have been added by using Generative AI (Clause Sonnet and Opus from Anthropicl; GitHub Copilot)"
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "IPython 9.11"
        }
      ],
      "level": 1,
      "target": "version 9.11"
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "A new "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "system_raise_on_error <InteractiveShell.system_raise_on_error>"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " Bool traitlet configuration option (default: "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "False"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ") has been added. When set to "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "True"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ", shell commands executed via the "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "!"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " operator will raise "
            },
            {
              "__type": "CrossRef",
              "__tag": 4002,
              "value": "subprocess.CalledProcessError",
              "reference": {
                "__type": "RefInfo",
                "__tag": 4000,
                "module": "subprocess",
                "version": "?",
                "kind": "module",
                "path": "subprocess:CalledProcessError"
              },
              "kind": "module"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " if they return a non-zero exit status. This makes it easier to write robust IPython scripts that need to detect shell command failures      "
            }
          ]
        },
        {
          "__type": "Code",
          "__tag": 4050,
          "value": "%config InteractiveShell.system_raise_on_error = True\n! false  # will now raise CalledProcessError",
          "execution_status": null,
          "out": ""
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "New "
        },
        {
          "__type": "InlineCode",
          "__tag": 4051,
          "value": "system_raise_on_error"
        },
        {
          "__type": "Text",
          "__tag": 4046,
          "value": " Config Option"
        }
      ],
      "level": 2,
      "target": null
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "When the "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "SOURCE_DATE_EPOCH"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " environment variable is set, IPython now produces a static, reproducible banner. This helps with reproducible builds and packaging workflows that may capture this state (related to "
            },
            {
              "__type": "Link",
              "__tag": 4049,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "jupyterlab/jupyterlab#18552"
                }
              ],
              "url": "https://github.com/jupyterlab/jupyterlab/issues/18552",
              "title": ""
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ")."
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "Reproducible Banner"
        }
      ],
      "level": 2,
      "target": null
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "The deprecation of Python 3.11 announced in 9.11 has been reverted in 9.13. Python 3.11 support is maintained thanks to funding from the "
            },
            {
              "__type": "Link",
              "__tag": 4049,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "D. E. Shaw group"
                }
              ],
              "url": "https://deshaw.com/",
              "title": ""
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "."
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "Python 3.11 Deprecation (Reverted in 9.13)"
        }
      ],
      "level": 2,
      "target": null
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "The autoreload extension now explicitly sets UTF-8 as the default encoding when reading source files. Previously, the platform default encoding was used, which could cause failures on systems where the default encoding is not UTF-8."
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "Autoreload Encoding Fix"
        }
      ],
      "level": 2,
      "target": null
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "Thanks as well to the "
            },
            {
              "__type": "Link",
              "__tag": 4049,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "D. E. Shaw group"
                }
              ],
              "url": "https://deshaw.com/",
              "title": ""
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " for sponsoring work on IPython."
            }
          ]
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "As usual, you can find the full list of PRs on GitHub under "
            },
            {
              "__type": "Link",
              "__tag": 4049,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "the 9.11"
                }
              ],
              "url": "https://github.com/ipython/ipython/milestone/160?closed=1",
              "title": ""
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " milestone."
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "Thanks"
        }
      ],
      "level": 2,
      "target": null
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "This release includes improvements to history management during forking and formatting fixes."
            }
          ]
        },
        {
          "__type": "BulletList",
          "__tag": 4053,
          "ordered": false,
          "start": 1,
          "children": [
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15110"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15110",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Fix Removing leading indentation when stripping prompt"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15115"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15115",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Stop HistorySavingThread before fork"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15118"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15118",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Add debug info for autoreload"
                    }
                  ]
                }
              ]
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "IPython 9.10"
        }
      ],
      "level": 1,
      "target": "version 9.10"
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "The "
            },
            {
              "__type": "CrossRef",
              "__tag": 4002,
              "value": "HistorySavingThread",
              "reference": {
                "__type": "LocalRef",
                "__tag": 4022,
                "kind": "module",
                "path": "IPython.core.history:HistorySavingThread"
              },
              "kind": "module"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " is now properly stopped before process forking, preventing threading issues in child processes. This ensures that history operations work correctly when IPython is used in applications that perform process forking."
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "History Thread Management Improvements"
        }
      ],
      "level": 2,
      "target": null
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "Thanks as well to the "
            },
            {
              "__type": "Link",
              "__tag": 4049,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "D. E. Shaw group"
                }
              ],
              "url": "https://deshaw.com/",
              "title": ""
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " for sponsoring work on IPython."
            }
          ]
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "As usual, you can find the full list of PRs on GitHub under "
            },
            {
              "__type": "Link",
              "__tag": 4049,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "the 9.10"
                }
              ],
              "url": "https://github.com/ipython/ipython/milestone/159?closed=1",
              "title": ""
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " milestone."
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "Thanks"
        }
      ],
      "level": 2,
      "target": null
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "This release includes several bug fixes and improvements across completions, type annotations, and developer experience."
            }
          ]
        },
        {
          "__type": "BulletList",
          "__tag": 4053,
          "ordered": false,
          "start": 1,
          "children": [
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15092"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15092",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Fix formatting for completion suggestions section"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15057"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15057",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Reduce types in splitinput.py"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15096"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15096",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Use Any type in traceback tuple"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15099"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15099",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Fix filename of CVE test"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15091"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15091",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Skip downstream CI if only docs changes"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15093"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15093",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Replace sphinxext/github with extlink configuration"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15103"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15103",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Tips and docs about argcomplete"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15105"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15105",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Add prompt_toolkit's unix_word_rubout to assignable commands for shortcuts"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15095"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15095",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Enable pretty-printing for PEP-649 annotated functions"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15106"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15106",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Fix completions for methods starting with "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "_"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15111"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15111",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Stop assuming that memory addresses are signed"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15102"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15102",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Bump macOS runner version in GitHub Actions"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15101"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15101",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Fix crash on literal with surrogate"
                    }
                  ]
                }
              ]
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "IPython 9.9"
        }
      ],
      "level": 1,
      "target": "version 9.9"
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "IPython now properly pretty-prints functions with PEP-649 style annotations. This improves the display of functions in interactive sessions when using Python 3.14+ annotation semantics."
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "Improvements to PEP-649 Support"
        }
      ],
      "level": 2,
      "target": null
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "The "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "unix_word_rubout"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " command from prompt_toolkit is now available as an assignable command for terminal shortcuts, giving users more flexibility in customizing their keybindings."
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "Shell Shortcuts Enhancement"
        }
      ],
      "level": 2,
      "target": null
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "Various type annotation improvements have been made throughout the codebase for better static analysis support, including fixes for tracebacks and improved type inference in the completion engine."
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "Type Annotation Improvements"
        }
      ],
      "level": 2,
      "target": null
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "Thanks as well to the "
            },
            {
              "__type": "Link",
              "__tag": 4049,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "D. E. Shaw group"
                }
              ],
              "url": "https://deshaw.com/",
              "title": ""
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " for sponsoring work on IPython."
            }
          ]
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "As usual, you can find the full list of PRs on GitHub under "
            },
            {
              "__type": "Link",
              "__tag": 4049,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "the 9.9"
                }
              ],
              "url": "https://github.com/ipython/ipython/milestone/157?closed=1",
              "title": ""
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " milestone."
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "Thanks"
        }
      ],
      "level": 2,
      "target": null
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "This release brings improvements to concurrent execution, history commands, tab completion, and debugger performance."
            }
          ]
        },
        {
          "__type": "BulletList",
          "__tag": 4053,
          "ordered": false,
          "start": 1,
          "children": [
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15037"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15037",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Fix some ruff issues with import"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15060"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15060",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Stricter typing for many utils files"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15066"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15066",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Strict typing of a few more files"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15067"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15067",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Fix self import of deprecated items"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15069"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15069",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Document "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "history"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " usage with all lines of a session"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15070"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15070",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Allow session number without trailing slash in "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "history"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " magic"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15074"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15074",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Use values for tab completion of variables created using annotated assignment"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15076"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15076",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Fix error on tab completions"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15078"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15078",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Show completions for annotated union types"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15079"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15079",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Fallback to type annotations for attribute completions"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15081"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15081",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Strictly suppress file completions in attribute completion context"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15083"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15083",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Minor performance improvements in debugger"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15084"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15084",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Documentation updates"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15088"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15088",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Make "
                    },
                    {
                      "__type": "CrossRef",
                      "__tag": 4002,
                      "value": "run_cell_async",
                      "reference": {
                        "__type": "LocalRef",
                        "__tag": 4022,
                        "kind": "module",
                        "path": "IPython.core.interactiveshell:InteractiveShell.run_cell_async"
                      },
                      "kind": "module"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " reenterable for concurrent cell execution"
                    }
                  ]
                }
              ]
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "IPython 9.8"
        }
      ],
      "level": 1,
      "target": "version 9.8"
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "The "
            },
            {
              "__type": "CrossRef",
              "__tag": 4002,
              "value": "run_cell_async",
              "reference": {
                "__type": "LocalRef",
                "__tag": 4022,
                "kind": "module",
                "path": "IPython.core.interactiveshell:InteractiveShell.run_cell_async"
              },
              "kind": "module"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " method is now reenterable, making the execution count more atomic and preventing session resets when cells are executed concurrently. This allows frontends to run multiple cells in parallel without interfering with each other's execution context or history tracking. The execution count is now incremented before running the user code, ensuring consistent behavior across concurrent executions."
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "Concurrent Cell Execution"
        }
      ],
      "level": 2,
      "target": null
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "The "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "history"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " magic now supports open-ended line ranges using "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "-"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " as the end marker. For example, you can use "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "%history 1/10-"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " to retrieve all commands from line 10 onwards in session 1, or "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "%history ~5-"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " to get the last 5 commands and onwards from the current session. This makes it easier to retrieve ranges of commands without needing to know the exact ending line number."
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "History Magic Improvements"
        }
      ],
      "level": 2,
      "target": null
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "Several improvements were made to the tab completer, particularly when jedi is disabled:"
            }
          ]
        },
        {
          "__type": "BulletList",
          "__tag": 4053,
          "ordered": false,
          "start": 1,
          "children": [
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": "Variables created with annotated assignment (e.g., "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "x: int = 5"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": ") now use   their runtime values for completion suggestions, providing more accurate   attribute completions."
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": "File path completions are now strictly suppressed when completing attributes,   preventing confusion when typing patterns like "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "obj.file"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": "."
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": "Union types in annotations (e.g., "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "x: int | str"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": ") are now properly handled   for completion suggestions."
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": "The completer now falls back to type annotations when runtime evaluation is   not available, improving completion accuracy for typed code."
                    }
                  ]
                }
              ]
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "Tab Completion Enhancements"
        }
      ],
      "level": 2,
      "target": null
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "Thanks as well to the "
            },
            {
              "__type": "Link",
              "__tag": 4049,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "D. E. Shaw group"
                }
              ],
              "url": "https://deshaw.com/",
              "title": ""
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " for sponsoring work on IPython."
            }
          ]
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "As usual, you can find the full list of PRs on GitHub under "
            },
            {
              "__type": "Link",
              "__tag": 4049,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "the 9.8"
                }
              ],
              "url": "https://github.com/ipython/ipython/milestone/156?closed=1",
              "title": ""
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " milestone."
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "Thanks"
        }
      ],
      "level": 2,
      "target": null
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "As ususal this new version of IPython brings a number of bugfixes:"
            }
          ]
        },
        {
          "__type": "BulletList",
          "__tag": 4053,
          "ordered": false,
          "start": 1,
          "children": [
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15012"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15012",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Fix "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "Exception.text"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " may be None"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15007"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15007",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Start Testign on free-threaded Python"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15036"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15036",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Suppress file completions in context of attributes/methods"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15056"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15056",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Completion in loops and conditionals"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15048"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15048",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Support completions for lambdas and "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "async"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " functions"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15042"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15042",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Support subscript assignment in completions"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15027"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15027",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Infer type from return value and improve attribute completions"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15020"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15020",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Fix tab completion for subclasses of trusted classes"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15022"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15022",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Prevent trusting modules with matching prefix"
                    }
                  ]
                }
              ]
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "IPython 9.7"
        }
      ],
      "level": 1,
      "target": "version 9.7"
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "Gruvbox Dark is now available as a terminal syntax theme for IPython."
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "Gruvbox Dark Theme"
        }
      ],
      "level": 2,
      "target": null
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "IPython now respects the value of Python's flag "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "sys.flags.safe_path"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ", a flag which is most often set by the "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "PYTHONSAFEPATH"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " environment variable. Setting this causes Python not to automatically include the current working directory in the sys.path."
            }
          ]
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "IPython can already be configured to do this via the "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "--ignore_cwd"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " command-line flag or by setting "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "c.InteractiveShellApp.ignore_cwd=True"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ". Now, IPython can also be configured by setting "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "PYTHONSAFEPATH=1"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " or by calling python with "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "-P"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "."
            }
          ]
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "The behavior of "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "safe_path"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " was described in "
            },
            {
              "__type": "CrossRef",
              "__tag": 4002,
              "value": "what's new in 3.11",
              "reference": {
                "__type": "LocalRef",
                "__tag": 4022,
                "kind": "docs",
                "path": "whatsnew:version9"
              },
              "kind": "exists"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " and in "
            },
            {
              "__type": "Link",
              "__tag": 4049,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "PyConfig.safe_path"
                }
              ],
              "url": "https://docs.python.org/3/c-api/init_config.html#c.PyConfig.safe_path",
              "title": ""
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "."
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "Respect PYTHONSAFEPATH"
        }
      ],
      "level": 2,
      "target": null
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "Multiple improvements were made to the tab completer. The tab completions now work for more complex code, even when jedi is disabled, using a hybrid evaluation procedure which infers available completions from both the typing information, runtime values, and static code analysis. The paths to hidden files are no longer suggested when attempting attribute completion."
            }
          ]
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "As usual, you can find the full list of PRs on GitHub under "
            },
            {
              "__type": "Link",
              "__tag": 4049,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "the 9.7"
                }
              ],
              "url": "https://github.com/ipython/ipython/milestone/155?closed=1",
              "title": ""
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " milestone."
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "Tab Completion"
        }
      ],
      "level": 2,
      "target": "what's new in 3.11"
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "This version brings improvements to tab completion, "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "notebook"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " magic, module ignoring functionality to debugger."
            }
          ]
        },
        {
          "__type": "BulletList",
          "__tag": 4053,
          "ordered": false,
          "start": 1,
          "children": [
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#14973"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/14973",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Add module ignoring functionality to debugger"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#14982"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/14982",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Extract code from line magics for attribute completion"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#14998"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/14998",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Fix matplotlib plots displaying in wrong cells during "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "notebook"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " export"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#14996"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/14996",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Respect "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "DisplayFormatter.active_types"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " trait configuration"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#15001"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/15001",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Fix "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "notebook"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " magic creating multiple display_data outputs for single widgets"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#14997"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/14997",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Make "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "notebook"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " magic notarise exported notebooks (mark as trusted)"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#14993"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/14993",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Type-guided partial evaluation for completion of uninitialized variables"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#14978"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/14978",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " deduperreload: patch NULL for empty closure rather than None"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#14994"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/14994",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Bump minimum version (spec-0) and whitespace update"
                    }
                  ]
                }
              ]
            }
          ]
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "The "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "notebook"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " magic can now reliably export plots generated by "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "matplotlib"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ", whether with the default "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "inline"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " or the interactive "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "ipympl"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " backend. For the plots to display when using the "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "inline"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " backend the "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "c.DisplayFormatter.active_types"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " needs to include "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "image/png"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " (or another image media type, depending on the backend configuration)."
            }
          ]
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "Tab completion now works on multi-line buffers with unevaluated code even when jedi is disabled. Additionally, completion works when writing code as an argument to "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "timeit"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " and "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "debug"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "."
            }
          ]
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "As usual, you can find the full list of PRs on GitHub under "
            },
            {
              "__type": "Link",
              "__tag": 4049,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "the 9.6"
                }
              ],
              "url": "https://github.com/ipython/ipython/milestone/154?closed=1",
              "title": ""
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " milestone."
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "IPython 9.6"
        }
      ],
      "level": 1,
      "target": "version 9.6"
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "Featuring improvements for numerous magics ("
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "autoreload"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ", "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "whos"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ", "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "script"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ", "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "%%notebook"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "), a streaming performance regression fix, completer policy overrides improvements, and initial support for Python 3.14."
            }
          ]
        },
        {
          "__type": "BulletList",
          "__tag": 4053,
          "ordered": false,
          "start": 1,
          "children": [
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#14938"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/14938",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Fix printing long strings in "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "whos"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " magic command"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#14941"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/14941",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Fix performance of streaming long text"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#14943"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/14943",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Simplify overriding selective evaluation policy settings for modules"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#14955"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/14955",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Populate notebook metadata when exporting with "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "notebook"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " magic"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#14960"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/14960",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Better handling in deduperreload for patching functions with freevars"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#14964"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/14964",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Fix traceback logic for non-SyntaxError exceptions in plain mode"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#14966"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/14966",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Do not warn repeatedly if policy overrides are not applicable"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#14967"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/14967",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Support Python 3.14.0rc2, test on CI"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#14969"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/14969",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Fix truncated output in "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "%script"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " magic"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#14970"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/14970",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Fix exceptions in "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "whos"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " magic command"
                    }
                  ]
                }
              ]
            }
          ]
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "The "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "notebook"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " magic now stores the language and kernel information in notebook metadata, allowing users to quickly open the exported notebook with syntax highlighting and an appropriate kernel."
            }
          ]
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "The completer "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "Completer.policy_overrides"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " traitlet handling was improved. It no longer repeatedly warns on each completion after switching away to a policy that does not support previously specified overrides. Allow-listing attribute access on all objects in a given library is now possible. The specification now also accepts dotted strings (rather than requiring tuples to specify the path) which should make configuration easier and less error-prone."
            }
          ]
        },
        {
          "__type": "Code",
          "__tag": 4050,
          "value": "c.Completer.policy_overrides = {\n    \"allowed_getattr_external\": {\n        \"my_trusted_library\"\n    }\n}",
          "execution_status": null,
          "out": ""
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "A number of recent regressions were fixed:"
            }
          ]
        },
        {
          "__type": "BulletList",
          "__tag": 4053,
          "ordered": false,
          "start": 1,
          "children": [
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "autoreload"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " now again shows the correct module name in traceback"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": "standard output/error streaming of long text/logs is now as fast as in IPython 9.0"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": "in the "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "whos"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " magic handling of long strings and class objects that implement "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "__len__"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " was fixed."
                    }
                  ]
                }
              ]
            }
          ]
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "As usual, you can find the full list of PRs on GitHub under "
            },
            {
              "__type": "Link",
              "__tag": 4049,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "the 9.5"
                }
              ],
              "url": "https://github.com/ipython/ipython/milestone/153?closed=1",
              "title": ""
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " milestone."
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "IPython 9.5"
        }
      ],
      "level": 1,
      "target": "version 9.5"
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "Featuring "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "autoreload"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ", "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "whos"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ", "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "script"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ", "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "%%time"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " magic improvements, along with a fix for use of list comprehensions and generators in the interactive debugger (and ipdb)."
            }
          ]
        },
        {
          "__type": "BulletList",
          "__tag": 4053,
          "ordered": false,
          "start": 1,
          "children": [
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#14922"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/14922",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Improved reloading of decorated functions when using "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "autoreload"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#14872"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/14872",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Do not always import all variables with "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "%autoreload 3"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#14906"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/14906",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Changed behaviour of "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "time"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " magic to always interrupt execution on exception and always show execution time"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#14926"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/14926",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Support data frames, series, and objects with "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "__len__"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " in the "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "whos"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " magic"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#14933"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/14933",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " List comprehensions and generators now work reliably in debugger on all supported Python versions"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#14931"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/14931",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Fix streaming multi-byte Unicode characters in the "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "%script"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " magic and its derivatives"
                    }
                  ]
                }
              ]
            }
          ]
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "The "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "time"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " magic no longer swallows exceptions raised by the measured code, and always prints the time of execution. If you wish the execution to continue after measuring time to execute code that is meant to raise an exception, pass the new "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "--no-raise-error"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " flag. The "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "--no-raise-error"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " flag does not affect "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "KeyboardInterrupt"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " as this exception is used to signal intended interruption of execution flow."
            }
          ]
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "Previously the debugger (ipdb) evaluation of list comprehensions and generators could fail with "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "NameError"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " due to generator implementation detail in CPython. This was recently fixed in Python 3.13. Because IPython is often used for interactive debugging, this release includes a backport of that fix, providing users who cannot yet update from Python 3.11 or 3.12 with a smoother debugging experience."
            }
          ]
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "The "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "autoreload"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " magic is now more reliable. The behaviour around decorators has been improved and "
            },
            {
              "__type": "InlineRole",
              "__tag": 4003,
              "value": "%autoreload 3",
              "domain": null,
              "role": null,
              "inventory": null
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " no longer imports all symbols when reloading the module, however, the heuristic used to determine which symbols to reload can sometimes lead to addition of imports from non-evaluated code branches, see "
            },
            {
              "__type": "Link",
              "__tag": 4049,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "issue #14934"
                }
              ],
              "url": "https://github.com/ipython/ipython/issues/14934",
              "title": ""
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "."
            }
          ]
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "As usual, you can find the full list of PRs on GitHub under "
            },
            {
              "__type": "Link",
              "__tag": 4049,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "the 9.4"
                }
              ],
              "url": "https://github.com/ipython/ipython/milestone/151?closed=1",
              "title": ""
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " milestone."
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "IPython 9.4"
        }
      ],
      "level": 1,
      "target": "version 9.4"
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "This release includes improvements to the tab and LLM completer, along with typing improvements:"
            }
          ]
        },
        {
          "__type": "BulletList",
          "__tag": 4053,
          "ordered": false,
          "start": 1,
          "children": [
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#14911"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/14911",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Implement auto-import and evaluation policy overrides"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#14910"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/14910",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Eliminate startup delay when LLM completion provider is configured"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#14898"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/14898",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Fix attribute completion for expressions with comparison operators"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#14908"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/14908",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Fix typing of "
                    },
                    {
                      "__type": "InlineRole",
                      "__tag": 4003,
                      "value": "error_before_exec",
                      "domain": null,
                      "role": null,
                      "inventory": null
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": ", enhance "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "mypy"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " coverage"
                    }
                  ]
                }
              ]
            }
          ]
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "Notably, the native completer can now suggest attribute completion on not-yet-imported modules. This is particularly useful when writing code which includes an import and the use of the imported module in the same line or in the same cell; the default implementation does not insert the imported module into the user namespace, for which an actual execution is required."
            }
          ]
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "The auto-import of modules by completer is turned off and requires opting-in using a new "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "Completer.policy_overrides"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " traitlet. To enable auto-import on completion specify:"
            }
          ]
        },
        {
          "__type": "Code",
          "__tag": 4050,
          "value": "ipython --Completer.policy_overrides='{\"allow_auto_import\": True}' --Completer.use_jedi=False",
          "execution_status": null,
          "out": ""
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "This change aligns the capability of both jedi-powered and the native completer. The function used for auto-import can be configured using "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "Completer.auto_import_method"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " traitlet."
            }
          ]
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "As usual, you can find the full list of PRs on GitHub under "
            },
            {
              "__type": "Link",
              "__tag": 4049,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "the 9.3"
                }
              ],
              "url": "https://github.com/ipython/ipython/milestone/149?closed=1",
              "title": ""
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " milestone."
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "IPython 9.3"
        }
      ],
      "level": 1,
      "target": "version 9.3"
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "This is a small release with minor changes in the context passed to the LLM completion provider along few other bug fixes and documentation improvements:"
            }
          ]
        },
        {
          "__type": "BulletList",
          "__tag": 4053,
          "ordered": false,
          "start": 1,
          "children": [
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#14890"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/14890",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Fixed interruption of "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "%%time"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " and "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "%%debug"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " magics"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#14877"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/14877",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Removed spurious empty lines from "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "prefix"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " passed to LLM, and separated part after cursor into the "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "suffix"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#14876"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/14876",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Fixed syntax warning in Python 3.14 (remove return from finally block)"
                    }
                  ]
                }
              ]
            },
            {
              "__type": "ListItem",
              "__tag": 4054,
              "children": [
                {
                  "__type": "Paragraph",
                  "__tag": 4045,
                  "children": [
                    {
                      "__type": "Link",
                      "__tag": 4049,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "#14887"
                        }
                      ],
                      "url": "https://github.com/IPython/IPython/pull/14887",
                      "title": ""
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " Documented the recommendation to use "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "ipykernel.embed.embed_kernel()"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": " over "
                    },
                    {
                      "__type": "InlineCode",
                      "__tag": 4051,
                      "value": "ipython.embed"
                    },
                    {
                      "__type": "Text",
                      "__tag": 4046,
                      "value": "."
                    }
                  ]
                }
              ]
            }
          ]
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "As usual, you can find the full list of PRs on GitHub under "
            },
            {
              "__type": "Link",
              "__tag": 4049,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "the 9.2"
                }
              ],
              "url": "https://github.com/ipython/ipython/milestone/146?closed=1",
              "title": ""
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " milestone."
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "IPython 9.2"
        }
      ],
      "level": 1,
      "target": "version 9.2"
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "This is a small release that introduces enhancements to "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "notebook"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " and "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "%%timeit"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " magics, and a number of bug fixes related to colors/formatting, performance, and completion."
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "IPython 9.1"
        }
      ],
      "level": 1,
      "target": "version 9.1"
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "The "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "notebook"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " magic can be used to create a Jupyter notebook from the commands executed in the current IPython session (since the interpreter startup)."
            }
          ]
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "Prior to IPython 9.1, the resulting notebook did not include the outputs, streams, or exceptions. IPython 9.1 completes the implementation of this magic allowing for an easier transition from an interactive IPython session to a Jupyter notebook."
            }
          ]
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "To capture streams (stdio/stderr), IPython temporarily swaps the "
            },
            {
              "__type": "CrossRef",
              "__tag": 4002,
              "value": "write",
              "reference": {
                "__type": "LocalRef",
                "__tag": 4022,
                "kind": "module",
                "path": "IPython.utils.io:Tee.write"
              },
              "kind": "module"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " method of the active stream class during code execution. This ensures compatibility with ipykernel which swaps the entire stream implementation and requires it to remain an instance of "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "IOStream"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " subclass. If this leads to undesired behaviour in any downstream applications, your feedback and suggestions would be greatly appreciated."
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "InlineCode",
          "__tag": 4051,
          "value": "%notebook"
        },
        {
          "__type": "Text",
          "__tag": 4046,
          "value": " saves outputs"
        }
      ],
      "level": 2,
      "target": null
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "New "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "-v"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " argument allows users to save the timing result directly to a specified variable, e.g."
            }
          ]
        },
        {
          "__type": "Code",
          "__tag": 4050,
          "value": "%%timeit -v timing_result\n2**32",
          "execution_status": null,
          "out": ""
        }
      ],
      "title": [
        {
          "__type": "InlineCode",
          "__tag": 4051,
          "value": "%%timeit -v"
        },
        {
          "__type": "Text",
          "__tag": 4046,
          "value": " argument"
        }
      ],
      "level": 2,
      "target": null
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "The LLM-based completer will now receive the request number for each subsequent execution."
            }
          ]
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "The tab completer used when jedi is turned off now correctly completes variables in lines where it previously was incorrectly attempting to complete attributes due to simplistic context detection based on the presence of a dot."
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "Completer improvements"
        }
      ],
      "level": 2,
      "target": null
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "A big thank you to everyone who contributed towards the 9.1 release, including new contributors: @Darshan808, @kwinkunks, @carschandler, returning contributors (shout out to @wjandrea!), and of course @Carreau whom I would like to thank for the guidance in the preparation of this release and stewardship of IPython over the years - Mike."
            }
          ]
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "As usual, you can find the full list of PRs on GitHub under "
            },
            {
              "__type": "Link",
              "__tag": 4049,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "the 9.1"
                }
              ],
              "url": "https://github.com/ipython/ipython/milestone/142?closed=1",
              "title": ""
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " milestone."
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "Thanks"
        }
      ],
      "level": 2,
      "target": null
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "Welcome to IPython 9.0. As with any version of IPython before this release, it should not be majorly different from the previous version, at least on the surface. We still hope you can upgrade as soon as possible and look forward to your feedback."
            }
          ]
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "I take the opportunity of this new release to remind you that IPython is governed by the "
            },
            {
              "__type": "Link",
              "__tag": 4049,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "Jupyter code of conduct"
                }
              ],
              "url": "https://jupyter.org/governance/conduct/code_of_conduct.html",
              "title": ""
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ". And that even beyond so we strive to be an inclusive, accepting and progressive community, Here is a relevant extract from the COC."
            }
          ]
        },
        {
          "__type": "Blockquote",
          "__tag": 4059,
          "children": [
            {
              "__type": "Paragraph",
              "__tag": 4045,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "We strive to be a community that welcomes and supports people of all backgrounds     and identities. This includes, but is not limited to, members of any race,     ethnicity, culture, national origin, color, immigration status, social and     economic class, educational level, sex, sexual orientation, gender identity and     expression, age, physical appearance, family status, technological or     professional choices, academic discipline, religion, mental ability, and     physical ability."
                }
              ]
            }
          ]
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "As a short overview of the changes in 9.0, we have over 100 PRs merged since 8.x, many of which are refactors, cleanups and simplifications."
            }
          ]
        },
        {
          "__type": "Blockquote",
          "__tag": 4059,
          "children": [
            {
              "__type": "BulletList",
              "__tag": 4053,
              "ordered": false,
              "start": 1,
              "children": [
                {
                  "__type": "ListItem",
                  "__tag": 4054,
                  "children": [
                    {
                      "__type": "Paragraph",
                      "__tag": 4045,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "(optional) LLM integration in the CLI."
                        }
                      ]
                    }
                  ]
                },
                {
                  "__type": "ListItem",
                  "__tag": 4054,
                  "children": [
                    {
                      "__type": "Paragraph",
                      "__tag": 4045,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "Complete rewrite of color and theme handling, which now supports more colors and symbols."
                        }
                      ]
                    }
                  ]
                },
                {
                  "__type": "ListItem",
                  "__tag": 4054,
                  "children": [
                    {
                      "__type": "Paragraph",
                      "__tag": 4045,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "Move tests out of tree in the wheel with a massive reduction in file size."
                        }
                      ]
                    }
                  ]
                },
                {
                  "__type": "ListItem",
                  "__tag": 4054,
                  "children": [
                    {
                      "__type": "Paragraph",
                      "__tag": 4045,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "Tips at startup"
                        }
                      ]
                    }
                  ]
                },
                {
                  "__type": "ListItem",
                  "__tag": 4054,
                  "children": [
                    {
                      "__type": "Paragraph",
                      "__tag": 4045,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "Removal of (almost) all deprecated functionalities and options."
                        }
                      ]
                    }
                  ]
                },
                {
                  "__type": "ListItem",
                  "__tag": 4054,
                  "children": [
                    {
                      "__type": "Paragraph",
                      "__tag": 4045,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "Stricter and more stable codebase."
                        }
                      ]
                    }
                  ]
                }
              ]
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "IPython 9.0"
        }
      ],
      "level": 1,
      "target": "version90"
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "I am not going to list the removals and deprecations, but anything deprecated since before IPython 8.16 is gone, including many shim modules and indirect imports that would just re-expose IPykernel, qtconsole, etc."
            }
          ]
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "A number of new deprecations have been added (run your test suites with "
            },
            {
              "__type": "InlineRole",
              "__tag": 4003,
              "value": "-Werror",
              "domain": null,
              "role": null,
              "inventory": null
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "), as those will be removed in the future."
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "Removal and deprecation"
        }
      ],
      "level": 2,
      "target": null
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "IPython's color handling had grown many options through the years, and it was quite entrenched in the codebase, directly emitting ansi escape sequences deep in traceback printing and other places."
            }
          ]
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "This made developing new color schemes difficult, and limited us to the 16 colors of the original ansi standard defined by your terminal."
            }
          ]
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "Syntax highlighting was also inconsistent, and not all syntax elements were always using the same theme."
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "Color and theme rewrite"
        }
      ],
      "level": 2,
      "target": null
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "Starting with 9.0, the color and theme handling has been rewritten, and internally all the printing is done by yielding pairs of Style and token objects (compatible with pygments and prompt_toolkit), then as much as possible, IPython formats these objects at the last moment, using the current theme."
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "Using (style, token) pairs"
        }
      ],
      "level": 3,
      "target": null
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "This means that new themes can now use all of pygments's color names and functionalities, and you can define for each token style, the foreground, background, underline, bold, italic and likely a few other options."
            }
          ]
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "In addition, themes now provide a number of "
            },
            {
              "__type": "InlineRole",
              "__tag": 4003,
              "value": "symbols",
              "domain": null,
              "role": null,
              "inventory": null
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ", that can be used when rendering traceback or debugger prompts. This let you customize the appearance a bit more. For example, instead of using dash and greater-than sign, The arrow pointing the current frame can actually use horizontal line and right arrow unicode symbol, for a more refined experience."
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "256-bit colors and unicode symbols"
        }
      ],
      "level": 3,
      "target": null
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "All the existing themes (Linux, LightBG, Neutral and NoColor) should not see any changes, but I added two new "
            },
            {
              "__type": "Emphasis",
              "__tag": 4047,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "pride themes"
                }
              ]
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": ", that show the use of 256bits colors and unicode symbols. I'm not a designer, so feel free to suggest updates and new themes to add."
            }
          ]
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "Themes  currently still require writing a bit of Python, but I hope to get contributions for IPython to be able to load them from text files, for easier redistribution."
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "New themes using colors and symbols"
        }
      ],
      "level": 3,
      "target": null
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "IPython now displays a few tips at startup (1 line), to help you discover new features. All those are in the codebase, and can be displayed randomly or based on date. You can disable it via a configuration option or the "
            },
            {
              "__type": "InlineCode",
              "__tag": 4051,
              "value": "--no-tips"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " flag."
            }
          ]
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "Please contribute more tips by sending pull requests!"
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "Tips at startup"
        }
      ],
      "level": 2,
      "target": null
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "And more generally I have changed the folder structure and what is packaged in the wheel to reduce the file size. The wheel is down from 825kb to 590kb (-235kb) which is about a 28% reduction. This should help when you run IPython via Pyodide – when your browser needs to download it."
            }
          ]
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "According to https://pypistats.org/packages/ipython, IPython is downloaded about 13 million times per week, so this should reduce PyPI bandwidth by about 2Tb each week, which is small compared to the total download, but still, trying to reduce resource usage is a worthy goal."
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "Out-of-tree tests"
        }
      ],
      "level": 2,
      "target": null
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "This feature allow IPython CLI to make use of Jupyter-AI provider to use LLM for suggestion, and completing the current text. Unlike many features of IPython this is disabled by default, and need several configuration options to be set to work:"
            }
          ]
        },
        {
          "__type": "Blockquote",
          "__tag": 4059,
          "children": [
            {
              "__type": "BulletList",
              "__tag": 4053,
              "ordered": false,
              "start": 1,
              "children": [
                {
                  "__type": "ListItem",
                  "__tag": 4054,
                  "children": [
                    {
                      "__type": "Paragraph",
                      "__tag": 4045,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "Choose a provider in "
                        },
                        {
                          "__type": "InlineCode",
                          "__tag": 4051,
                          "value": "jupyter-ai"
                        },
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": " and set it as default one:    "
                        },
                        {
                          "__type": "InlineCode",
                          "__tag": 4051,
                          "value": "c.TerminalInteractiveShell.llm_provider_class = <fully qualified path>"
                        },
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "    You likely need to setup your provider with API key or other things."
                        }
                      ]
                    }
                  ]
                },
                {
                  "__type": "ListItem",
                  "__tag": 4054,
                  "children": [
                    {
                      "__type": "Paragraph",
                      "__tag": 4045,
                      "children": [
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": "Choose and available shortcut (I'll take "
                        },
                        {
                          "__type": "InlineCode",
                          "__tag": 4051,
                          "value": "Ctrl-Q"
                        },
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": " as an example) and bind    to trigger "
                        },
                        {
                          "__type": "InlineCode",
                          "__tag": 4051,
                          "value": "llm_autosuggestion"
                        },
                        {
                          "__type": "Text",
                          "__tag": 4046,
                          "value": " only while typing."
                        }
                      ]
                    }
                  ]
                }
              ]
            }
          ]
        },
        {
          "__type": "Code",
          "__tag": 4050,
          "value": "c.TerminalInteractiveShell.shortcuts = [\n     {\n         \"new_keys\": [\"c-q\"],\n         \"command\": \"IPython:auto_suggest.llm_autosuggestion\",\n         \"new_filter\": \"navigable_suggestions & default_buffer_focused\",\n         \"create\": True,\n     },\n ]",
          "execution_status": null,
          "out": ""
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "See "
            },
            {
              "__type": "CrossRef",
              "__tag": 4002,
              "value": "llm_suggestions",
              "reference": {
                "__type": "LocalRef",
                "__tag": 4022,
                "kind": "docs",
                "path": "config:details"
              },
              "kind": "exists"
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " for more."
            }
          ]
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "Thanks as well to the "
            },
            {
              "__type": "Link",
              "__tag": 4049,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "D. E. Shaw group"
                }
              ],
              "url": "https://deshaw.com/",
              "title": ""
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " for sponsoring this work."
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "Integration with Jupyter-AI LLM"
        }
      ],
      "level": 2,
      "target": null
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "Ruth Bader Ginsburg 1933-2020 was an American lawyer and jurist who served on the Supreme Court of the United States. Ginsburg spent much of her legal career as an advocate for gender equality, women's rights, abortion rights, and religious freedom."
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "For something completely different"
        }
      ],
      "level": 2,
      "target": null
    },
    {
      "__type": "Section",
      "__tag": 4015,
      "children": [
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "Thanks to everyone who helped with the 9.0 release and working toward 9.0."
            }
          ]
        },
        {
          "__type": "Paragraph",
          "__tag": 4045,
          "children": [
            {
              "__type": "Text",
              "__tag": 4046,
              "value": "As usual you can find the full list of PRs on GitHub under "
            },
            {
              "__type": "Link",
              "__tag": 4049,
              "children": [
                {
                  "__type": "Text",
                  "__tag": 4046,
                  "value": "the 9.0"
                }
              ],
              "url": "https://github.com/ipython/ipython/milestone/138?closed=1",
              "title": ""
            },
            {
              "__type": "Text",
              "__tag": 4046,
              "value": " milestone."
            }
          ]
        }
      ],
      "title": [
        {
          "__type": "Text",
          "__tag": 4046,
          "value": "Thanks"
        }
      ],
      "level": 2,
      "target": null
    }
  ],
  "local_refs": []
}