diff --git a/AGENTS.md b/AGENTS.md
index c1496f26a..b37941827 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -273,7 +273,7 @@ stops startup instead of leaving a healthy-looking partial schema, and
application code must not compensate for a missing table.
Period leftover pairs (ADR 0017 / 0018 / 0048 / 0049 / 0119 / 0158 / 0162 /
-0163 / 0164 / 0182 / 0185 / 0201 / 0233 / 0266 / 0267 / 0268 / 0269 / 0270 / 0271 / 0272 / 0273 / 0274 / 0275 / 0276 / 0277 / 0278 / 0279 / 0280 / 0281 / 0282 / 0283 / 0284 / 0285 / 0286 / 0287 / 0288 / 0289 / 0290 / 0291 / 0292 / 0293 / 0294 / 0295 / 0296 / 0297 / 0298 / 0299 / 0300 / 0301 / 0302 / 0303 / 0304 / 0305 / 0306 / 0307 / 0308 / 0309 / 0310 / 0311 / 0312) are computed in `lineageweave/leftover_pairs.py` from the
+0163 / 0164 / 0182 / 0185 / 0201 / 0233 / 0266 / 0267 / 0268 / 0269 / 0270 / 0271 / 0272 / 0273 / 0274 / 0275 / 0276 / 0277 / 0278 / 0279 / 0280 / 0281 / 0282 / 0283 / 0284 / 0285 / 0286 / 0287 / 0288 / 0289 / 0290 / 0291 / 0292 / 0293 / 0294 / 0295 / 0296 / 0297 / 0298 / 0299 / 0300 / 0301 / 0302 / 0303 / 0304 / 0305 / 0306 / 0307 / 0308 / 0309 / 0310 / 0311 / 0312 / 0313) are computed in `lineageweave/leftover_pairs.py` from the
residual after a real GRM/GPCM score, never invented. Distances are
Euclidean on the two-dimensional Gabriel leftover map; missing cells stay
out of the factorization. Closest and farthest post–criterion pairs
@@ -561,6 +561,16 @@ and leftover-map comparison graphic incomplete items when those helpers return u
leftover-map rank, leftover-map axis share, leftover-map post coverage, leftover-map item coverage,
leftover-map incomplete post coverage, leftover-map incomplete item coverage, leftover pair
count, or the count of unused axes.
+ADR 0313 captions leftover-map cross share on that grouping comparison leftover-map
+graphic when formatLeftoverMapCrossShare returns a usable badge; a missing or
+non-finite `x` omits that leftover-map comparison graphic cross share caption and keeps
+leftover-map unexplained leftover share `s`, leftover-map explained leftover share `e`, leftover-map reconstruction `R̂`, leftover-map distance `d`, leftover-map comparison graphic coverage,
+leftover-map comparison graphic item coverage, leftover-map comparison graphic incomplete posts,
+and leftover-map comparison graphic incomplete items when those helpers return usable integers. Do not invent
+`x` from `R̂`, `U`, and `R`, leftover-map reconstruction, leftover residual, leftover-map distance, plotted coordinates,
+leftover-map rank, leftover-map axis share, leftover-map post coverage, leftover-map item coverage,
+leftover-map incomplete post coverage, leftover-map incomplete item coverage, leftover pair
+count, or the count of unused axes.
When `R`, `R̂`, `U`, `x`,
`s`, and `e` are finite, `e + s + x = 1`. When `Y`, `E`, and `R` are
finite, `Y − E = R`. When `R`, `R̂`, and `U` are
@@ -632,6 +642,9 @@ share `e` when formatLeftoverMapExplainedShare returns a usable badge.
Grouping comparison leftover-map unexplained leftover share (ADR 0312) captions
that grouping comparison leftover-map graphic with persisted leftover-map unexplained leftover
share `s` when formatLeftoverMapUnexplainedShare returns a usable badge.
+Grouping comparison leftover-map cross share (ADR 0313) captions
+that grouping comparison leftover-map graphic with persisted leftover-map cross
+share `x` when formatLeftoverMapCrossShare returns a usable badge.
Item complete-case coverage
(ADR 0282) captions the leftover-map graphic with how many scored criteria
entered the map. Item complete-case coverage on the pair list (ADR 0285)
diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md
index 345a19373..89042daed 100644
--- a/ARCHITECTURE.md
+++ b/ARCHITECTURE.md
@@ -725,6 +725,9 @@ badge.
ADR 0312 captions leftover-map unexplained leftover share on that grouping
comparison leftover-map graphic when formatLeftoverMapUnexplainedShare returns a usable
badge.
+ADR 0313 captions leftover-map cross share on that grouping
+comparison leftover-map graphic when formatLeftoverMapCrossShare returns a usable
+badge.
Click a post marker or a pair button
opens that post. Those ADRs are the normative mathematical, storage, and
display contracts. Leftover-map axis share
@@ -766,7 +769,8 @@ and leftover-map incomplete item coverage on the grouping comparison leftover-ma
graphic (ADR 0309), leftover-map reconstruction on the grouping comparison leftover-map
graphic (ADR 0310), leftover-map explained leftover share on the grouping comparison leftover-map
graphic (ADR 0311), leftover-map unexplained leftover share on the grouping comparison leftover-map
-graphic (ADR 0312);
+graphic (ADR 0312), leftover-map cross share on the grouping comparison leftover-map
+graphic (ADR 0313);
`POST .../rebuild` scores every grouping kind (post_admin). `make seed`
folds A-100/B-200 Event Lineage fixtures (and the Riverbend calendar
post) that already have constructed IRT cells into the same shared
diff --git a/CHANGELOG.d/2.70.0-leftover-map-compare-plot-cross-share.md b/CHANGELOG.d/2.70.0-leftover-map-compare-plot-cross-share.md
new file mode 100644
index 000000000..aa8544a10
--- /dev/null
+++ b/CHANGELOG.d/2.70.0-leftover-map-compare-plot-cross-share.md
@@ -0,0 +1,36 @@
+## 2.70.0 — Leftover-map cross share on grouping comparison leftover-map graphic
+
+- Caption leftover-map cross share on the grouping comparison leftover-map
+ graphic (ADR 0313). After `make seed`, closest and farthest leftover pairs
+ sit above the member list with the Gabriel biplot of already-named
+ coordinates, leftover-map axis share when finite, leftover-map complete-case
+ coverage when leftoverMapCoverageCounts returns usable complete-case integers,
+ leftover-map item complete-case coverage when leftoverMapItemCoverageCounts
+ returns usable complete-case integers, leftover-map incomplete post coverage
+ when leftoverMapIncompletePostCount returns a usable dropped integer,
+ leftover-map incomplete item coverage when leftoverMapIncompleteItemCount
+ returns a usable dropped integer, leftover-map reconstruction `R̂` when
+ formatLeftoverMapReconstruction returns a usable signed badge, leftover-map
+ explained leftover share `e` when formatLeftoverMapExplainedShare returns a
+ usable badge, leftover-map unexplained leftover share `s` when
+ formatLeftoverMapUnexplainedShare returns a usable badge, and leftover-map
+ cross share `x` on that grouping comparison leftover-map graphic; click a
+ post marker or a pair button opens that post. A missing or non-finite `x`
+ omits that leftover-map comparison graphic cross share caption and keeps
+ leftover-map unexplained leftover share `s`, leftover-map explained leftover
+ share `e`, leftover-map reconstruction `R̂`, leftover-map distance `d`, leftover-map
+ comparison graphic coverage, leftover-map comparison graphic item coverage,
+ leftover-map comparison graphic incomplete posts, and leftover-map comparison
+ graphic incomplete items when those helpers return usable integers. Rank-0 origin
+ cells still name `2R̂U/R² 0.00` when that persisted leftover-map cross share is
+ finite. Comparison copy uses `leftover map comparison graphic cross
+ share {label}` so it stays distinct from hyphen `leftover-map cross
+ share {label}` and from strip `Leftover map comparison cross share`.
+ This increment does not caption leftover-map unexplained leftover on the comparison graphic
+ with a distinct name. Do not invent `x` from `R̂`, `U`, and `R`, leftover-map reconstruction,
+ leftover residual, leftover-map distance, plotted coordinates, leftover-map rank,
+ leftover-map axis share, leftover-map post coverage, leftover-map item coverage,
+ leftover-map incomplete post coverage, leftover-map incomplete item coverage,
+ leftover pair count, or the count of unused axes. A share greater than 1 is shown,
+ never clamped. A finite negative leftover-map cross share is shown, never clamped.
+ Never invent a leftover score. Never invent a theta. No new columns.
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 57ffd1848..dd54be1bb 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -8,6 +8,46 @@ All notable changes to this project are documented here. Format follows
### Added
+- Period leftover pairs now name leftover-map cross share on the grouping
+ comparison leftover-map graphic (ADR 0313 / v2.70.0). After `make seed`,
+ closest and farthest leftover pairs sit above the member list with the
+ Gabriel biplot of already-named coordinates, leftover-map axis share when
+ finite, leftover-map complete-case coverage when leftoverMapCoverageCounts
+ returns usable complete-case integers, leftover-map item complete-case
+ coverage when leftoverMapItemCoverageCounts returns usable complete-case
+ integers, leftover-map incomplete post coverage when leftoverMapIncompletePostCount
+ returns a usable dropped integer, leftover-map incomplete item coverage when
+ leftoverMapIncompleteItemCount returns a usable dropped integer, leftover-map
+ reconstruction `R̂` when formatLeftoverMapReconstruction returns a usable signed
+ badge, leftover-map explained leftover share `e` when formatLeftoverMapExplainedShare
+ returns a usable badge, leftover-map unexplained leftover share `s` when
+ formatLeftoverMapUnexplainedShare returns a usable badge, and leftover-map
+ cross share `x` on that grouping comparison leftover-map graphic when
+ formatLeftoverMapCrossShare returns a usable badge; click a post marker or a pair
+ button opens that post. A missing or non-finite `x` omits that leftover-map
+ comparison graphic cross share caption and keeps leftover-map unexplained leftover
+ share `s`, leftover-map explained leftover share `e`, leftover-map reconstruction
+ `R̂`, leftover-map distance `d`, leftover-map comparison graphic coverage,
+ leftover-map comparison graphic item coverage, leftover-map comparison graphic
+ incomplete posts, and leftover-map comparison graphic incomplete items when those
+ helpers return usable integers. Rank-0 origin cells still plot at `(0, 0)` and
+ still name `2R̂U/R² 0.00` when that persisted leftover-map cross share is finite.
+ Comparison copy uses `leftover map comparison graphic cross share {label}` so it
+ stays distinct from hyphen `leftover-map cross share {label}` and from strip
+ `Leftover map comparison cross share`. Leftover-map cross share omits independently
+ of leftover-map unexplained leftover share, leftover-map explained leftover share,
+ leftover-map reconstruction, leftover-map distance, and coverage notes. This
+ increment does not caption leftover-map unexplained leftover on the comparison
+ graphic with a distinct name. Do not invent `x` from `R̂`, `U`, and `R`, leftover-map
+ reconstruction, leftover residual, leftover-map distance, plotted coordinates,
+ leftover-map rank, leftover-map axis share, leftover expected, leftover observed,
+ leftover-map post coverage, leftover-map item coverage, leftover-map incomplete
+ post coverage, leftover-map incomplete item coverage, leftover pair count, or the
+ count of unused axes. A share greater than 1 is shown, never clamped. A finite
+ negative leftover-map cross share is shown, never clamped. Omit the comparison
+ graphic when no leftover pair has four finite leftover-map coordinates. Never
+ invent a leftover score or a theta. No new columns.
+
- Period leftover pairs now name leftover-map unexplained leftover share on the grouping
comparison leftover-map graphic (ADR 0312 / v2.69.0). After `make seed`,
closest and farthest leftover pairs sit above the member list with the
diff --git a/CLAUDE.md b/CLAUDE.md
index f5afa7ee9..da0e7f047 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -49,7 +49,7 @@ cutoff. Global Ask optional `knowledge_cutoff` uses the same cover
Create/start endpoint rules (ADR 0017 / 0021), tie-vs-miss similarity
(ADR 0026), R&R catalog ids (ADR 0019 / 0027), leftover pairs
-(ADR 0048–0164 / 0182 / 0185 / 0201 / 0233 / 0266 / 0267 / 0268 / 0269 / 0270 / 0271 / 0272 / 0273 / 0274 / 0275 / 0276 / 0277 / 0278 / 0279 / 0280 / 0281 / 0282 / 0283 / 0284 / 0285 / 0286 / 0287 / 0288 / 0289 / 0290 / 0291 / 0292 / 0293 / 0294 / 0295 / 0296 / 0297 / 0298 / 0299 / 0300 / 0301 / 0302 / 0303 / 0304 / 0305 / 0306 / 0307 / 0308 / 0309 / 0310 / 0311 / 0312), occupational construct catalog search
+(ADR 0048–0164 / 0182 / 0185 / 0201 / 0233 / 0266 / 0267 / 0268 / 0269 / 0270 / 0271 / 0272 / 0273 / 0274 / 0275 / 0276 / 0277 / 0278 / 0279 / 0280 / 0281 / 0282 / 0283 / 0284 / 0285 / 0286 / 0287 / 0288 / 0289 / 0290 / 0291 / 0292 / 0293 / 0294 / 0295 / 0296 / 0297 / 0298 / 0299 / 0300 / 0301 / 0302 / 0303 / 0304 / 0305 / 0306 / 0307 / 0308 / 0309 / 0310 / 0311 / 0312 / 0313), occupational construct catalog search
(ADR 0257), the text-channel embedding swap and cosine
clamp (ADR 0190), per-edge channel-score persistence (ADR 0195),
token-backed status notices (ADR 0220),
diff --git a/docs/adr/0275-leftover-map-segment-cross-share.md b/docs/adr/0275-leftover-map-segment-cross-share.md
index c80b19fb6..5b1414655 100644
--- a/docs/adr/0275-leftover-map-segment-cross-share.md
+++ b/docs/adr/0275-leftover-map-segment-cross-share.md
@@ -3,7 +3,9 @@
**Decision status:** Accepted
**Date:** 2026-08-29
**Amended by:** [ADR 0276](0276-leftover-map-segment-unexplained-leftover.md)
-(leftover-map unexplained leftover on pair segments)
+(leftover-map unexplained leftover on pair segments);
+[ADR 0313](0313-leftover-map-compare-plot-cross-share.md)
+(leftover-map cross share on the grouping comparison leftover-map graphic)
Amends [ADR 0268](0268-leftover-map-graphic-display.md),
[ADR 0049](0049-leftover-pair-report-ui.md), and leftover-map cross share
diff --git a/docs/adr/0296-leftover-map-compare-cross-share.md b/docs/adr/0296-leftover-map-compare-cross-share.md
index 275543772..e9b479d49 100644
--- a/docs/adr/0296-leftover-map-compare-cross-share.md
+++ b/docs/adr/0296-leftover-map-compare-cross-share.md
@@ -3,6 +3,9 @@
**Decision status:** Accepted
**Date:** 2026-08-31
+**Amended by:** [ADR 0313](0313-leftover-map-compare-plot-cross-share.md)
+(leftover-map cross share on the grouping comparison leftover-map graphic)
+
Amends leftover pairs on the grouping comparison strip
([ADR 0149](0149-leftover-pairs-on-comparison-strip.md)), leftover-map
cross share persistence
diff --git a/docs/adr/0312-leftover-map-compare-plot-unexplained-share.md b/docs/adr/0312-leftover-map-compare-plot-unexplained-share.md
index d62452b34..3fef8a704 100644
--- a/docs/adr/0312-leftover-map-compare-plot-unexplained-share.md
+++ b/docs/adr/0312-leftover-map-compare-plot-unexplained-share.md
@@ -3,6 +3,9 @@
**Decision status:** Accepted
**Date:** 2026-08-31
+**Amended by:** [ADR 0313](0313-leftover-map-compare-plot-cross-share.md)
+(leftover-map cross share on the grouping comparison leftover-map graphic)
+
Amends leftover-map unexplained leftover share on graphic-display pair segments
([ADR 0274](0274-leftover-map-segment-unexplained-share.md)), leftover-map
unexplained leftover share on grouping comparison strip pair rows
diff --git a/docs/adr/0313-leftover-map-compare-plot-cross-share.md b/docs/adr/0313-leftover-map-compare-plot-cross-share.md
new file mode 100644
index 000000000..70908056e
--- /dev/null
+++ b/docs/adr/0313-leftover-map-compare-plot-cross-share.md
@@ -0,0 +1,276 @@
+# ADR 0313 — Name leftover-map cross share on the grouping comparison leftover-map graphic
+
+**Decision status:** Accepted
+**Date:** 2026-08-31
+
+Amends leftover-map cross share on graphic-display pair segments
+([ADR 0275](0275-leftover-map-segment-cross-share.md)), leftover-map
+cross share on grouping comparison strip pair rows
+([ADR 0296](0296-leftover-map-compare-cross-share.md)), leftover-map
+unexplained leftover share on the grouping comparison leftover-map graphic
+([ADR 0312](0312-leftover-map-compare-plot-unexplained-share.md)), leftover-map
+explained leftover share on the grouping comparison leftover-map graphic
+([ADR 0311](0311-leftover-map-compare-plot-explained-share.md)), leftover-map
+reconstruction on the grouping comparison leftover-map graphic
+([ADR 0310](0310-leftover-map-compare-plot-reconstruction.md)), leftover-map
+incomplete item coverage on the grouping comparison leftover-map graphic
+([ADR 0309](0309-leftover-map-compare-plot-incomplete-item.md)), leftover-map
+incomplete post coverage on the grouping comparison leftover-map graphic
+([ADR 0308](0308-leftover-map-compare-plot-incomplete-post.md)), leftover-map item
+complete-case coverage on the grouping comparison leftover-map graphic
+([ADR 0307](0307-leftover-map-compare-plot-item-coverage.md)), leftover-map
+complete-case coverage on the grouping comparison leftover-map graphic
+([ADR 0306](0306-leftover-map-compare-plot-coverage.md)), leftover-map axis share
+on the grouping comparison leftover-map graphic
+([ADR 0305](0305-leftover-map-compare-plot-axis-share.md)), leftover-map graphic
+display on the grouping comparison strip
+([ADR 0304](0304-leftover-map-compare-graphic.md)), leftover-map cross share
+persistence ([ADR 0185](0185-leftover-map-cross-share.md)), leftover pairs on
+the grouping comparison strip
+([ADR 0149](0149-leftover-pairs-on-comparison-strip.md)), leftover-map
+coordinates on the compare leftover-pair payload
+([ADR 0303](0303-leftover-map-compare-coordinates-payload.md)), leftover-map
+coordinates on grouping comparison strip pair rows
+([ADR 0302](0302-leftover-map-compare-coordinates.md)), leftover-map
+rank on grouping comparison strip pair rows
+([ADR 0301](0301-leftover-map-compare-rank.md)), leftover expected on grouping
+comparison strip pair rows
+([ADR 0300](0300-leftover-map-compare-expected.md)), leftover observed on
+grouping comparison strip pair rows
+([ADR 0299](0299-leftover-map-compare-observed.md)), leftover residual
+on grouping comparison strip pair rows
+([ADR 0298](0298-leftover-map-compare-residual.md)), leftover-map unexplained leftover
+on grouping comparison strip pair rows
+([ADR 0297](0297-leftover-map-compare-unexplained.md)), leftover-map unexplained
+leftover share on grouping comparison strip pair rows
+([ADR 0295](0295-leftover-map-compare-unexplained-share.md)), leftover-map
+reconstruction on grouping comparison strip pair rows
+([ADR 0293](0293-leftover-map-compare-reconstruction.md)), leftover-map
+incomplete item coverage on the grouping comparison strip
+([ADR 0292](0292-leftover-map-compare-incomplete-item.md)), leftover-map
+incomplete post coverage on the grouping comparison strip
+([ADR 0291](0291-leftover-map-compare-incomplete-post.md)), leftover-map item
+complete-case coverage on the grouping comparison strip
+([ADR 0290](0290-leftover-map-compare-item-coverage.md)), leftover-map
+complete-case coverage on the grouping comparison strip
+([ADR 0289](0289-leftover-map-compare-coverage.md)), leftover residual
+disclosure ([ADR 0162](0162-leftover-residual-disclosure.md)), leftover
+observed `Y` / expected `E` ([ADR 0163](0163-leftover-observed-expected.md)), leftover-map unexplained leftover persistence ([ADR 0182](0182-leftover-map-unexplained.md)),
+leftover-map rank ([ADR 0164](0164-leftover-map-rank.md)), leftover-map rank on pair
+segments ([ADR 0280](0280-leftover-map-segment-rank.md)), leftover-map coordinate ticks
+([ADR 0270](0270-leftover-map-coordinate-ticks.md)), leftover-map graphic display
+([ADR 0268](0268-leftover-map-graphic-display.md)), leftover-map axis share on
+the graphic display ([ADR 0269](0269-leftover-map-axis-share-plot.md)), leftover-map
+complete-case coverage on the graphic display
+([ADR 0281](0281-leftover-map-plot-coverage.md)), leftover-map item complete-case
+coverage on the graphic display
+([ADR 0282](0282-leftover-map-plot-item-coverage.md)), leftover-map incomplete
+post coverage on the graphic display
+([ADR 0283](0283-leftover-map-plot-incomplete.md)), leftover-map incomplete
+item coverage on the graphic display
+([ADR 0284](0284-leftover-map-plot-incomplete-item.md)), leftover-map reconstruction
+on pair segments ([ADR 0272](0272-leftover-map-segment-reconstruction.md)), leftover-map
+reconstruction persistence ([ADR 0201](0201-leftover-map-reconstruction.md)), leftover-map unexplained leftover share persistence
+([ADR 0233](0233-leftover-map-unexplained-share.md)), leftover-map explained leftover
+share persistence ([ADR 0266](0266-leftover-map-explained-share.md)), and leftover-map coordinates
+([ADR 0267](0267-leftover-map-coordinates.md)). Independent of leftover-map
+post complete-case coverage fail-closed on the pair list
+([ADR 0288](0288-leftover-map-list-post-coverage-helper.md)), leftover-map
+incomplete item coverage on the pair list
+([ADR 0287](0287-leftover-map-list-incomplete-item.md)), leftover-map incomplete
+post coverage on the pair list
+([ADR 0286](0286-leftover-map-list-incomplete-post.md)), leftover-map item
+complete-case coverage on the pair list
+([ADR 0285](0285-leftover-map-list-item-coverage.md)), leftover expected on pair
+segments ([ADR 0279](0279-leftover-map-segment-expected.md)), leftover observed
+on pair segments ([ADR 0278](0278-leftover-map-segment-observed.md)), leftover
+residual on pair segments ([ADR 0277](0277-leftover-map-segment-residual.md)),
+leftover-map unexplained leftover on pair segments
+([ADR 0276](0276-leftover-map-segment-unexplained-leftover.md)), leftover-map
+unexplained leftover share on pair segments
+([ADR 0274](0274-leftover-map-segment-unexplained-share.md)), leftover-map
+distance on pair segments ([ADR 0271](0271-leftover-map-segment-distance.md)), leftover-map
+explained leftover share on pair segments
+([ADR 0273](0273-leftover-map-segment-explained-share.md)), leftover-map
+unexplained leftover share on grouping comparison strip pair rows
+([ADR 0295](0295-leftover-map-compare-unexplained-share.md)), and leftover-map
+unexplained leftover on the grouping comparison leftover-map graphic.
+
+## Context
+
+ADR 0185 already persists leftover-map cross share
+`x = 2 R̂ U / R²` of raw residual after two-axis Gabriel reconstruction.
+ADR 0275 already captions period-report leftover-map pair segments with
+`leftover-map cross share {label}` when that leftover-map cross share is
+finite. ADR 0296 already captions grouping comparison leftover-pair
+buttons with that same persisted leftover-map cross share under accessible name
+`Leftover map comparison cross share`. ADR 0312 already captions
+leftover-map unexplained leftover share on the grouping comparison leftover-map graphic.
+The comparison graphic still reuses hyphen
+`leftover-map cross share {label}`, so a buyer who compares leftover
+pairs can treat the period-report graphic caption as the comparison graphic
+leftover-map cross share even after the strip names `x`. Hiding a distinct
+comparison-graphic leftover-map cross share caption lets leftover-map
+unexplained leftover share `s` or leftover residual `R` be read as leftover-map
+cross share without a next action. When `R`, `R̂`, `U`, `x`, `s`,
+and `e` are finite, `e + s + x = 1`; the comparison graphic must name the same
+persisted `x` the pair row and strip already show.
+
+This increment captions leftover-map cross share on the grouping
+comparison leftover-map graphic from already-named leftover-map cross
+share through formatLeftoverMapCrossShare. Comparison copy uses the accessible
+name `leftover map comparison graphic cross share {label}` so it stays
+distinct from hyphen `leftover-map cross share {label}` on the
+period-report graphic and from strip `Leftover map comparison cross share`.
+It does not add columns. It does not recompute leftover-map cross share
+from `R̂`, `U`, and `R`, leftover-map reconstruction, leftover residual, leftover-map distance,
+plotted coordinates, leftover-map rank, leftover-map axis share, leftover-map post
+coverage, leftover-map item coverage, leftover-map incomplete post coverage,
+leftover-map incomplete item coverage, leftover pair count, or the count of unused
+axes. Do not invent a leftover score. Do not invent a theta.
+
+The dashboard stack already used neighbouring leftover facts under other
+numbers. This protected increment uses **0313** so it does not collide with
+leftover-map unexplained leftover share on the grouping comparison leftover-map graphic
+(0312), leftover-map explained leftover share on the grouping comparison leftover-map graphic
+(0311), leftover-map reconstruction on the grouping comparison leftover-map graphic
+(0310), leftover-map incomplete item coverage on the grouping comparison leftover-map
+graphic (0309), leftover-map incomplete post coverage on the grouping comparison leftover-map
+graphic (0308), leftover-map item complete-case coverage on the grouping comparison leftover-map
+graphic (0307), leftover-map complete-case coverage on the grouping comparison
+leftover-map graphic (0306), leftover-map axis share on the grouping comparison leftover-map
+graphic (0305), leftover-map graphic display on the grouping comparison strip
+(0304), leftover-map cross share on grouping comparison strip pair rows
+(0296), leftover-map cross share on pair segments (0275), leftover-map
+cross share persistence (0185), leftover-map graphic display (0268), leftover-map
+coordinates (0267), or the dashboard stacks.
+
+## Decision
+
+On the grouping comparison leftover-map graphic, caption each pair segment
+with persisted leftover-map cross share when formatLeftoverMapCrossShare
+returns a usable badge, next to leftover-map unexplained leftover share `s`. Use the
+distinct accessible name `leftover map comparison graphic cross share {label}`
+so the graphic caption is not the strip badge (`Leftover map comparison cross share`)
+and is not the period-report graphic caption (`leftover-map cross share {label}`).
+A missing or non-finite `x` omits that leftover-map comparison graphic
+cross share caption and keeps leftover-map unexplained leftover share `s` when
+formatLeftoverMapUnexplainedShare returns a usable badge, leftover-map explained leftover share `e` when
+formatLeftoverMapExplainedShare returns a usable badge, leftover-map reconstruction `R̂` when
+formatLeftoverMapReconstruction returns a usable signed badge, leftover-map distance `d`, leftover map comparison
+axis share when finite, leftover map comparison axis text, leftover-map comparison
+graphic coverage when leftoverMapCoverageCounts returns usable complete-case
+integers, leftover-map comparison graphic item coverage when leftoverMapItemCoverageCounts
+returns usable complete-case integers, leftover-map comparison graphic incomplete
+posts when leftoverMapIncompletePostCount returns a usable dropped integer,
+leftover-map comparison graphic incomplete items when leftoverMapIncompleteItemCount
+returns a usable dropped integer, leftover-map rank when that rank is a non-negative
+integer, leftover expected `E` when finite, leftover observed `Y` when finite,
+leftover residual `R` when finite, leftover-map unexplained leftover `U` when
+finite, leftover-map reconstruction `R̂` when
+finite, leftover-map distance `d`, plus the strip leftover-map cross share badge.
+Rank-0 origin cells still name `2R̂U/R² 0.00` when that persisted leftover-map
+cross share is finite. A share greater than 1 is shown, never clamped. A finite
+negative leftover-map cross share is shown, never clamped. Do not invent `x` from
+`R̂`, `U`, and `R`, leftover-map reconstruction, leftover residual, leftover-map distance,
+plotted coordinates, leftover-map rank, leftover-map axis share, leftover-map post
+coverage, leftover-map item coverage, leftover-map incomplete post coverage,
+leftover-map incomplete item coverage, leftover pair count, or the count of unused
+axes. Click a post marker to open that post.
+
+Leftover-map cross share omits independently of unexplained leftover share captions,
+explained leftover share captions, reconstruction captions, coverage notes, and leftover-map distance. A missing leftover-map
+cross share omits leftover-map comparison graphic cross share and keeps
+a usable unexplained leftover share caption, a usable explained leftover share caption, a usable reconstruction caption, a usable
+distance caption, a usable post caption, a usable item caption, a usable incomplete
+posts caption, and a usable incomplete items caption.
+
+This increment does not caption leftover-map unexplained leftover on the comparison graphic
+with a distinct comparison-graphic name. That leftover-map unexplained leftover already sits on
+the strip through ADR 0297. A finite negative leftover on neighbouring fields is shown,
+never clamped.
+
+Do not add SQL migrations. Do not edit shipped migrations. Do not persist inner
+product, cosine, or length as separate columns. Do not invent a leftover
+score. Do not invent a theta.
+
+## Consequences
+
+After `make seed`, grouping comparison leftover pairs that already show
+the leftover-map graphic of persisted `ξ` / `ζ` also name leftover-map
+cross share on that graphic when formatLeftoverMapCrossShare
+returns a usable badge. Rank-0 unused axes still plot at
+the origin and still name `2R̂U/R² 0.00` when that persisted leftover-map
+cross share is finite. Click a post marker or a pair button opens that post. Hidden posts
+stay hidden. When `Y`, `E`, and `R` are finite, `Y − E = R`. When `R`, `R̂`,
+and `U` are finite, `U + R̂ = R`. When `R`, `R̂`, `U`, `x`, `s`, and `e` are
+finite, `e + s + x = 1`. When coordinates, reconstruction, and distance
+are finite, `R̂ = ξ · ζ` and `d = ‖ξ − ζ‖`.
+
+## Related
+
+Independent of leftover interaction-map persistence, leftover-criterion
+evaluation landing, leftover residual disclosure, leftover-map
+complete-case coverage persistence, leftover pairs on the grouping comparison
+strip, leftover-map complete-case coverage on the grouping comparison strip,
+leftover-map item complete-case coverage on the grouping comparison strip,
+leftover-map incomplete post coverage on the grouping comparison strip,
+leftover-map incomplete item coverage on the grouping comparison strip,
+leftover-map reconstruction on grouping comparison strip pair rows,
+leftover-map explained leftover share on grouping comparison strip pair rows,
+leftover-map unexplained leftover share on grouping comparison strip pair rows,
+leftover-map cross share on grouping comparison strip pair rows,
+leftover-map unexplained leftover on grouping comparison strip pair rows,
+leftover residual on grouping comparison strip pair rows, leftover observed
+on grouping comparison strip pair rows, leftover expected on grouping
+comparison strip pair rows, leftover-map rank on grouping comparison strip
+pair rows, leftover-map coordinates on grouping comparison strip pair rows,
+leftover-map coordinates on the compare leftover-pair payload, leftover-map
+inner product, leftover-map cosine, leftover-map length, leftover residual
+on pair segments, leftover observed on pair segments, leftover expected on
+pair segments, leftover-map rank on pair segments, leftover-map unexplained
+leftover on pair segments, leftover-map unexplained leftover persistence,
+leftover-map cross share on pair segments, leftover-map cross share
+persistence, leftover-map unexplained leftover share on pair segments,
+leftover-map unexplained leftover share persistence, leftover-map explained leftover
+share on pair segments, leftover-map explained leftover share
+persistence, leftover-map reconstruction on pair segments, leftover-map
+reconstruction persistence, leftover-map reconstruction on the grouping
+comparison leftover-map graphic, leftover-map explained leftover share on the grouping
+comparison leftover-map graphic, leftover-map unexplained leftover share on the grouping
+comparison leftover-map graphic, leftover-map item complete-case coverage on the
+graphic display, leftover-map item complete-case coverage on the pair list,
+leftover-map incomplete post coverage on the graphic display, leftover-map
+incomplete post coverage on the pair list, leftover-map incomplete item
+coverage on the graphic display, leftover-map incomplete item coverage on
+the pair list, leftover-map post complete-case coverage fail-closed on the
+pair list, leftover-map rank persistence, leftover-map coordinate
+persistence, leftover-map coordinate ticks, leftover-map complete-case
+coverage on the graphic display, leftover-map complete-case coverage on the
+grouping comparison leftover-map graphic, leftover-map item complete-case
+coverage on the grouping comparison leftover-map graphic, leftover-map
+incomplete post coverage on the grouping comparison leftover-map graphic,
+leftover-map incomplete item coverage on the grouping comparison leftover-map
+graphic, leftover-map axis share on the grouping comparison leftover-map graphic,
+and leftover-map unexplained leftover on the grouping comparison leftover-map graphic.
+
+## References
+
+Jeon, M., Jin, I. H., Schweinberger, M., & Baugh, S. (2021). Mapping
+unobserved item–respondent interactions: A latent space item response
+model with interaction map. *Psychometrika, 86*(2), 378–403.
+https://doi.org/10.1007/s11336-021-09762-5
+(LSIRM interaction `−γ‖ξ_j − ζ_i‖` after main effects
+`α_j − β_i`; typically `p = 2` for the interaction map. Gabriel
+reconstruction of the leftover cell is the two-axis inner product
+`R̂ = ξ_{1:2} · ζ_{1:2}`. Unexplained leftover is `U = R − R̂`. Cross share of
+raw residual is `x = 2 R̂ U / R²`. Grouping comparison leftover-map
+cross share captions that persisted share on the grouping comparison leftover-map
+graphic only when formatLeftoverMapCrossShare returns a usable badge.
+Rank-0 unused axes still name `2R̂U/R² 0.00` when that leftover-map
+cross share is stored. A share greater than 1 is shown, never clamped. A finite
+negative leftover-map cross share is shown, never clamped.)
+
+Gabriel, K. R. (1971). The biplot graphic display of matrices with
+application to principal component analysis. *Biometrika, 58*(3),
+453–467. https://doi.org/10.1093/biomet/58.3.453
diff --git a/docs/product-technical-gap-baseline.md b/docs/product-technical-gap-baseline.md
index efd30b5ec..10cbc8584 100644
--- a/docs/product-technical-gap-baseline.md
+++ b/docs/product-technical-gap-baseline.md
@@ -1,5 +1,24 @@
# Product & Technical Gap Baseline
+> Exact-head loop overlay: 2026-08-31 07:08 KST. Protected `main` is
+> `cb187cadee5fb6c46d8a944815ccc154a1e028d1`. Writes work. Do not
+> self-approve. #852 leftover-map unexplained leftover share on the grouping comparison leftover-map
+> graphic (v2.69.0 / ADR 0312) is `2c34896`, stacked on #851 @ `2d6e8e7`. Independent
+> APPROVE is missing; Copilot review requested this cycle. Next buyer increment on this
+> cycle: leftover-map cross share on the grouping comparison leftover-map
+> graphic (ADR 0313 / v2.70.0) delivered locally on
+> `feat/leftover-map-compare-plot-cross-share-v2700`. Caption persisted leftover-map
+> cross share `x` on that comparison graphic from already-named
+> leftover_map_cross_share. Distinct accessible name `leftover map comparison graphic
+> cross share {label}`. Omit when formatLeftoverMapCrossShare fail-closes.
+> Do not caption leftover-map unexplained leftover on that comparison graphic with a distinct name this
+> increment. Do not invent `x` from `R̂`, `U`, and `R`, leftover-map reconstruction, leftover residual,
+> leftover-map distance, plotted coordinates, leftover-map rank, leftover-map axis share,
+> leftover-map post coverage, leftover-map item coverage, leftover-map incomplete post coverage,
+> leftover-map incomplete item coverage, leftover pair count, or the count of unused
+> axes. Stack onto #852. Leave open for independent review. Do not squash-merge. Do not
+> self-approve. Issues #79 and #87 stay open. Do not merge #808 without independent APPROVE.
+
> Exact-head loop overlay: 2026-08-31 06:45 KST. Protected `main` is
> `cb187cadee5fb6c46d8a944815ccc154a1e028d1`. Writes work. Do not
> self-approve. #851 leftover-map explained leftover share on the grouping comparison leftover-map
diff --git a/frontend/package.json b/frontend/package.json
index 8258f7155..aa653335c 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -1,7 +1,7 @@
{
"name": "frontend",
"private": true,
- "version": "2.69.0",
+ "version": "2.70.0",
"type": "module",
"scripts": {
"dev": "vite",
diff --git a/frontend/src/App.test.tsx b/frontend/src/App.test.tsx
index 4c3331787..fd839ee5b 100644
--- a/frontend/src/App.test.tsx
+++ b/frontend/src/App.test.tsx
@@ -4528,11 +4528,16 @@ describe("App, authenticated", () => {
"Leftover map comparison unexplained leftover share",
),
).toHaveLength(1);
+ expect(
+ within(screen.getByLabelText("Grouping comparison")).getByLabelText(
+ "leftover map comparison graphic cross share 2R̂U/R² 0.12",
+ ),
+ ).toHaveTextContent("2R̂U/R² 0.12");
expect(
within(screen.getByLabelText("Grouping comparison")).queryByLabelText(
/leftover-map cross share/,
),
- ).toHaveTextContent("2R̂U/R² 0.12");
+ ).not.toBeInTheDocument();
expect(
within(screen.getByLabelText("Grouping comparison")).getByLabelText(
"Leftover map comparison cross share",
diff --git a/frontend/src/components/LeftoverMapPlot.test.tsx b/frontend/src/components/LeftoverMapPlot.test.tsx
index 80f6f7691..e39b5bd10 100644
--- a/frontend/src/components/LeftoverMapPlot.test.tsx
+++ b/frontend/src/components/LeftoverMapPlot.test.tsx
@@ -1575,4 +1575,144 @@ describe("LeftoverMapPlot", () => {
);
expect(screen.getByText("leftover map comparison axis 1 (0%)")).toBeInTheDocument();
});
+
+ it("names leftover-map cross share on the comparison graphic with a distinct accessible name", () => {
+ render(
+ ,
+ );
+ expect(
+ screen.getByLabelText("leftover map comparison graphic cross share 2R̂U/R² 0.12"),
+ ).toHaveTextContent("2R̂U/R² 0.12");
+ expect(
+ screen.getByLabelText("leftover map comparison graphic cross share 2R̂U/R² -0.24"),
+ ).toHaveTextContent("2R̂U/R² -0.24");
+ expect(screen.queryByLabelText("leftover-map cross share 2R̂U/R² 0.12")).not.toBeInTheDocument();
+ expect(screen.queryByLabelText("leftover-map cross share 2R̂U/R² -0.24")).not.toBeInTheDocument();
+ expect(screen.queryByLabelText("Leftover map comparison cross share")).not.toBeInTheDocument();
+ expect(
+ screen.getByLabelText("leftover map comparison graphic unexplained leftover share U²/R² 0.02"),
+ ).toHaveTextContent("U²/R² 0.02");
+ expect(
+ screen.getByLabelText("leftover map comparison graphic explained leftover share R̂²/R² 0.76"),
+ ).toHaveTextContent("R̂²/R² 0.76");
+ expect(
+ screen.getByLabelText("leftover map comparison graphic reconstruction R̂ +0.25"),
+ ).toHaveTextContent("R̂ +0.25");
+ expect(screen.getByText("leftover map comparison axis 1 (82%)")).toBeInTheDocument();
+ });
+
+ it("omits leftover-map comparison graphic cross share when x is missing or not usable", () => {
+ render(
+ ,
+ );
+ expect(screen.queryByLabelText(/leftover map comparison graphic cross share/)).not.toBeInTheDocument();
+ expect(screen.queryByLabelText(/leftover-map cross share/)).not.toBeInTheDocument();
+ expect(
+ screen.getByLabelText("leftover map comparison graphic unexplained leftover share U²/R² 0.02"),
+ ).toHaveTextContent("U²/R² 0.02");
+ expect(
+ screen.getByLabelText("leftover map comparison graphic explained leftover share R̂²/R² 0.76"),
+ ).toHaveTextContent("R̂²/R² 0.76");
+ expect(
+ screen.getByLabelText("leftover map comparison graphic reconstruction R̂ +0.25"),
+ ).toBeInTheDocument();
+ expect(screen.getByLabelText("leftover-map distance d 0.12")).toBeInTheDocument();
+ expect(screen.getByLabelText("leftover-map distance d 1.84")).toBeInTheDocument();
+ expect(screen.getByLabelText("Leftover map comparison graphic coverage")).toHaveTextContent(
+ "Leftover map used 2 of 3 scored posts (complete-case)",
+ );
+ expect(screen.getByText("leftover map comparison axis 1 (82%)")).toBeInTheDocument();
+ });
+
+ it("names rank-0 origin leftover-map cross share on the comparison graphic when that persisted value is finite", () => {
+ render(
+ ,
+ );
+ expect(
+ screen.getByLabelText("leftover map comparison graphic cross share 2R̂U/R² 0.00"),
+ ).toHaveTextContent("2R̂U/R² 0.00");
+ expect(screen.queryByLabelText("leftover-map cross share 2R̂U/R² 0.00")).not.toBeInTheDocument();
+ expect(
+ screen.getByLabelText("leftover map comparison graphic unexplained leftover share U²/R² 0.00"),
+ ).toHaveTextContent("U²/R² 0.00");
+ expect(
+ screen.getByLabelText("leftover map comparison graphic explained leftover share R̂²/R² 0.00"),
+ ).toHaveTextContent("R̂²/R² 0.00");
+ expect(
+ screen.getByLabelText("leftover map comparison graphic reconstruction R̂ 0.00"),
+ ).toHaveTextContent("R̂ 0.00");
+ expect(screen.getByLabelText("Leftover map comparison graphic coverage")).toHaveTextContent(
+ "Leftover map used 0 of 3 scored posts (complete-case)",
+ );
+ expect(screen.getByText("leftover map comparison axis 1 (0%)")).toBeInTheDocument();
+ });
});
diff --git a/frontend/src/components/LeftoverMapPlot.tsx b/frontend/src/components/LeftoverMapPlot.tsx
index f7bc5d27c..9da7d36f3 100644
--- a/frontend/src/components/LeftoverMapPlot.tsx
+++ b/frontend/src/components/LeftoverMapPlot.tsx
@@ -36,6 +36,7 @@ import {
LEFTOVER_MAP_COMPARE_PLOT_SEGMENT_RECONSTRUCTION,
LEFTOVER_MAP_COMPARE_PLOT_SEGMENT_EXPLAINED_SHARE,
LEFTOVER_MAP_COMPARE_PLOT_SEGMENT_UNEXPLAINED_SHARE,
+ LEFTOVER_MAP_COMPARE_PLOT_SEGMENT_CROSS_SHARE,
LEFTOVER_MAP_PLOT_CAPTION,
LEFTOVER_MAP_PLOT_POST_ACTION,
LEFTOVER_MAP_PLOT_SEGMENT_CROSS_SHARE,
@@ -149,6 +150,9 @@ function leftoverMapPlotAxisText(
* labels. ADR 0312 captions leftover-map unexplained leftover share on that
* comparison graphic from already-named leftover-map unexplained leftover share
* with distinct leftover map comparison graphic unexplained leftover share
+ * labels. ADR 0313 captions leftover-map cross share on that
+ * comparison graphic from already-named leftover-map cross share
+ * with distinct leftover map comparison graphic cross share
* labels.
* Never invent a leftover score.
*/
@@ -366,9 +370,12 @@ export function LeftoverMapPlot({
x={segment.crossShareX}
y={segment.crossShareY}
textAnchor="middle"
- aria-label={tf(LEFTOVER_MAP_PLOT_SEGMENT_CROSS_SHARE, {
- label: segment.crossShareLabel,
- })}
+ aria-label={tf(
+ variant === "comparison"
+ ? LEFTOVER_MAP_COMPARE_PLOT_SEGMENT_CROSS_SHARE
+ : LEFTOVER_MAP_PLOT_SEGMENT_CROSS_SHARE,
+ { label: segment.crossShareLabel },
+ )}
>
{segment.crossShareLabel}
diff --git a/frontend/src/components/LeftoverPairList.tsx b/frontend/src/components/LeftoverPairList.tsx
index c1575714b..d9fccf033 100644
--- a/frontend/src/components/LeftoverPairList.tsx
+++ b/frontend/src/components/LeftoverPairList.tsx
@@ -119,6 +119,8 @@ export type LeftoverPairListProps = {
* pair list. ADR 0311 captions leftover-map explained leftover share on that
* grouping comparison leftover-map graphic, not this pair list. ADR 0312 captions leftover-map
* unexplained leftover share on that grouping comparison leftover-map graphic, not this
+ * pair list. ADR 0313 captions leftover-map
+ * cross share on that grouping comparison leftover-map graphic, not this
* pair list. Every badge still
* renders together before opening the named post.
*/
diff --git a/frontend/src/i18n.test.ts b/frontend/src/i18n.test.ts
index b6cc449b8..eb82b87fe 100644
--- a/frontend/src/i18n.test.ts
+++ b/frontend/src/i18n.test.ts
@@ -91,6 +91,7 @@ describe("i18n", () => {
"Leftover map comparison explained leftover share",
"leftover map comparison graphic unexplained leftover share {label}",
"Leftover map comparison unexplained leftover share",
+ "leftover map comparison graphic cross share {label}",
"Leftover map comparison cross share",
"Leftover map comparison unexplained leftover",
"Leftover map comparison residual",
@@ -543,6 +544,23 @@ describe("i18n", () => {
},
);
+ it.each([
+ ["ko", "잔여 지도 비교 그림 교차 점유율 2R̂U/R² 0.12"],
+ ["zh", "残差地图比较图形交叉份额 2R̂U/R² 0.12"],
+ ["ja", "残差マップの比較図交差割合 2R̂U/R² 0.12"],
+ ["vi", "phần giao đồ họa so sánh bản đồ phần dư 2R̂U/R² 0.12"],
+ ] as const)(
+ "formats leftover map comparison graphic cross share in %s",
+ (locale, expected) => {
+ setLocale(locale);
+ expect(
+ tf("leftover map comparison graphic cross share {label}", {
+ label: "2R̂U/R² 0.12",
+ }),
+ ).toBe(expected);
+ },
+ );
+
it.each([
["ko", "잔여 지도 비교 설명 잔여 점유율"],
["zh", "残差地图比较已解释残差份额"],
diff --git a/frontend/src/i18n.ts b/frontend/src/i18n.ts
index fabe619c2..2c2117c60 100644
--- a/frontend/src/i18n.ts
+++ b/frontend/src/i18n.ts
@@ -283,6 +283,7 @@ const TRANSLATIONS: Partial>> = {
"Leftover map comparison explained leftover share": "잔여 지도 비교 설명 잔여 점유율",
"leftover map comparison graphic unexplained leftover share {label}": "잔여 지도 비교 그림 미설명 잔여 점유율 {label}",
"Leftover map comparison unexplained leftover share": "잔여 지도 비교 미설명 잔여 점유율",
+ "leftover map comparison graphic cross share {label}": "잔여 지도 비교 그림 교차 점유율 {label}",
"Leftover map comparison cross share": "잔여 지도 비교 교차 점유율",
"Leftover map comparison unexplained leftover": "잔여 지도 비교 미설명 잔여",
"Leftover map comparison residual": "잔여 지도 비교 잔여",
@@ -918,6 +919,7 @@ const TRANSLATIONS: Partial>> = {
"Leftover map comparison explained leftover share": "残差地图比较已解释残差份额",
"leftover map comparison graphic unexplained leftover share {label}": "残差地图比较图形未解释残差份额 {label}",
"Leftover map comparison unexplained leftover share": "残差地图比较未解释残差份额",
+ "leftover map comparison graphic cross share {label}": "残差地图比较图形交叉份额 {label}",
"Leftover map comparison cross share": "残差地图比较交叉份额",
"Leftover map comparison unexplained leftover": "残差地图比较未解释残差",
"Leftover map comparison residual": "残差地图比较残差",
@@ -1574,6 +1576,7 @@ const TRANSLATIONS: Partial>> = {
"Leftover map comparison explained leftover share": "残差マップの比較説明済み残差割合",
"leftover map comparison graphic unexplained leftover share {label}": "残差マップの比較図未説明残差割合 {label}",
"Leftover map comparison unexplained leftover share": "残差マップの比較未説明残差割合",
+ "leftover map comparison graphic cross share {label}": "残差マップの比較図交差割合 {label}",
"Leftover map comparison cross share": "残差マップの比較交差割合",
"Leftover map comparison unexplained leftover": "残差マップの比較未説明残差",
"Leftover map comparison residual": "残差マップの比較残差",
@@ -2209,6 +2212,7 @@ const TRANSLATIONS: Partial>> = {
"Leftover map comparison explained leftover share": "Phần dư giải thích so sánh bản đồ phần dư",
"leftover map comparison graphic unexplained leftover share {label}": "phần dư chưa giải thích đồ họa so sánh bản đồ phần dư {label}",
"Leftover map comparison unexplained leftover share": "Phần dư chưa giải thích so sánh bản đồ phần dư",
+ "leftover map comparison graphic cross share {label}": "phần giao đồ họa so sánh bản đồ phần dư {label}",
"Leftover map comparison cross share": "Phần giao so sánh bản đồ phần dư",
"Leftover map comparison unexplained leftover": "Phần dư chưa giải thích so sánh",
"Leftover map comparison residual": "Phần dư so sánh bản đồ phần dư",
diff --git a/frontend/src/leftoverMapCrossShare.test.ts b/frontend/src/leftoverMapCrossShare.test.ts
index 3a224bc86..3777e7681 100644
--- a/frontend/src/leftoverMapCrossShare.test.ts
+++ b/frontend/src/leftoverMapCrossShare.test.ts
@@ -2,6 +2,7 @@ import { describe, expect, it } from "vitest";
import {
formatLeftoverMapCrossShare,
LEFTOVER_MAP_COMPARE_CROSS_SHARE_LABEL,
+ LEFTOVER_MAP_COMPARE_PLOT_SEGMENT_CROSS_SHARE,
} from "./leftoverMapCrossShare";
describe("formatLeftoverMapCrossShare", () => {
@@ -27,4 +28,16 @@ describe("formatLeftoverMapCrossShare", () => {
"leftover-map cross share {label}",
);
});
+
+ it("keeps the grouping comparison graphic leftover-map cross share label distinct from the graphic and strip labels", () => {
+ expect(LEFTOVER_MAP_COMPARE_PLOT_SEGMENT_CROSS_SHARE).toBe(
+ "leftover map comparison graphic cross share {label}",
+ );
+ expect(LEFTOVER_MAP_COMPARE_PLOT_SEGMENT_CROSS_SHARE).not.toBe(
+ "leftover-map cross share {label}",
+ );
+ expect(LEFTOVER_MAP_COMPARE_PLOT_SEGMENT_CROSS_SHARE).not.toBe(
+ LEFTOVER_MAP_COMPARE_CROSS_SHARE_LABEL,
+ );
+ });
});
diff --git a/frontend/src/leftoverMapCrossShare.ts b/frontend/src/leftoverMapCrossShare.ts
index 39367be53..52749a7f8 100644
--- a/frontend/src/leftoverMapCrossShare.ts
+++ b/frontend/src/leftoverMapCrossShare.ts
@@ -6,6 +6,9 @@ export const LEFTOVER_MAP_CROSS_SHARE_ACTION =
export const LEFTOVER_MAP_COMPARE_CROSS_SHARE_LABEL =
"Leftover map comparison cross share";
+export const LEFTOVER_MAP_COMPARE_PLOT_SEGMENT_CROSS_SHARE =
+ "leftover map comparison graphic cross share {label}";
+
export function formatLeftoverMapCrossShare(
value: number | null | undefined,
): string | null {
diff --git a/frontend/src/leftoverMapPlotLayout.test.ts b/frontend/src/leftoverMapPlotLayout.test.ts
index c3c0ffdfb..8a726eccc 100644
--- a/frontend/src/leftoverMapPlotLayout.test.ts
+++ b/frontend/src/leftoverMapPlotLayout.test.ts
@@ -10,6 +10,7 @@ import {
LEFTOVER_MAP_COMPARE_PLOT_SEGMENT_RECONSTRUCTION,
LEFTOVER_MAP_COMPARE_PLOT_SEGMENT_EXPLAINED_SHARE,
LEFTOVER_MAP_COMPARE_PLOT_SEGMENT_UNEXPLAINED_SHARE,
+ LEFTOVER_MAP_COMPARE_PLOT_SEGMENT_CROSS_SHARE,
LEFTOVER_MAP_COMPARE_PLOT_SVG,
PLOT_HEIGHT,
PLOT_PADDING,
@@ -1243,4 +1244,16 @@ describe("leftover map comparison graphic labels", () => {
"Leftover map comparison unexplained leftover share",
);
});
+
+ it("stays distinct from leftover-map cross share copy", () => {
+ expect(LEFTOVER_MAP_COMPARE_PLOT_SEGMENT_CROSS_SHARE).toBe(
+ "leftover map comparison graphic cross share {label}",
+ );
+ expect(LEFTOVER_MAP_COMPARE_PLOT_SEGMENT_CROSS_SHARE).not.toBe(
+ "leftover-map cross share {label}",
+ );
+ expect(LEFTOVER_MAP_COMPARE_PLOT_SEGMENT_CROSS_SHARE).not.toBe(
+ "Leftover map comparison cross share",
+ );
+ });
});
diff --git a/frontend/src/leftoverMapPlotLayout.ts b/frontend/src/leftoverMapPlotLayout.ts
index 1425f5121..c4ee99387 100644
--- a/frontend/src/leftoverMapPlotLayout.ts
+++ b/frontend/src/leftoverMapPlotLayout.ts
@@ -39,8 +39,9 @@
* incomplete post coverage on that graphic (ADR 0308), grouping comparison leftover-map
* incomplete item coverage on that graphic (ADR 0309), grouping comparison leftover-map
* reconstruction on that graphic (ADR 0310), grouping comparison leftover-map
- * explained leftover share on that graphic (ADR 0311), and grouping comparison leftover-map
- * unexplained leftover share on that graphic (ADR 0312) caption the pair list or the grouping comparison
+ * explained leftover share on that graphic (ADR 0311), grouping comparison leftover-map
+ * unexplained leftover share on that graphic (ADR 0312), and grouping comparison leftover-map
+ * cross share on that graphic (ADR 0313) caption the pair list or the grouping comparison
* strip. ADR 0304 reuses this graphic layout on the grouping comparison
* strip. ADR 0305 captions leftover-map axis share on that comparison
* graphic from already-named leftover-map axes. ADR 0306 captions leftover-map
@@ -54,7 +55,9 @@
* ADR 0311 captions leftover-map explained leftover share on that comparison graphic from
* already-named leftover-map explained leftover share. ADR 0312 captions leftover-map
* unexplained leftover share on that comparison graphic from already-named leftover-map
- * unexplained leftover share.
+ * unexplained leftover share. ADR 0313 captions leftover-map
+ * cross share on that comparison graphic from already-named leftover-map
+ * cross share.
*/
import { formatLeftoverMapCoordinatePair } from "./leftoverMapCoordinates";
@@ -108,6 +111,8 @@ export { LEFTOVER_MAP_COMPARE_PLOT_SEGMENT_UNEXPLAINED_SHARE } from "./leftoverM
export const LEFTOVER_MAP_PLOT_SEGMENT_CROSS_SHARE =
"leftover-map cross share {label}";
+export { LEFTOVER_MAP_COMPARE_PLOT_SEGMENT_CROSS_SHARE } from "./leftoverMapCrossShare";
+
export const LEFTOVER_MAP_PLOT_SEGMENT_UNEXPLAINED =
"leftover-map unexplained leftover {label}";
diff --git a/pyproject.toml b/pyproject.toml
index fcacd9002..321a12df5 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
[project]
name = "lineageweave"
-version = "2.69.0"
+version = "2.70.0"
description = "Reconstructs git-branch-style lineage DAGs from scattered short records using multi-channel score fusion and LLM adjudication."
readme = "README.md"
license = { text = "MIT" }