diff --git a/docs/development/pr-2068-call-feedback-plan.md b/docs/development/pr-2068-call-feedback-plan.md index 6f75dfd04..340de0b37 100644 --- a/docs/development/pr-2068-call-feedback-plan.md +++ b/docs/development/pr-2068-call-feedback-plan.md @@ -1,6 +1,6 @@ -# PR 2068: review call feedback, reproduction and plan +# PR 2068: review call feedback, reproduction, plan and acceptance -Prepared on 2 October 2026 (Europe/Berlin) after the review call between Martin and Bernhard. Base: `feat/codeatlas-web` at `50a6a67b89f2e2bd901b903fe0f2affabc1cb449`. This document is a plan for approval. No product code has been changed for it yet; the only code in this branch is the capture script that produced the evidence. +Prepared on 2 October 2026 (Europe/Berlin) after the review call between Martin and Bernhard. Base: `feat/codeatlas-web` at `50a6a67b89f2e2bd901b903fe0f2affabc1cb449`. The plan below was approved as proposed (all ten decisions) and is implemented on `fix/atlas-call-feedback`; the measured acceptance is in [Implementation and acceptance](#implementation-and-acceptance) at the end. Every point from the call was reproduced in a real browser before a fix was proposed. Where the call notes or the first code reading guessed a cause, the measurement below decides. Two guesses were refuted that way; both are marked. @@ -233,3 +233,52 @@ The model already supports `filter` and `maxNodes`, but the UI hard-wires the fi - `semantic-graph.test.ts` above 40 nodes 2. **P2 items** as approved. 3. **Final checks:** `scripts/ci/test-ui.sh`, then the same capture script against Django and the control repository. Before and after appear side by side, with the canvas, camera and prompt measurements above as acceptance criteria. + +## Implementation and acceptance + +All items G1 to G7, C1 to C6, A1 to A4, the backend parts of A2 and A3 and the style gate side finding are implemented on `fix/atlas-call-feedback`, 49 signed-off commits on top of the plan commit. The decisions were applied exactly as proposed. + +### Browser acceptance + +[`graph-ui/tools/call-feedback-acceptance.mjs`](../../graph-ui/tools/call-feedback-acceptance.mjs) checks every item in the running UI: a binary built from this branch with the UI embedded, the same Django 5.2.7 index and the control repository. Each check measures a value in the page instead of judging a picture. Movements are also cut into frame strips (six frames per second) from a recorded video. Final run: **19 of 19 checks passed, no page errors.** + +| Item | Measured after the fixes (before) | +| --- | --- | +| G1 | One canvas element through selection and two expansions (before: rebuilt twice per Expand). Fits: one per new root, none per Expand. While the first scope arranges, the whole graph stays drawn instead of a blank canvas ([frame strip](pr-2068-call-feedback/30-after-strip-select-scope.jpg)) | +| G2 | A symbol opens at "1 layer" with 25 drawn edges for `JSONBAgg`; the minus button is disabled at depth 1 (before: "0 layers · 1 node · 0 edges") | +| G3 | Wheel zoom moves the camera 0.87 and 0.85 along the view direction, so it turns toward the cursor (before: exactly 1.000, always to the centre) | +| G4 | After two layers (90 nodes) the root marker sits at the canvas centre and all 90 nodes are inside the view ([image](pr-2068-call-feedback/21-after-galaxy-two-layers-root-marked.jpg)) | +| G5 | "Path to Func · 2 hops" via `Aggregate` with labelled edges, stepping and Escape ([image](pr-2068-call-feedback/22-after-galaxy-path-view.jpg)). Call order of `call_command`: 8 calls in source line order 110 to 173 ([image](pr-2068-call-feedback/23-after-galaxy-call-order.jpg)) | +| G7 | Scoped toolbar 49 px high at 1600 px, one row | +| C1 | The explanation prompt names all 11 callers from the index and contains none of the internal keys (before: one outgoing INHERITS item and `Snapshot.*`, `renderedNodes`, omission paths) | +| C2 | "Who calls JSONBAgg?" lists all 11 CALLS callers, the 11 TESTS edges and DEFINES from `general.py`, marked "Listed from the indexed graph; not generated by the model", with no repeated line ([image](pr-2068-call-feedback/24-after-chat-who-calls-listed.jpg)) (before: `DateTimeField` repeated to item 48) | +| C3 | The element under the Send button is the Send button; Selection details ends at x 1158, the input starts at x 1193 (before: Selection details intercepted pointer events) | +| C4 | Returning to `JSONBAgg` starts no new model run and shows the same explanation at once (before: "Explaining selection..." again) | +| C5 | Output limit set to 384, still 384 after a reload; input limit 2048 ([image](pr-2068-call-feedback/25-after-agent-configuration-token-limits.jpg)) | +| C6 | Robot icon with status lamp; the model name is in the tooltip and label; a click opens the agent configuration | +| A1 | Inside `django`: 23 labels, none overlapping, no full paths; the next folder level as area blocks, external areas in an "Outside" lane, the same tilted perspective as the root ([image](pr-2068-call-feedback/26-after-overview-django-drill-in.jpg)) | +| A2 | System structure for Django: 12 groups shown; backend status `ready` with 12,774 components in 458 ms (before: `limited`, 0 components, reason hidden) ([image](pr-2068-call-feedback/27-after-system-structure-django.jpg)) | +| A3 | Behavior offers 61 starts for Django: the 2 classified entry points first, then ranked flows; `main` is picked and shows its 2 direct callees ([image](pr-2068-call-feedback/28-after-behavior-django.jpg)). The control repository keeps 129 | +| A4 | Endpoints grouped by first segment with counts, 155 test routes hidden behind a toggle, 20 labels without overlap, percent-encoded paths shown decoded ([image](pr-2068-call-feedback/29-after-routes-endpoints-grouped.jpg)) | + +### Test runs on the final tree + +- `scripts/ci/test-ui.sh`: green. vitest 235 files and 3,228 tests, style gate green (it was red on the base), promise scan, 203 portable acceptance checks, production build. +- C, ASan and UBSan: all 143 suites through the parallel harness, 8,005 passed, 0 failed, 7 skipped. The watchdog regressions of `scripts/test.sh` Step 5 (parent death, worker supervisor death, worker MCP error) pass. +- clang-format clean on the changed C files. The diff-scoped clang-tidy gate leaves four findings that already apply to the base: + - the cognitive complexity of `ap_render` (140) and `ap_overview` (67) + - the file's `calloc(n + 1, ...)` idiom + - an analyzer path with a NULL file that cannot reach `ap_ownership`, because `ap_load` returns an error first +- DCO: `scripts/check-dco.sh 92224c44..HEAD` reports 49 signed-off commits. + +### Not run, and why + +- `scripts/test.sh` without `--suites` stops at Step 0x, the packaging version-metadata contract: the package manifests declare 0.10.8 while the newest release is 0.11.0. The same failure occurs on `50a6a67b`, since this branch predates the 0.11.0 release on `main`. The suites and Step 5 were therefore run directly with the same build flags. +- Linux and Windows legs, and cppcheck (not installed locally), were not run. + +### Remaining limits and follow-ups + +- Django `urls.py` `path()` views are not linked to their routes by HANDLES edges in the index, so only two Django entry points are classified. Behavior covers this with ranked flows; linking the views is an indexer change. +- The listed caller answer is produced in the chat, which needs the browser model to be loaded before a question can be sent. +- Explanations are still worded by the local 0.5B model. The facts it receives are now complete and readable, but the wording quality is bounded by the model. + diff --git a/docs/development/pr-2068-call-feedback/21-after-galaxy-two-layers-root-marked.jpg b/docs/development/pr-2068-call-feedback/21-after-galaxy-two-layers-root-marked.jpg new file mode 100644 index 000000000..315309b45 Binary files /dev/null and b/docs/development/pr-2068-call-feedback/21-after-galaxy-two-layers-root-marked.jpg differ diff --git a/docs/development/pr-2068-call-feedback/22-after-galaxy-path-view.jpg b/docs/development/pr-2068-call-feedback/22-after-galaxy-path-view.jpg new file mode 100644 index 000000000..a19d95e7b Binary files /dev/null and b/docs/development/pr-2068-call-feedback/22-after-galaxy-path-view.jpg differ diff --git a/docs/development/pr-2068-call-feedback/23-after-galaxy-call-order.jpg b/docs/development/pr-2068-call-feedback/23-after-galaxy-call-order.jpg new file mode 100644 index 000000000..b7ec07f21 Binary files /dev/null and b/docs/development/pr-2068-call-feedback/23-after-galaxy-call-order.jpg differ diff --git a/docs/development/pr-2068-call-feedback/24-after-chat-who-calls-listed.jpg b/docs/development/pr-2068-call-feedback/24-after-chat-who-calls-listed.jpg new file mode 100644 index 000000000..aa712eb77 Binary files /dev/null and b/docs/development/pr-2068-call-feedback/24-after-chat-who-calls-listed.jpg differ diff --git a/docs/development/pr-2068-call-feedback/25-after-agent-configuration-token-limits.jpg b/docs/development/pr-2068-call-feedback/25-after-agent-configuration-token-limits.jpg new file mode 100644 index 000000000..9ed914375 Binary files /dev/null and b/docs/development/pr-2068-call-feedback/25-after-agent-configuration-token-limits.jpg differ diff --git a/docs/development/pr-2068-call-feedback/26-after-overview-django-drill-in.jpg b/docs/development/pr-2068-call-feedback/26-after-overview-django-drill-in.jpg new file mode 100644 index 000000000..d1d6191b0 Binary files /dev/null and b/docs/development/pr-2068-call-feedback/26-after-overview-django-drill-in.jpg differ diff --git a/docs/development/pr-2068-call-feedback/27-after-system-structure-django.jpg b/docs/development/pr-2068-call-feedback/27-after-system-structure-django.jpg new file mode 100644 index 000000000..67937e7c6 Binary files /dev/null and b/docs/development/pr-2068-call-feedback/27-after-system-structure-django.jpg differ diff --git a/docs/development/pr-2068-call-feedback/28-after-behavior-django.jpg b/docs/development/pr-2068-call-feedback/28-after-behavior-django.jpg new file mode 100644 index 000000000..71f2174cb Binary files /dev/null and b/docs/development/pr-2068-call-feedback/28-after-behavior-django.jpg differ diff --git a/docs/development/pr-2068-call-feedback/29-after-routes-endpoints-grouped.jpg b/docs/development/pr-2068-call-feedback/29-after-routes-endpoints-grouped.jpg new file mode 100644 index 000000000..34e43d362 Binary files /dev/null and b/docs/development/pr-2068-call-feedback/29-after-routes-endpoints-grouped.jpg differ diff --git a/docs/development/pr-2068-call-feedback/30-after-strip-select-scope.jpg b/docs/development/pr-2068-call-feedback/30-after-strip-select-scope.jpg new file mode 100644 index 000000000..caf4c3df8 Binary files /dev/null and b/docs/development/pr-2068-call-feedback/30-after-strip-select-scope.jpg differ