diff --git a/AGENTS.md b/AGENTS.md index 84a21af42..0bafe97de 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) 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) 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 @@ -531,6 +531,16 @@ integers. Do not invent leftover-map incomplete items from scored minus used, pl marker count, leftover pair count, leftover-map rank, leftover-map distance, leftover-map axis share, leftover-map reconstruction, leftover residual, leftover-map post coverage, leftover-map item coverage, leftover-map incomplete post coverage, or the count of unused axes. +ADR 0310 captions leftover-map reconstruction on that grouping comparison leftover-map +graphic when formatLeftoverMapReconstruction returns a usable signed badge; a missing or +non-finite `R̂` omits that leftover-map comparison graphic reconstruction caption and keeps +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 +`R̂` from leftover-map distance, plotted coordinates, leftover residual, 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 @@ -593,6 +603,9 @@ post coverage when leftoverMapIncompletePostCount returns a usable dropped integ Grouping comparison leftover-map incomplete item coverage (ADR 0309) captions that grouping comparison leftover-map graphic with persisted leftover-map incomplete item coverage when leftoverMapIncompleteItemCount returns a usable dropped integer. +Grouping comparison leftover-map reconstruction (ADR 0310) captions +that grouping comparison leftover-map graphic with persisted leftover-map reconstruction +`R̂` when formatLeftoverMapReconstruction returns a usable signed 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 40329cc97..5ee17b5c9 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -716,6 +716,9 @@ dropped integer. ADR 0309 captions leftover-map incomplete item coverage on that grouping comparison leftover-map graphic when leftoverMapIncompleteItemCount returns a usable dropped integer. +ADR 0310 captions leftover-map reconstruction on that grouping +comparison leftover-map graphic when formatLeftoverMapReconstruction returns a usable +signed 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 @@ -754,7 +757,8 @@ comparison leftover-map graphic (ADR 0306), leftover-map item complete-case coverage on the grouping comparison leftover-map graphic (ADR 0307), leftover-map incomplete post coverage on the grouping comparison leftover-map graphic (ADR 0308), and leftover-map incomplete item coverage on the grouping comparison leftover-map -graphic (ADR 0309); +graphic (ADR 0309), leftover-map reconstruction on the grouping comparison leftover-map +graphic (ADR 0310); `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.67.0-leftover-map-compare-plot-reconstruction.md b/CHANGELOG.d/2.67.0-leftover-map-compare-plot-reconstruction.md new file mode 100644 index 000000000..a5f865ba6 --- /dev/null +++ b/CHANGELOG.d/2.67.0-leftover-map-compare-plot-reconstruction.md @@ -0,0 +1,30 @@ +## 2.67.0 — Leftover-map reconstruction on grouping comparison leftover-map graphic + +- Caption leftover-map reconstruction on the grouping comparison leftover-map + graphic (ADR 0310). 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, and a plot caption that matches leftover-map + reconstruction `R̂` on that grouping comparison leftover-map graphic; click a + post marker or a pair button opens that post. A missing or non-finite `R̂` + omits that leftover-map comparison graphic reconstruction caption and keeps + 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 + `R̂ 0.00` when that persisted reconstruction is finite. Comparison copy uses + `leftover map comparison graphic reconstruction {label}` so it stays distinct + from hyphen `leftover-map reconstruction {label}` and from strip + `Leftover map comparison reconstruction`. This increment does not caption + leftover-map explained leftover share on the comparison graphic. Do not invent + `R̂` from leftover-map distance, plotted coordinates, leftover residual, + 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. Never invent a leftover score. Never invent a theta. No new + columns. diff --git a/CHANGELOG.md b/CHANGELOG.md index 91e551ead..63e3b65aa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,38 @@ All notable changes to this project are documented here. Format follows ### Added +- Period leftover pairs now name leftover-map reconstruction on the grouping + comparison leftover-map graphic (ADR 0310 / v2.67.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, and leftover-map + reconstruction `R̂` on that grouping comparison leftover-map graphic when + formatLeftoverMapReconstruction returns a usable signed badge; click a post + marker or a pair button opens that post. A missing or non-finite `R̂` omits + that leftover-map comparison graphic reconstruction caption and keeps 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 `R̂ 0.00` + when that persisted reconstruction is finite. Comparison copy uses `leftover + map comparison graphic reconstruction {label}` so it stays distinct from hyphen + `leftover-map reconstruction {label}` and from strip `Leftover map comparison + reconstruction`. Reconstruction omits independently of leftover-map distance + and coverage notes. This increment does not caption leftover-map explained leftover + share on the comparison graphic. Do not invent `R̂` from leftover-map distance, + plotted coordinates, leftover residual, 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 finite negative leftover 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 incomplete item coverage on the grouping comparison leftover-map graphic (ADR 0309 / v2.66.0). After `make seed`, closest and farthest leftover pairs sit above the member list diff --git a/CLAUDE.md b/CLAUDE.md index 5a42cfb1d..a727f9449 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), 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), 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/0272-leftover-map-segment-reconstruction.md b/docs/adr/0272-leftover-map-segment-reconstruction.md index 2dcede993..683174088 100644 --- a/docs/adr/0272-leftover-map-segment-reconstruction.md +++ b/docs/adr/0272-leftover-map-segment-reconstruction.md @@ -4,7 +4,9 @@ **Date:** 2026-08-29 **Amended by:** [ADR 0273](0273-leftover-map-segment-explained-share.md) -(leftover-map explained leftover share on pair segments) +(leftover-map explained leftover share on pair segments), +[ADR 0310](0310-leftover-map-compare-plot-reconstruction.md) +(leftover-map reconstruction on the grouping comparison leftover-map graphic) Amends [ADR 0268](0268-leftover-map-graphic-display.md) and [ADR 0049](0049-leftover-pair-report-ui.md). Independent of leftover-map diff --git a/docs/adr/0293-leftover-map-compare-reconstruction.md b/docs/adr/0293-leftover-map-compare-reconstruction.md index 4796af038..c29a9ac27 100644 --- a/docs/adr/0293-leftover-map-compare-reconstruction.md +++ b/docs/adr/0293-leftover-map-compare-reconstruction.md @@ -3,6 +3,9 @@ **Decision status:** Accepted **Date:** 2026-08-30 +**Amended by:** [ADR 0310](0310-leftover-map-compare-plot-reconstruction.md) +(leftover-map reconstruction 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 reconstruction persistence ([ADR 0201](0201-leftover-map-reconstruction.md)), diff --git a/docs/adr/0309-leftover-map-compare-plot-incomplete-item.md b/docs/adr/0309-leftover-map-compare-plot-incomplete-item.md index da8c5c54e..375dd90eb 100644 --- a/docs/adr/0309-leftover-map-compare-plot-incomplete-item.md +++ b/docs/adr/0309-leftover-map-compare-plot-incomplete-item.md @@ -3,6 +3,9 @@ **Decision status:** Accepted **Date:** 2026-08-31 +**Amended by:** [ADR 0310](0310-leftover-map-compare-plot-reconstruction.md) +(leftover-map reconstruction on the grouping comparison leftover-map graphic) + Amends leftover-map incomplete item coverage on the graphic display ([ADR 0284](0284-leftover-map-plot-incomplete-item.md)), leftover-map incomplete item coverage on the grouping comparison strip diff --git a/docs/adr/0310-leftover-map-compare-plot-reconstruction.md b/docs/adr/0310-leftover-map-compare-plot-reconstruction.md new file mode 100644 index 000000000..5ebd7c34a --- /dev/null +++ b/docs/adr/0310-leftover-map-compare-plot-reconstruction.md @@ -0,0 +1,261 @@ +# ADR 0310 — Name leftover-map reconstruction on the grouping comparison leftover-map graphic + +**Decision status:** Accepted +**Date:** 2026-08-31 + +Amends leftover-map reconstruction on graphic-display pair segments +([ADR 0272](0272-leftover-map-segment-reconstruction.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 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 reconstruction +persistence ([ADR 0201](0201-leftover-map-reconstruction.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 cross share +on grouping comparison strip pair rows +([ADR 0296](0296-leftover-map-compare-cross-share.md)), leftover-map unexplained +leftover share on grouping comparison strip pair rows +([ADR 0295](0295-leftover-map-compare-unexplained-share.md)), leftover-map +explained leftover share on grouping comparison strip pair rows +([ADR 0294](0294-leftover-map-compare-explained-share.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)), 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 +cross share on pair segments ([ADR 0275](0275-leftover-map-segment-cross-share.md)), +leftover-map unexplained leftover share on pair segments +([ADR 0274](0274-leftover-map-segment-unexplained-share.md)), leftover-map +explained leftover share on pair segments +([ADR 0273](0273-leftover-map-segment-explained-share.md)), leftover-map +distance on pair segments ([ADR 0271](0271-leftover-map-segment-distance.md)), +leftover-map cross share persistence ([ADR 0185](0185-leftover-map-cross-share.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 +explained leftover share on the grouping comparison leftover-map graphic. + +## Context + +ADR 0201 already persists leftover-map reconstruction +`R̂ = ξ_{1:2} · ζ_{1:2}` on leftover pair rows. ADR 0272 already captions +period-report leftover-map pair segments with +`leftover-map reconstruction {label}` when that reconstruction is finite. +ADR 0293 already captions grouping comparison leftover-pair buttons with +that same persisted reconstruction under accessible name +`Leftover map comparison reconstruction`. ADR 0304 already draws the +leftover-map graphic of persisted `ξ_{1:2}` / `ζ_{1:2}` above grouping +comparison leftover-pair buttons. ADR 0309 already captions leftover-map +incomplete item coverage on that graphic. The comparison graphic still +reuses hyphen `leftover-map reconstruction {label}`, so a buyer who +compares leftover pairs can treat the period-report graphic caption as +the comparison graphic reconstruction even after the strip names `R̂`. +Hiding a distinct comparison-graphic reconstruction caption lets leftover +residual `R` or leftover-map distance `d` be read as leftover-map +reconstruction without a next action. + +This increment captions leftover-map reconstruction on the grouping +comparison leftover-map graphic from already-named leftover-map +reconstruction through formatLeftoverMapReconstruction. Comparison copy +uses the accessible name +`leftover map comparison graphic reconstruction {label}` so it stays +distinct from hyphen `leftover-map reconstruction {label}` on the +period-report graphic and from strip `Leftover map comparison reconstruction`. +It does not add columns. It does not recompute leftover-map reconstruction +from leftover-map distance, plotted coordinates, leftover residual, +unexplained leftover, 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. It does not persist leftover-map +inner product, cosine, or length as separate columns (`R̂` already is the +two-axis inner product). 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 **0310** so it does not collide with +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 reconstruction on grouping comparison strip pair rows +(0293), leftover-map reconstruction on pair segments (0272), leftover-map +reconstruction persistence (0201), 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 reconstruction when formatLeftoverMapReconstruction +returns a usable signed badge, next to leftover-map distance `d`. Use the +distinct accessible name `leftover map comparison graphic reconstruction {label}` +so the graphic caption is not the strip badge (`Leftover map comparison reconstruction`) +and is not the period-report graphic caption (`leftover-map reconstruction {label}`). +A missing or non-finite `R̂` omits that leftover-map comparison graphic +reconstruction caption and keeps 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 cross share `x` when finite, leftover-map unexplained leftover +share `s` when finite, leftover-map explained leftover share `e` when finite, +leftover-map distance `d`, plus the strip reconstruction badge. Rank-0 origin +cells still name `R̂ 0.00` when that persisted reconstruction is finite. Do not +invent `R̂` from leftover-map distance, plotted coordinates, leftover residual, +unexplained leftover, 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. + +Reconstruction omits independently of coverage notes and leftover-map distance. +A missing reconstruction omits leftover-map comparison graphic reconstruction and +keeps 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 explained leftover share on the +comparison graphic. That explained leftover share already sits on the strip +through ADR 0294. 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 +reconstruction on that graphic when formatLeftoverMapReconstruction +returns a usable signed badge. Rank-0 unused axes still plot at +the origin and still name `R̂ 0.00` when that persisted reconstruction 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 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 explained leftover share 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}`. Grouping comparison leftover-map reconstruction +captions that persisted inner product on the grouping comparison leftover-map +graphic only when formatLeftoverMapReconstruction returns a usable signed +badge. Rank-0 unused axes still name `R̂ 0.00` when that reconstruction is +stored.) + +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 de4912bf2..632cf1abe 100644 --- a/docs/product-technical-gap-baseline.md +++ b/docs/product-technical-gap-baseline.md @@ -1,5 +1,23 @@ # Product & Technical Gap Baseline +> Exact-head loop overlay: 2026-08-31 06:12 KST. Protected `main` is +> `cb187cadee5fb6c46d8a944815ccc154a1e028d1`. Writes work. Do not +> self-approve. #849 leftover-map incomplete items on the grouping comparison leftover-map +> graphic (v2.66.0 / ADR 0309) is `43ce193`, stacked on #848 @ `6707725`. Tests green; +> independent APPROVE is missing. Next buyer increment on this cycle: leftover-map +> reconstruction on the grouping comparison leftover-map graphic (ADR 0310 / v2.67.0) +> delivered locally on `feat/leftover-map-compare-plot-reconstruction-v2670`. Caption +> persisted leftover-map reconstruction `R̂` on that comparison graphic from already-named +> leftover_map_reconstruction. Distinct accessible name `leftover map comparison graphic +> reconstruction {label}`. Omit when formatLeftoverMapReconstruction fail-closes. Do not +> caption leftover-map explained leftover share on that comparison graphic this increment. +> Do not invent `R̂` from leftover-map distance, plotted coordinates, leftover residual, +> 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 #849. Leave open +> for independent review. Do not squash-merge. Issues #79 and #87 stay open. #96 is +> already closed. Do not merge #808 without independent APPROVE. + > Exact-head loop overlay: 2026-08-31 05:20 KST. Protected `main` is > `cb187cadee5fb6c46d8a944815ccc154a1e028d1`. Writes work. Do not > self-approve. #848 leftover-map incomplete posts on the grouping comparison leftover-map diff --git a/frontend/package.json b/frontend/package.json index b8b217d5c..6c13afc25 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,7 +1,7 @@ { "name": "frontend", "private": true, - "version": "2.66.0", + "version": "2.67.0", "type": "module", "scripts": { "dev": "vite", diff --git a/frontend/src/App.test.tsx b/frontend/src/App.test.tsx index 0faf4b91a..0365c096b 100644 --- a/frontend/src/App.test.tsx +++ b/frontend/src/App.test.tsx @@ -4468,11 +4468,16 @@ describe("App, authenticated", () => { "Leftover-map graphic incomplete items", ), ).not.toBeInTheDocument(); + expect( + within(screen.getByLabelText("Grouping comparison")).getByLabelText( + "leftover map comparison graphic reconstruction R̂ +0.25", + ), + ).toHaveTextContent("R̂ +0.25"); expect( within(screen.getByLabelText("Grouping comparison")).queryByLabelText( /leftover-map reconstruction/, ), - ).toHaveTextContent("R̂ +0.25"); + ).not.toBeInTheDocument(); expect( within(screen.getByLabelText("Grouping comparison")).getByLabelText( "Leftover map comparison reconstruction", diff --git a/frontend/src/components/LeftoverMapPlot.test.tsx b/frontend/src/components/LeftoverMapPlot.test.tsx index 148501159..9798f6894 100644 --- a/frontend/src/components/LeftoverMapPlot.test.tsx +++ b/frontend/src/components/LeftoverMapPlot.test.tsx @@ -1212,4 +1212,117 @@ describe("LeftoverMapPlot", () => { expect(screen.getByText("leftover map comparison axis 1 (0%)")).toBeInTheDocument(); expect(screen.getByText("leftover map comparison axis 2 (0%)")).toBeInTheDocument(); }); + + it("names leftover-map reconstruction on the comparison graphic with a distinct accessible name", () => { + render( + , + ); + expect( + screen.getByLabelText("leftover map comparison graphic reconstruction R̂ +0.25"), + ).toHaveTextContent("R̂ +0.25"); + expect( + screen.getByLabelText("leftover map comparison graphic reconstruction R̂ −0.95"), + ).toHaveTextContent("R̂ −0.95"); + expect(screen.queryByLabelText("leftover-map reconstruction R̂ +0.25")).not.toBeInTheDocument(); + expect(screen.queryByLabelText("leftover-map reconstruction R̂ −0.95")).not.toBeInTheDocument(); + expect(screen.queryByLabelText("Leftover map comparison reconstruction")).not.toBeInTheDocument(); + expect(screen.getByLabelText("Leftover map comparison graphic incomplete items")).toHaveTextContent( + "Leftover map dropped 0 incomplete criteria", + ); + expect(screen.getByText("leftover map comparison axis 1 (82%)")).toBeInTheDocument(); + }); + + it("omits leftover-map comparison graphic reconstruction when R̂ is missing or not usable", () => { + render( + , + ); + expect(screen.queryByLabelText(/leftover map comparison graphic reconstruction/)).not.toBeInTheDocument(); + expect(screen.queryByLabelText(/leftover-map reconstruction/)).not.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 reconstruction on the comparison graphic when that persisted value is finite", () => { + render( + , + ); + expect( + screen.getByLabelText("leftover map comparison graphic reconstruction R̂ 0.00"), + ).toHaveTextContent("R̂ 0.00"); + expect(screen.queryByLabelText("leftover-map reconstruction R̂ 0.00")).not.toBeInTheDocument(); + 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 d8a1c145e..399cfea63 100644 --- a/frontend/src/components/LeftoverMapPlot.tsx +++ b/frontend/src/components/LeftoverMapPlot.tsx @@ -33,6 +33,7 @@ import { LEFTOVER_MAP_COMPARE_PLOT_CAPTION, LEFTOVER_MAP_COMPARE_PLOT_LABEL, LEFTOVER_MAP_COMPARE_PLOT_SVG, + LEFTOVER_MAP_COMPARE_PLOT_SEGMENT_RECONSTRUCTION, LEFTOVER_MAP_PLOT_CAPTION, LEFTOVER_MAP_PLOT_POST_ACTION, LEFTOVER_MAP_PLOT_SEGMENT_CROSS_SHARE, @@ -137,7 +138,10 @@ function leftoverMapPlotAxisText( * distinct leftover map comparison graphic incomplete posts labels. ADR 0309 * captions leftover-map incomplete item coverage on that comparison graphic * from already-named leftover-map coverage with distinct leftover map - * comparison graphic incomplete items labels. + * comparison graphic incomplete items labels. ADR 0310 captions leftover-map + * reconstruction on that comparison graphic from already-named leftover-map + * reconstruction with distinct leftover map comparison graphic reconstruction + * labels. * Never invent a leftover score. */ export function LeftoverMapPlot({ @@ -306,9 +310,12 @@ export function LeftoverMapPlot({ x={segment.reconstructionX} y={segment.reconstructionY} textAnchor="middle" - aria-label={tf(LEFTOVER_MAP_PLOT_SEGMENT_RECONSTRUCTION, { - label: segment.reconstructionLabel, - })} + aria-label={tf( + variant === "comparison" + ? LEFTOVER_MAP_COMPARE_PLOT_SEGMENT_RECONSTRUCTION + : LEFTOVER_MAP_PLOT_SEGMENT_RECONSTRUCTION, + { label: segment.reconstructionLabel }, + )} > {segment.reconstructionLabel} diff --git a/frontend/src/components/LeftoverPairList.tsx b/frontend/src/components/LeftoverPairList.tsx index 12da39370..c726303be 100644 --- a/frontend/src/components/LeftoverPairList.tsx +++ b/frontend/src/components/LeftoverPairList.tsx @@ -114,7 +114,9 @@ export type LeftoverPairListProps = { * not this pair list. ADR 0308 captions leftover-map incomplete post coverage * on that grouping comparison leftover-map graphic, not this pair list. ADR 0309 * captions leftover-map incomplete item coverage on that grouping comparison - * leftover-map graphic, not this pair list. Every badge still + * leftover-map graphic, not this pair list. ADR 0310 captions leftover-map + * reconstruction on that grouping comparison leftover-map graphic, not this + * pair list. Every badge still * renders together before opening the named post. */ export function LeftoverPairList({ diff --git a/frontend/src/i18n.test.ts b/frontend/src/i18n.test.ts index a67fb7349..5627bfbeb 100644 --- a/frontend/src/i18n.test.ts +++ b/frontend/src/i18n.test.ts @@ -86,6 +86,7 @@ describe("i18n", () => { "Leftover map comparison incomplete items", "Leftover map comparison graphic incomplete items", "Leftover map comparison reconstruction", + "leftover map comparison graphic reconstruction {label}", "Leftover map comparison explained leftover share", "Leftover map comparison unexplained leftover share", "Leftover map comparison cross share", @@ -494,6 +495,18 @@ describe("i18n", () => { expect(t("Leftover map comparison reconstruction")).toBe(expected); }); + it.each([ + ["ko", "잔여 지도 비교 그림 재구성 R̂ +0.35"], + ["zh", "残差地图比较图形重建 R̂ +0.35"], + ["ja", "残差マップの比較図再構成 R̂ +0.35"], + ["vi", "tái dựng đồ họa so sánh bản đồ phần dư R̂ +0.35"], + ] as const)("formats leftover map comparison graphic reconstruction in %s", (locale, expected) => { + setLocale(locale); + expect(tf("leftover map comparison graphic reconstruction {label}", { label: "R̂ +0.35" })).toBe( + expected, + ); + }); + it.each([ ["ko", "잔여 지도 비교 설명 잔여 점유율"], ["zh", "残差地图比较已解释残差份额"], diff --git a/frontend/src/i18n.ts b/frontend/src/i18n.ts index 80217f2f7..ab52cb876 100644 --- a/frontend/src/i18n.ts +++ b/frontend/src/i18n.ts @@ -277,6 +277,7 @@ const TRANSLATIONS: Partial>> = { "Leftover map comparison incomplete items": "잔여 지도 비교 불완전 기준", "Leftover map comparison graphic incomplete items": "잔여 지도 비교 그림 불완전 기준", "Leftover map comparison reconstruction": "잔여 지도 비교 재구성", + "leftover map comparison graphic reconstruction {label}": "잔여 지도 비교 그림 재구성 {label}", "Leftover map comparison explained leftover share": "잔여 지도 비교 설명 잔여 점유율", "Leftover map comparison unexplained leftover share": "잔여 지도 비교 미설명 잔여 점유율", "Leftover map comparison cross share": "잔여 지도 비교 교차 점유율", @@ -908,6 +909,7 @@ const TRANSLATIONS: Partial>> = { "Leftover map comparison incomplete items": "残差地图比较不完整准则", "Leftover map comparison graphic incomplete items": "残差地图比较图形不完整准则", "Leftover map comparison reconstruction": "残差地图比较重建", + "leftover map comparison graphic reconstruction {label}": "残差地图比较图形重建 {label}", "Leftover map comparison explained leftover share": "残差地图比较已解释残差份额", "Leftover map comparison unexplained leftover share": "残差地图比较未解释残差份额", "Leftover map comparison cross share": "残差地图比较交叉份额", @@ -1560,6 +1562,7 @@ const TRANSLATIONS: Partial>> = { "Leftover map comparison incomplete items": "残差マップの比較不完全基準", "Leftover map comparison graphic incomplete items": "残差マップの比較図不完全基準", "Leftover map comparison reconstruction": "残差マップの比較再構成", + "leftover map comparison graphic reconstruction {label}": "残差マップの比較図再構成 {label}", "Leftover map comparison explained leftover share": "残差マップの比較説明済み残差割合", "Leftover map comparison unexplained leftover share": "残差マップの比較未説明残差割合", "Leftover map comparison cross share": "残差マップの比較交差割合", @@ -2191,6 +2194,7 @@ const TRANSLATIONS: Partial>> = { "Leftover map comparison incomplete items": "Tiêu chí không đầy đủ so sánh trên bản đồ phần dư", "Leftover map comparison graphic incomplete items": "Tiêu chí không đầy đủ đồ họa so sánh trên bản đồ phần dư", "Leftover map comparison reconstruction": "Tái dựng so sánh bản đồ phần dư", + "leftover map comparison graphic reconstruction {label}": "tái dựng đồ họa so sánh bản đồ phần dư {label}", "Leftover map comparison explained leftover share": "Phần dư giải thích so sánh bản đồ phần dư", "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 cross share": "Phần giao so sánh bản đồ phần dư", diff --git a/frontend/src/leftoverMapPlotLayout.test.ts b/frontend/src/leftoverMapPlotLayout.test.ts index a8eed5b16..da500a058 100644 --- a/frontend/src/leftoverMapPlotLayout.test.ts +++ b/frontend/src/leftoverMapPlotLayout.test.ts @@ -7,6 +7,7 @@ import { layoutLeftoverMapPlot, LEFTOVER_MAP_COMPARE_PLOT_CAPTION, LEFTOVER_MAP_COMPARE_PLOT_LABEL, + LEFTOVER_MAP_COMPARE_PLOT_SEGMENT_RECONSTRUCTION, LEFTOVER_MAP_COMPARE_PLOT_SVG, PLOT_HEIGHT, PLOT_PADDING, @@ -1204,4 +1205,16 @@ describe("leftover map comparison graphic labels", () => { expect(LEFTOVER_MAP_COMPARE_PLOT_LABEL).not.toBe("Leftover-map graphic display"); expect(LEFTOVER_MAP_COMPARE_PLOT_SVG).not.toBe("Leftover map"); }); + + it("stays distinct from leftover-map reconstruction copy", () => { + expect(LEFTOVER_MAP_COMPARE_PLOT_SEGMENT_RECONSTRUCTION).toBe( + "leftover map comparison graphic reconstruction {label}", + ); + expect(LEFTOVER_MAP_COMPARE_PLOT_SEGMENT_RECONSTRUCTION).not.toBe( + "leftover-map reconstruction {label}", + ); + expect(LEFTOVER_MAP_COMPARE_PLOT_SEGMENT_RECONSTRUCTION).not.toBe( + "Leftover map comparison reconstruction", + ); + }); }); diff --git a/frontend/src/leftoverMapPlotLayout.ts b/frontend/src/leftoverMapPlotLayout.ts index d63903e4c..7ee7e70cf 100644 --- a/frontend/src/leftoverMapPlotLayout.ts +++ b/frontend/src/leftoverMapPlotLayout.ts @@ -36,8 +36,9 @@ * graphic (ADR 0305), grouping comparison leftover-map complete-case * coverage on that graphic (ADR 0306), grouping comparison leftover-map * item complete-case coverage on that graphic (ADR 0307), grouping comparison leftover-map - * incomplete post coverage on that graphic (ADR 0308), and grouping comparison leftover-map - * incomplete item coverage on that graphic (ADR 0309) caption the pair list or the grouping comparison + * incomplete post coverage on that graphic (ADR 0308), grouping comparison leftover-map + * incomplete item coverage on that graphic (ADR 0309), and grouping comparison leftover-map + * reconstruction on that graphic (ADR 0310) 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 @@ -46,7 +47,8 @@ * comparison graphic from already-named leftover-map coverage. ADR 0308 captions leftover-map * incomplete post coverage on that comparison graphic from already-named leftover-map * coverage. ADR 0309 captions leftover-map incomplete item coverage on that - * comparison graphic from already-named leftover-map coverage. + * comparison graphic from already-named leftover-map coverage. ADR 0310 captions leftover-map + * reconstruction on that comparison graphic from already-named leftover-map reconstruction. */ import { formatLeftoverMapCoordinatePair } from "./leftoverMapCoordinates"; @@ -85,6 +87,8 @@ export const LEFTOVER_MAP_PLOT_SEGMENT_DISTANCE = export const LEFTOVER_MAP_PLOT_SEGMENT_RECONSTRUCTION = "leftover-map reconstruction {label}"; +export { LEFTOVER_MAP_COMPARE_PLOT_SEGMENT_RECONSTRUCTION } from "./leftoverMapReconstruction"; + export const LEFTOVER_MAP_PLOT_SEGMENT_EXPLAINED_SHARE = "leftover-map explained leftover share {label}"; diff --git a/frontend/src/leftoverMapReconstruction.test.ts b/frontend/src/leftoverMapReconstruction.test.ts index 5fb107210..36c76c6b0 100644 --- a/frontend/src/leftoverMapReconstruction.test.ts +++ b/frontend/src/leftoverMapReconstruction.test.ts @@ -1,6 +1,7 @@ import { describe, expect, it } from "vitest"; import { formatLeftoverMapReconstruction, + LEFTOVER_MAP_COMPARE_PLOT_SEGMENT_RECONSTRUCTION, LEFTOVER_MAP_COMPARE_RECONSTRUCTION_LABEL, } from "./leftoverMapReconstruction"; @@ -22,4 +23,16 @@ describe("formatLeftoverMapReconstruction", () => { expect(LEFTOVER_MAP_COMPARE_RECONSTRUCTION_LABEL).toBe("Leftover map comparison reconstruction"); expect(LEFTOVER_MAP_COMPARE_RECONSTRUCTION_LABEL).not.toBe("leftover-map reconstruction {label}"); }); + + it("keeps the grouping comparison graphic reconstruction label distinct from the graphic and strip labels", () => { + expect(LEFTOVER_MAP_COMPARE_PLOT_SEGMENT_RECONSTRUCTION).toBe( + "leftover map comparison graphic reconstruction {label}", + ); + expect(LEFTOVER_MAP_COMPARE_PLOT_SEGMENT_RECONSTRUCTION).not.toBe( + "leftover-map reconstruction {label}", + ); + expect(LEFTOVER_MAP_COMPARE_PLOT_SEGMENT_RECONSTRUCTION).not.toBe( + LEFTOVER_MAP_COMPARE_RECONSTRUCTION_LABEL, + ); + }); }); diff --git a/frontend/src/leftoverMapReconstruction.ts b/frontend/src/leftoverMapReconstruction.ts index 9a32c66b7..91d73e7cb 100644 --- a/frontend/src/leftoverMapReconstruction.ts +++ b/frontend/src/leftoverMapReconstruction.ts @@ -8,6 +8,9 @@ export const LEFTOVER_MAP_RECONSTRUCTION_ACTION = export const LEFTOVER_MAP_COMPARE_RECONSTRUCTION_LABEL = "Leftover map comparison reconstruction"; +export const LEFTOVER_MAP_COMPARE_PLOT_SEGMENT_RECONSTRUCTION = + "leftover map comparison graphic reconstruction {label}"; + const RECONSTRUCTION_BADGE = "R\u0302"; export function formatLeftoverMapReconstruction(value: number | null | undefined): string | null { diff --git a/pyproject.toml b/pyproject.toml index f43e3ee7a..3e633a029 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "lineageweave" -version = "2.66.0" +version = "2.67.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" }