From 37176862b86c03ecc0ed971e08da0a87b067ea4d Mon Sep 17 00:00:00 2001 From: Hugo Date: Fri, 23 Oct 2026 22:23:52 +0200 Subject: [PATCH 1/4] docs(changelog): describe the analysis fixes since 0.23.0 The summary fixpoints that never settled (#261), with the removal of MAX_PROJECT_ITERATIONS and the source order of external calls, and the annotations that stopped the analysis of a directory (#262). --- CHANGELOG.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index aa16f6a..32fa96e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -33,6 +33,27 @@ `RuleDescription`, optional, so that third-party plugins describe their own rules; `Finding.related` lists `RelatedLocation`s (a span and a message). `Report.rules` carries the descriptions to the reporters. +- Plugin API: `coretrace_python.interprocedural.starting_summaries` gives the summaries an + import cycle's members start from, and `coretrace_python.engine.MAX_PROJECT_ITERATIONS` + is removed, since the project's summaries are iterated until they settle (#261). +- A summary lists its external calls in source order (#261): a finding naming the first + call of a callee's summary may name another of that callee, at the same line, as 4 of + saleor's 228 `orm-n-plus-one` findings do. + +### Analysis + +- `--check` ends on projects whose summaries never settled (#261). Around a call cycle of + three functions or more, a caller copied its callee's external calls in an order that + rotated forever, so ansible, fastapi, sentry and home-assistant never ended: those calls + are now kept in source order. Around an import cycle of three modules or more, the + project's iteration shifted by one module each time and stopped at its bound, which + could miss a sink reached through the cycle: its members now start from the summaries a + module starts from, and the iteration goes on until the project's summaries settle. +- A lambda or comprehension in the annotation of a parameter or a variable no longer + stops the analysis of a directory with a `KeyError` (#262). An assignment expression in + an annotation binds its name as Python 3.11 to 3.13 do: in a function, the name is a + local whether the annotation is evaluated or not; at module level, it exists only once + the annotation is evaluated. ### Performance From 5201dd78cb9977b6037563a12b8af887874c19a5 Mon Sep 17 00:00:00 2001 From: Hugo Date: Fri, 23 Oct 2026 22:23:52 +0200 Subject: [PATCH 2/4] docs(changelog): describe how templates are read since 0.23.0 Start tags read as the HTML tokenizer reads them (#263), what a template leaves open and how comments end (#272), and every continuation of a comment holding template tags (#278), with the templates no longer established that these readings refuse. --- CHANGELOG.md | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 32fa96e..90d4a00 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,10 @@ instead of repeating its id (#270), and each result carries its confidence as the `confidence` property (#271). A flow reaching its sink inside a project function points at that sink as a related location, which the result's message links to (#271). +- Django templates are read as a browser reads them (#263, #272, #278): a template that + leaves a tag, a `