The organization page named each row with its own read: a product per
delivery, a ladder and a tier per rung, an actor, a ladder and a tier
list per tier change, an actor per entitlement change, and a ladder list
per product in the Issue grant advisory. The page now makes one resolver
after the organization read and every section names its rows through it,
so each kind of name is one statement for the page (#10): the panel reads
every pool's positions first and wants their products, ladders and
tiers; Tier changes fold and page the rows before naming them, so only
the window's rows are named; Entitlement changes want the page's actors;
the advisory reads the tiers of the held ladders in one statement
(productsOnLadders) and flags the products on them. The grants ledger
takes the page's resolver in place of its own. The owner is still one
GetPersonByID read, as before. GetTier is deleted with its last caller,
and the resolver functions that now have a production caller leave the
test-only list.
One current-shape rule now names tiers here: a dash for a row with no
rank, the product at that rank on the ladder as it is now, or "rank N"
when no tier holds the rank. It replaces the page's own closure and its
two caches.
Accepted difference, named: a failed batch read now fails every id of its
kind together (every delivery's product name, every ladder name, every
rank, every actor), where one id could fail while the others resolved.
Only an injected failure reaches it. The failure table's row for a failed
product ladder read is NARROWER for it: the advisory's read is one batch
over the held ladders, so the partial failure has no row.
How it was shown to change no output: every golden under
testdata/org_enrollment is byte-identical, and the tests of
internal/server and internal/entitlements give the same 1588 names and
results at the parent and here (1587 pass, 1 skip). The organization
page's read-count row goes from 8 per row to 0. The failure table keeps
its names and moves the method each row fails: actors to
ListPersonNamesByIDs, products to ListProductNamesByIDs, ladders to
ListPlanLadderNamesByIDs, and rank, tier labels and the product ladder
row to ListTiersWithProductsByLadderIDs; the owner row still fails
GetPersonByID. The operator walkthroughs give 22 equal names, results and
skips at the parent and here. loadOrgEnrollmentData is re-pinned at 63,
the score golangci-lint printed with a placeholder pin.
Breaks: 76 records, 49 names, 51 run per side (26 on both sides, 25
old-only, 25 new-only); all 51 CAUGHT at the parent and all 51 CAUGHT
here.
Unprobed: which ids each section wants (only the page's rows; a wider
want changes the batch's id list, not the statement count or the output);
the sorted order of the batch's ids; the guard that skips the advisory's
read when no ladder is held (an empty batch answers no rows, the same
flags); the removed nil check on the identity querier for entitlement
change actors (every test handler has one).