docs(ui): record the implementation and acceptance of the call feedback

Add the measured browser acceptance (19 of 19 checks), the test runs on
the final tree, what was not run and why, and the remaining limits, with
ten downscaled screenshots of the fixed views beside the reproduction.

Signed-off-by: Bernhard Jackiewicz <bj@techport.io>
This commit is contained in:
Bernhard Jackiewicz committed 2026-10-02 20:53:22 +02:00
1 parent dd336e5cdc
commit f14674ebd5
11 files changed
+51 -2

No files matched your search

+51 -2
View File
@@ -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.
Binary file not shown.

After

Width:  |  Height:  |  Size: 127 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 146 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 189 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 163 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 177 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 192 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 186 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 140 KiB