{
  "__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.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"
                    },
                    {
                      "__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"
            },
            {
              "__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": "InlineRole",
              "__tag": 4003,
              "value": "subprocess.CalledProcessError",
              "domain": null,
              "role": "exc",
              "inventory": null
            },
            {
              "__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
        }
      ],
      "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": "InlineRole",
              "__tag": 4003,
              "value": "HistorySavingThread",
              "domain": null,
              "role": null,
              "inventory": null
            },
            {
              "__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": "InlineRole",
                      "__tag": 4003,
                      "value": "history",
                      "domain": null,
                      "role": "magic",
                      "inventory": null
                    },
                    {
                      "__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": "InlineRole",
                      "__tag": 4003,
                      "value": "history",
                      "domain": null,
                      "role": "magic",
                      "inventory": null
                    },
                    {
                      "__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": "InlineRole",
                      "__tag": 4003,
                      "value": "run_cell_async",
                      "domain": null,
                      "role": "any",
                      "inventory": null
                    },
                    {
                      "__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": "InlineRole",
              "__tag": 4003,
              "value": "run_cell_async",
              "domain": null,
              "role": "any",
              "inventory": null
            },
            {
              "__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": "InlineRole",
              "__tag": 4003,
              "value": "history",
              "domain": null,
              "role": "magic",
              "inventory": null
            },
            {
              "__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": "InlineRole",
              "__tag": 4003,
              "value": "Completer.policy_overrides",
              "domain": "std",
              "role": "configtrait",
              "inventory": null
            },
            {
              "__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
        },
        {
          "__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": "InlineRole",
              "__tag": 4003,
              "value": "Completer.policy_overrides",
              "domain": "std",
              "role": "configtrait",
              "inventory": null
            },
            {
              "__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
        },
        {
          "__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": "InlineRole",
              "__tag": 4003,
              "value": "Completer.auto_import_method",
              "domain": "std",
              "role": "configtrait",
              "inventory": null
            },
            {
              "__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": "InlineRole",
              "__tag": 4003,
              "value": "write",
              "domain": null,
              "role": null,
              "inventory": null
            },
            {
              "__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
        }
      ],
      "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
        },
        {
          "__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": []
}