Completeness check of K13: at the end of django/contrib/postgres/aggregates/
general.py the pager read "Lines 42 to 66 · end of file" and drew an empty
line 66, while the file has 65 lines and the title of the disabled "Next
lines" already said "Line 65 is the last line of this file." The Module
range counts the empty segment after the final line break. On the last page
that segment is no longer drawn and the range ends at the real last line,
so range text, drawn lines and title agree. A file that ends without a final
line break keeps its last line.
Signed-off-by: Bernhard Jackiewicz <bj@techport.io>
The K27 browser run now also checks that System structure and Behavior show
no Back of their own, that Plan or 3D in System structure and Behavior is a
step Back restores, that the Behavior path and the operation on the call
chain come back after Back and Forward, and that text typed in the Routes
filter survives an immediate Back. Screenshots reset every scrolled
container so each one shows the subtabs and the history controls.
Signed-off-by: Bernhard Jackiewicz <bj@techport.io>
Review follow-up for K27:
- The opened Overview area or file reaches only Overview, and the hotspot
area only Hotspots. Endpoints, Entry points and Hotspots no longer draw
or report an area opened in Overview, so the chat context names nothing
that is not on screen.
- Plan or 3D in System structure and in Behavior is part of the entry and a
step, as on the shared map. The Behavior path to a destination is a step;
the operation on the call chain and the page of direct calls stay with the
entry without being steps, so Back and Forward return to them.
- The in-view "Back" buttons of System structure and Behavior are absorbed
into the one Back beside the subtabs.
- Back, Forward or a Recent jump while typing in the Routes filter first
records the typed text as a step instead of dropping it.
- replaceNavigation also merges with the step after it, so no two equal
steps end up next to each other.
Signed-off-by: Bernhard Jackiewicz <bj@techport.io>
tools/handtest-fixes-k27.mjs drives the hand-test flow on django-demo in a
headless browser: Overview, open django, Routes, Endpoints, open the /edit
route group, System structure, expand a group, Behavior, start handle in
loaddata.py, follow a call. It then goes back step by step to the start and
forward again, checking at every step the subtab, location trail, route
perspective and filter, system focus and expanded groups, Behavior start
and the Back and Forward tooltips. It also checks Alt+Left and Alt+Right
(and that they do nothing while typing in the filter), a jump from Recent,
that a new navigation after Back drops Forward, that Alt+Left in Galaxy
leaves the Architecture history alone, and that switching to cbm starts a
fresh history. Every step writes a screenshot and index.md.
Signed-off-by: Bernhard Jackiewicz <bj@techport.io>
Hand-test finding K27: Architecture had scattered ways back with different
meanings (the Overview trail, a "Back" in System structure that walked the
focus, a "Back" in Behavior that walked the starts) and no way back from
"Show these N routes". Nothing went forward.
Architecture now keeps one place (subtab; opened area or file and Plan or
3D; route perspective and filter; System structure focus and expanded
groups; Behavior start, destination and where followed calls began) and
records it in the bounded model Galaxy uses (graph/navigation-history.ts),
with the same rules: at most 25 steps, consecutive duplicates merge, a new
navigation after Back drops the forward branch, no pushState, a Recent list
of 8 places, Alt+Left and Alt+Right only in the active workspace and not
while typing or while another surface takes the keys, a fresh history per
project.
Back, Forward and Recent sit beside the subtabs; their tooltips name the
target ("Back to Overview · django"). The old "Back" buttons in System
structure and Behavior stay in place and take the same step. "Whole system"
and the Overview trail stay as ordinary steps.
Architecture adds three refinements: typing in the route filter becomes one
step once it pauses; a choice the page makes itself (the suggested Behavior
start, a reset after reindexing) replaces the current step
(replaceNavigation), so Back never bounces on it; and the current step
keeps the newest details of its place (refreshNavigation), so a step whose
suggested start was rejected for a stale snapshot is still named after the
start the journey shows.
The views read their part of the place from the workspace and report
changes back; rendered on their own, as in their unit tests, they keep it
as their own state and offer no Back. A new tab row class avoids the
existing atlas-arch-bar meter. The concept doc now covers both workspaces.
Signed-off-by: Bernhard Jackiewicz <bj@techport.io>
The automatic explanation now lists the indexed facts itself and sends
the model only the source (K7, K14): check the card facts against the
index and the source in the prompt instead of caller names in the prompt.
Endpoints are measured after the route evidence is read.
Signed-off-by: Bernhard Jackiewicz <bj@techport.io>
Whether a route is test code is decided by its registration, handler and
caller evidence, which Django reads for up to 12 s. Until then the toggle
showed "1 hidden" and later jumped to 155. It now reads "checking..." until
the evidence arrives.
Signed-off-by: Bernhard Jackiewicz <bj@techport.io>
The chat checks now also go back to the workflow file after Galaxy and
assert that its earlier answer is not resent (K17), list callers with
automatic explanations off and ask the model with the source (K14),
read the German suggestion buttons and the direction of "Does this
class call super?" (K16), assert the counted workflow facts and the job
count (K12) and the callee names in the Behavior facts (K7).
Signed-off-by: Bernhard Jackiewicz <bj@techport.io>
Review of the hand-test fixes, K3. With the chat open at 1494 px and
the recent-roots list shown, the short labels alone left the count
about 15 px short, so it was cut. "All graph" now reads "All" there
too, keeps its accessible name and gains a tooltip naming its action.
The scope hook's new comment is in English like the rest of the file.
Signed-off-by: Bernhard Jackiewicz <bj@techport.io>
Review of the hand-test fixes, K5. Above 60 nodes the hierarchy of a
scope drew no names (JSONBAgg at two layers, 90 nodes) but 80 edge
labels on the first 80 pairs. Names now stand up to 150 nodes; above
that neither names nor edge labels, and the hint says how to get them
back. Every line at the root keeps its label; further out a fan from
or into one node carries one label with its count. A label shows only
while the names read on screen (at the fitted two-layer view they are
about 5 px), only on lines in view, and never over a name: a label
without a free place is left out, the line colour still tells its type.
The Playwright script checks these review findings too.
Signed-off-by: Bernhard Jackiewicz <bj@techport.io>
The Behavior facts listed direct calls only by line and arguments, while
the view beside them named setdefault and execute_from_command_line.
The calls carry only the target's id, so the name is now read from the
call-site line of the source Behavior already read, and only when the
call on that line starts with the recorded first argument.
Signed-off-by: Bernhard Jackiewicz <bj@techport.io>
The small model still invented structure in Explore: "Es gibt 3 Jobs"
for a workflow with one job, and the trigger type "opened" became a
branch name. The jobs, triggers, steps and actions of a whole GitHub
Actions workflow are now counted from its keys and given to the model
as facts, and the automatic explanation lists them above the model text
with a note that they were read from the file.
Signed-off-by: Bernhard Jackiewicz <bj@techport.io>
A German suggestion came with the English buttons "Show the list" and
"Ask the model". A listed answer and a suggestion now keep the language
of the question, and their buttons follow it.
Signed-off-by: Bernhard Jackiewicz <bj@techport.io>
The suggestion only looked at the word right after the first selection
word, so "Does this class call super?" was offered as its callers, and
the typo correction turned real words such as "Luft" or "calm" into
relation words. The selection now spans its kind noun, "calls in/from
this" reads as its own calls, summarizing questions go to the model,
real words one edit away are kept, short typos of "ruft" are read, and
both answers say which language they reply in.
Signed-off-by: Bernhard Jackiewicz <bj@techport.io>
Review of the hand-test fixes, K3. The scoped toolbar kept one row by
no longer wrapping, so what did not fit was cut off: with the chat open
at 1494 px (the hand-test window) the count and the More menu with the
render limits lay past the edge. The toolbar now measures itself and
takes the first level at which nothing sticks out: full labels, then
short ones ("+1", "Path…", "Types · All", "Calls"), then a shorter
count, and only then a second row. The short labels are drawn by CSS,
so the text and accessible name of each control stay the same. The
count is no longer capped at 12rem while there is room.
Signed-off-by: Bernhard Jackiewicz <bj@techport.io>
A listed caller or callee answer took the selected symbol's source only
from what an automatic explanation or a typed question had read. With
automatic explanations off its Source disclosure claimed the source was
unavailable, and "Ask the model" sent the question without the code.
A listed answer and a suggestion now read the source themselves, keep
the graph evidence they were listed from, and asking the model reads it
again after a failed read and rebuilds the evidence with the code.
Signed-off-by: Bernhard Jackiewicz <bj@techport.io>
Earlier answers were filtered by topic only, so coming back to a file or
selection after a view switch sent its old answers again, the wrong
flake8 answer about the workflow included, while the divider above the
question said earlier messages are not sent. A question now carries
only the turns since the topic last changed, which is what the divider
says.
Signed-off-by: Bernhard Jackiewicz <bj@techport.io>
Review of the hand-test fixes, K8. A batch of layer 3 around JSONBAgg
read eight continuation pages, and the toolbar stood still for 8 s: the
progress came only after a whole batch. Each page now counts at once,
the page that passes the render limit is the last one read (the cut
batch is not cached), and the tooltip names the running request.
Before loading, growing like the last layer predicted about 400 nodes
for layer 3 and over 9,000 came. Once a layer is complete, one short
query reads the indexed CALLS degree of its edge nodes (9,006 for that
layer: len, create, str, list). Expand warns when that floor passes the
render limit and says how many calls are waiting.
Signed-off-by: Bernhard Jackiewicz <bj@techport.io>
The browser check now also measures what the review found: blue pixels
of the Behavior call lines and the Service map call key (K19-lines),
folder names and neighbour chips while the pointer sweeps over every
chip in Hotspots and Overview (K20-hover), and whether the same error
text from two places reaches the log twice in full while a count keeps
its place (K26-identity). K25 now selects Behavior after the project
switch, so it no longer depends on a profile that remembered it, and
slow architecture reads of django-demo get a longer wait.
Signed-off-by: Bernhard Jackiewicz <bj@techport.io>
A hovered chip claimed the 96 px of a selected chip, though only a
selected chip opens its extra rows. In Hotspots, hovering create hid
label_for_field and showed shortcut on top of the contrib name instead.
Only the selected chip reserves that height now; hovering a shown chip
changes no chip, and hovering a box still reveals its hidden chip.
Signed-off-by: Bernhard Jackiewicz <bj@techport.io>
Review of the hand-test fixes, K13. At the end of general.py the
disabled "Next lines" said "Line 66 is the end of this file", but the
file has 65 lines: the Module range counts the empty segment after the
final line break. The title now names the last line before that
segment, and the line itself when a file has no final line break.
Signed-off-by: Bernhard Jackiewicz <bj@techport.io>
Review of the hand-test fixes, K2 and K3. The group around Back, Forward
and Recent carried the label of the recent-roots list, so screen readers
announced the buttons as that list. The group is now "History", the list
keeps its own label, and the root button that opens the source says so
in its accessible name instead of only in the tooltip.
Signed-off-by: Bernhard Jackiewicz <bj@techport.io>
Review of the hand-test fixes, K2 and K8. Restoring a history entry with
the same root (Back to another depth, or the minus button while a layer
loads) cleared the selection, so Selection details disappeared and the
chat lost its context, although commit 96fbec67 said it stays. Only the
"All graph" entry clears the selection now; another root still selects
itself once loaded.
Signed-off-by: Bernhard Jackiewicz <bj@techport.io>
The gate does not read its own report, which quotes every finding and every
documented exception. With --out outside the repository it still read the
committed verification/w6/stylegate.json, an earlier run of itself, and
failed on 57 quotes of the documented exceptions, on this branch as on its
base. Both paths are now its own reports.
Signed-off-by: Bernhard Jackiewicz <bj@techport.io>
The hand test said Behavior was "blue instead of green" again. Its canvas
and plates were green, but its lines were the shared CALLS blue, and the
Service map still tinted services built from source and its call key in
blue-grey. Behavior draws only invocations and the Service map only
service links, so their plain call needs no hue to tell it from imports
or usage: it now takes the call green of the scene palette, its pulses
too. Overview and System structure keep every relationship hue, as calls
run there beside green usage lines. The palette test now rejects any blue
literal in a scene file that is not a named data encoding.
Signed-off-by: Bernhard Jackiewicz <bj@techport.io>
BaseCommand's explanation said "130 nodes / 135 edges: too large for
the local model; showing 7" under facts that list every relationship
type with its complete count, while the model only read the source. The
note stays for answers where the prompt bounded the evidence (K7).
Signed-off-by: Bernhard Jackiewicz <bj@techport.io>
Route labels that share more than a compact chip shows but have no
separator inside that shared start ("/sitemapindex1.xml") got no short
form, so their chips were still cut to the same text. They now keep the
end that fits the chip, where they differ.
Signed-off-by: Bernhard Jackiewicz <bj@techport.io>
Folder names were placed around the chips with the hovered chip as the
priority chip, which reserves the 96 px of a selected one. Moving the
pointer over Hotspots or Overview made nearby names jump to another corner
or hide, and come back on leave. The chip and folder placement is now one
pure function; the names are placed around the chips as they lie without
the pointer, and only a selected chip makes them give way.
Signed-off-by: Bernhard Jackiewicz <bj@techport.io>
A start operation that calls itself was counted as one more direct callee
but drawn once, as the start. The heading then named one call more than the
pages, and the page counter read the gap as a filter nobody had set. The
start is no longer a callee of itself; the heading says "also calls itself",
and "matching the filter" appears only while a filter is set.
Signed-off-by: Bernhard Jackiewicz <bj@techport.io>
One Playwright check per item K1, K4, K7, K10, K11, K12, K14, K15, K16,
K17 and K24: each drives the flow of the correction plan against a
running server with the real local model, measures DOM text and boxes,
the messages sent to the model worker, the model's raw answers, model
downloads and the agent lamp, and writes screenshots with an index per
item. It prints PASS or FAIL with the measured values.
Signed-off-by: Bernhard Jackiewicz <bj@techport.io>
The callers listed for "Who calls JSONBAgg?" still said "Source
unavailable" under Source, although the explanation had read the class
source. A listed answer or suggestion now carries a source that was
already read (K14).
Signed-off-by: Bernhard Jackiewicz <bj@techport.io>
The ui-log buffer compared level, source, project and message only, so the
same uncaught TypeError from a second place, or a request failure with
another response body, was counted instead of sent: its location never
reached the log. The buffer now compares every field it sends, and a repeat
count carries the fields of the entry it counts, the detail on its second
line.
System › Logs grouped an entry with a detail apart from its own counts, so
one failure read as two rows. It now groups by the same fields as the
buffer.
Signed-off-by: Bernhard Jackiewicz <bj@techport.io>
Hand test K8. Now that layer three of JSONBAgg finishes, its picture of
5,000 rendered nodes was pushed apart on screen about two seconds later
into a cross of long lines: the screen separation that lifts names and
rings out of small scopes spread the dense cloud along the axes. Scopes
above 1,500 nodes keep their arranged layout.
The reader-focus test now waits for "Loading layer 1…" instead of
reading it right after the first render, where "Checking index…" can
still stand while the index generation is read.
Signed-off-by: Bernhard Jackiewicz <bj@techport.io>
Chat history comes back from IndexedDB; a damaged topic key threw while
a question looked for the topic it follows up on (K17).
Signed-off-by: Bernhard Jackiewicz <bj@techport.io>
"Es ist noch nichts ausgewählt" and "... explain yet" read like a
feature still to come and tripped the promise scan. The reply now says
what is the case: nothing is selected (K11).
Signed-off-by: Bernhard Jackiewicz <bj@techport.io>
The resume note was removed on its first read, so React's development
double effect read nothing the second time and the agent stayed off in
a dev build. The first page that reads the note now claims it; a second
read on that page resumes too, a later reload does not (K24). A question
that gives up while its symbol source is read no longer leaves the
composer waiting.
Signed-off-by: Bernhard Jackiewicz <bj@techport.io>
Hand test K2: the concept now names the late project, cancel as Back and the empty-canvas click as history rules, as implemented.
Signed-off-by: Bernhard Jackiewicz <bj@techport.io>
The token-limit note opens the agent configuration at its Output field
(K1). Focusing and centering the field scrolled the dialog so that its
title was cut at the top; it now scrolls only as far as needed.
Signed-off-by: Bernhard Jackiewicz <bj@techport.io>
Hand test K8 with K2. Cancelling a loading layer with the minus button
pushed the previous depth as a new history entry, so Back led to the
cancelled layer again. A cancel now moves the history cursor back when
the previous entry is that depth; Forward retries the cancelled layer.
Back to an entry with the same root keeps the selection instead of
selecting the root again.
Signed-off-by: Bernhard Jackiewicz <bj@techport.io>
After Cmd+R the configuration offered "Download & load" for a model in
the browser cache: "downloaded" was remembered per session only. And
opening another project reloads the page, so the agent went off.
- The configuration checks Cache Storage for every pinned file of each
model and says "Cached" and "Load model (cached, no download)".
- A project switch with the agent loaded leaves a one-time note in the
tab; the next page loads the same model again by itself (K24).
- "Load the chosen model on start when it is cached" is a new agent
preference, off by default (K10).
- Such loads are cache-only: the worker refuses any model download, and
a missing file ends in a message instead of a silent download.
Signed-off-by: Bernhard Jackiewicz <bj@techport.io>
Hand test K5. With both directions and all edge types the hierarchy
put incoming and outgoing neighbours of every type into one column to
the right of the root, sorted by name, cut long names, labelled no
edge and claimed "one column per call depth". Path to and Call order
were missing in this view.
The scope hierarchy now places incoming relationships on the left, the
root in the middle and outgoing ones on the right; deeper layers keep
the side of the neighbour that led to them. A column orders by that
neighbour, calls before other types and calls by call-site line.
Columns stand as far apart as their names are wide, so names keep
their full length (up to about forty characters). Each node pair
carries its edge types at the line ("CALLS · TESTS"), placed clear of
the names. The hint and the legend describe this picture per trace
direction, and Path to and Call order work here too, highlighting the
hierarchy's own nodes.
Signed-off-by: Bernhard Jackiewicz <bj@techport.io>
With .github/workflows/new_contributor_pr.yml open, "was kannst du mir
über dieses aktuelle File sagen" got an invented flake8 linter and a
Python script, later the file echoed back with a made-up pull request
status "ready". The captured prompt showed the file was there; the
model had no idea it was a workflow, read "status":"ready" from the
JSON metadata and followed "Explain the exact source" by copying it.
The prompt now names the file kind from its path ("a GitHub Actions
workflow, YAML configuration, not program code"), describes the open
file in words instead of a JSON record, and asks to summarize from the
file without new code, tools or languages it does not contain. Names in
an answer that the request did not contain are listed under it (K12).
Signed-off-by: Bernhard Jackiewicz <bj@techport.io>
Hand test K6. When the target of "Path to" lay close to the root, the
target's name covered the CALLS label and the camera did not move.
A newly shown path (not a step through it) now flies the camera onto
its nodes: the view direction stays, the camera steps in or out until
the path fills about half of the area beside the step list, with a
margin for names. All nodes of the path carry their name in the path
layer instead of the scene's name sprites, and each edge label slides
along its edge, then aside, until it touches no name and no other
label. Measured in the browser for JSONBAgg: zero overlaps for a one
hop and a two hop path, root and target 595 px apart (before: overlap
and an unmoved camera).
Signed-off-by: Bernhard Jackiewicz <bj@techport.io>
The explanation of JSONBAgg said "Source unavailable" although the class
source exists, and the local model filled the gap: "called on a list of
integers, the output is a list of strings". In Architecture it listed
"Finding a class name, Finding a line number" from field paths such as
Selected.members[3].startLine.
- A Galaxy or Architecture selection of one symbol reads its source,
bounded to 40 lines, through get_code_snippet, the call behind "Read
source evidence"; Behavior passes the source it already read. The
source goes into the explanation and into questions about the
selection, and "Source unavailable" goes away (K14).
- The explanation card lists the facts from the graph (selection,
incoming and outgoing by type, scope); Architecture selections become
sentences (area size and languages, hotspots, connections, call
sites). The model sees only the code and adds one sentence; one that
names something the evidence lacks, or claims types or inputs and
outputs the code does not show, is left out. Without source the model
is not asked (K7).
- An Architecture area kept its connections: its members' documentation
had used the whole snapshot budget.
Signed-off-by: Bernhard Jackiewicz <bj@techport.io>
tools/handtest-fixes-architecture.mjs drives the hand-test flows of
K18 to K23, K25 and K26 against a running UI, measures each finding in
the page (label rects and their overlaps, canvas colours from the
screenshot, counters, the posted ui-log entries) and prints PASS or
FAIL with the values, with screenshots after 0 ms, 250 ms, 1 s and 3 s.
Label and camera checks also run in the hand-test window (1494x728,
chat open). The script answers POST /api/ui-log and keeps beacons in
the page, so its sessions never reach the daemon log.
Signed-off-by: Bernhard Jackiewicz <bj@techport.io>