docs(admin): scanning page — the shallow vs. force taxonomy from source

First page of the admin tree, written to the new admin tier (what the
click actually does). Documents every scan surface with its verified
semantics: Force Rescan All Libraries (dashboard, force, all libraries,
one job each with skip-on-active), the per-library Scan button (ALSO a
force scan — hx-vals force:true since the button's birth commit 706be09d,
which corrects the owner's stated 'other scan buttons are shallow'
belief; flagged to the owner), Scan this folder (shallow, single-folder
scope, archive pass skipped for partial scans, podcast roots refused),
Auto-Scan + Scan Interval (the watcher + poll + startup triggers, all
shallow, default 60s range 1-3600), Processing Issues retry (per-item
sequential, deliberately not a library scan), and book-level Rescan /
Reset to Scanned. Plus the standing rules: one scan per library
(coalescing), background jobs with the dashboard progress panel, and
the two-consecutive-scans archive rule.

Glossary gains Scan and Scan this folder (same-commit rule for controls
cited in prose). The real-tree nav test's Administration assertion now
pins shape (Admin Guide, Libraries prefix + usabilityOrder subsequence)
instead of an exact slice, so pages landing one at a time don't churn it.
This commit is contained in:
John O'Keefe committed 2026-11-02 13:47:40 -05:00
1 parent 20754f15e2
commit 89fc479bdb
3 files changed
+119 -5

No files matched your search

+22 -5
View File
@@ -242,11 +242,28 @@ func TestBuildNavigationUsabilityOrder(t *testing.T) {
t.Errorf("Devices order = %v, want %v", got, wantDevices)
}
// Administration grows as its pages are written; pin what exists today:
// the guide leads (pinned landing), Libraries follows.
wantAdmin := []string{"Admin Guide", "Libraries"}
if got := titles(find("Administration")); !reflect.DeepEqual(got, wantAdmin) {
t.Errorf("Administration order = %v, want %v", got, wantAdmin)
// Administration grows as its pages are written; pin its shape, not
// its size: the guide leads, Libraries follows, and every other item
// must appear in usabilityOrder's declared relative order.
admin := find("Administration")
if len(admin.Items) < 2 || admin.Items[0].Title != "Admin Guide" || admin.Items[1].Title != "Libraries" {
t.Fatalf("Administration must lead with Admin Guide then Libraries, got %+v", admin.Items)
}
pos := map[string]int{}
for i, p := range usabilityOrder["Administration"] {
pos[docURL(p)] = i
}
last := -1
for _, item := range admin.Items[2:] {
r, ok := pos[item.URL]
if !ok {
t.Errorf("Administration item %q (%s) is not in usabilityOrder", item.Title, item.URL)
continue
}
if r <= last {
t.Errorf("Administration item %q breaks usabilityOrder sequence", item.Title)
}
last = r
}
}