From a91d2ec56bad922f9159e17649f77d229a0f98d3 Mon Sep 17 00:00:00 2001 From: seonghobae Date: Wed, 2 Sep 2026 11:29:51 +0000 Subject: [PATCH] feat(reports): leftover-map origin on leftover-map comparison leftover-pair leftover-map criterion leftover-map item coordinates independently of leftover-map comparison leftover-pair leftover-map post leftover-map origin leftover-map person coordinates (v2.111.0) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Caption leftover-map comparison leftover-pair leftover-map criterion leftover-map origin leftover-map item coordinates through leftoverMapCompareListCriterionBadge independently of leftover-map comparison leftover-pair leftover-map post leftover-map origin leftover-map person coordinates (ADR 0354). Distinct accessible name leftover map comparison leftover pair leftover-map criterion {label} at leftover-map origin ζ {item} when leftoverMapPlotCoordinatePairIsOrigin returns true. Rank-0 unused axes still name leftover-map origin (0.00, 0.00). leftoverMapCompareListPostBadge stays leftover-map comparison leftover-pair leftover-map post leftover-map origin leftover-map person coordinate keys. leftoverMapListCriterionBadge stays leftover-map pair leftover-map criterion leftover-map origin leftover-map item coordinate keys. leftoverMapComparePlotCriterionBadge stays leftover-map comparison graphic leftover-map criterion leftover-map origin leftover-map item coordinate keys. Do not invent leftover-map origin from leftover-map person coordinates ξ. Do not mix #877. --- AGENTS.md | 7 ++ ARCHITECTURE.md | 2 + ...map-compare-list-criterion-origin-badge.md | 12 +++ CHANGELOG.md | 10 ++ ...-map-compare-list-criterion-coordinates.md | 4 +- ...map-compare-list-criterion-origin-badge.md | 95 +++++++++++++++++++ docs/product-technical-gap-baseline.md | 9 ++ docs/storybook-inventory.md | 2 +- frontend/package.json | 2 +- frontend/src/components/LeftoverMapPlot.tsx | 3 + frontend/src/components/LeftoverPairList.tsx | 2 + frontend/src/i18n.test.ts | 1 + frontend/src/i18n.ts | 8 ++ frontend/src/leftoverMapAxisBadge.ts | 2 + frontend/src/leftoverMapCoordinates.test.ts | 43 ++++++++- frontend/src/leftoverMapCoordinates.ts | 25 ++++- frontend/src/leftoverMapPlotAxisSingular.ts | 3 + frontend/src/leftoverMapPlotLayout.test.ts | 9 ++ frontend/src/leftoverMapPlotLayout.ts | 4 + pyproject.toml | 2 +- 20 files changed, 236 insertions(+), 9 deletions(-) create mode 100644 CHANGELOG.d/2.111.0-leftover-map-compare-list-criterion-origin-badge.md create mode 100644 docs/adr/0354-leftover-map-compare-list-criterion-origin-badge.md diff --git a/AGENTS.md b/AGENTS.md index 7273c7e39..f093d738a 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -881,6 +881,11 @@ returns a leftover-map origin leftover-map person coordinate caption independent `leftover map comparison leftover pair leftover-map post {title} at leftover-map origin ξ {person}`. Rank-0 unused axes still name leftover-map origin `(0.00, 0.00)`. Do not invent leftover-map origin from leftover-map item coordinates `ζ`. leftoverMapListPostBadge stays leftover-map pair leftover-map post leftover-map origin leftover-map person coordinate keys. leftoverMapComparePlotPostBadge stays leftover-map comparison graphic leftover-map post leftover-map origin leftover-map person coordinate keys this increment. +ADR 0354 captions leftover-map comparison leftover-pair leftover-map criterion leftover-map origin leftover-map item coordinates with leftover-map origin when leftoverMapCompareListCriterionBadge +returns a leftover-map origin leftover-map item coordinate caption independently of leftover-map comparison leftover-pair leftover-map post leftover-map origin leftover-map person coordinates. Distinct accessible name +`leftover map comparison leftover pair leftover-map criterion {label} at leftover-map origin ζ {item}`. Rank-0 unused axes still name leftover-map origin `(0.00, 0.00)`. +Do not invent leftover-map origin from leftover-map person coordinates `ξ`. leftoverMapCompareListPostBadge stays leftover-map comparison leftover-pair leftover-map +post leftover-map origin leftover-map person coordinate keys. leftoverMapListCriterionBadge stays leftover-map pair leftover-map criterion leftover-map origin leftover-map item coordinate keys this increment. 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 @@ -1076,6 +1081,8 @@ Leftover-map pair leftover-map criterion leftover-map origin leftover-map item c (ADR 0352) captions leftover-map pair leftover-map criterion leftover-map origin leftover-map item coordinates when leftoverMapListCriterionBadge returns a leftover-map origin leftover-map item coordinate caption. Leftover-map comparison leftover-pair leftover-map post leftover-map origin leftover-map person coordinates independently of leftover-map pair leftover-map post leftover-map origin leftover-map person coordinates (ADR 0353) captions leftover-map comparison leftover-pair leftover-map post leftover-map origin leftover-map person coordinates when leftoverMapCompareListPostBadge returns a leftover-map origin leftover-map person coordinate caption. +Leftover-map comparison leftover-pair leftover-map criterion leftover-map origin leftover-map item coordinates independently of leftover-map comparison leftover-pair leftover-map post leftover-map origin leftover-map person coordinates +(ADR 0354) captions leftover-map comparison leftover-pair leftover-map criterion leftover-map origin leftover-map item coordinates when leftoverMapCompareListCriterionBadge returns a leftover-map origin leftover-map item coordinate caption. 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 3c0ff742c..053f3c13d 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -831,6 +831,8 @@ ADR 0352 captions leftover-map pair leftover-map criterion leftover-map origin l returns a leftover-map origin leftover-map item coordinate caption independently of leftover-map pair leftover-map post leftover-map origin leftover-map person coordinates. ADR 0353 captions leftover-map comparison leftover-pair leftover-map post leftover-map origin leftover-map person coordinates when leftoverMapCompareListPostBadge returns a leftover-map origin leftover-map person coordinate caption independently of leftover-map pair leftover-map post leftover-map origin leftover-map person coordinates. +ADR 0354 captions leftover-map comparison leftover-pair leftover-map criterion leftover-map origin leftover-map item coordinates when leftoverMapCompareListCriterionBadge +returns a leftover-map origin leftover-map item coordinate caption independently of leftover-map comparison leftover-pair leftover-map post leftover-map origin leftover-map person coordinates. 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 diff --git a/CHANGELOG.d/2.111.0-leftover-map-compare-list-criterion-origin-badge.md b/CHANGELOG.d/2.111.0-leftover-map-compare-list-criterion-origin-badge.md new file mode 100644 index 000000000..a84f264e0 --- /dev/null +++ b/CHANGELOG.d/2.111.0-leftover-map-compare-list-criterion-origin-badge.md @@ -0,0 +1,12 @@ +## 2.111.0 — Leftover-map origin on leftover-map comparison leftover-pair leftover-map criterion leftover-map item coordinates independently of leftover-map comparison leftover-pair leftover-map post leftover-map origin leftover-map person coordinates + +- Caption leftover-map comparison leftover-pair leftover-map criterion leftover-map origin leftover-map item coordinates through leftoverMapCompareListCriterionBadge + independently of leftover-map comparison leftover-pair leftover-map post leftover-map origin leftover-map person coordinates (ADR 0354). After `make seed`, leftover-map comparison leftover-pair leftover-map + criterion leftover-map origin leftover-map item coordinates name leftover-map origin when leftoverMapPlotCoordinatePairIsOrigin returns true. Distinct accessible name + `leftover map comparison leftover pair leftover-map criterion {label} at leftover-map origin ζ {item}`. Rank-0 unused axes still name leftover-map origin `(0.00, 0.00)`. + Non-origin leftover-map comparison leftover-pair leftover-map criterion leftover-map item coordinates stay + `leftover map comparison leftover pair leftover-map criterion {label} at ζ {item}`. leftoverMapCompareListPostBadge stays leftover-map comparison leftover-pair leftover-map + post leftover-map origin leftover-map person coordinate keys. leftoverMapListCriterionBadge stays leftover-map pair leftover-map + criterion leftover-map origin leftover-map item coordinate keys this increment. Do not invent leftover-map origin from leftover-map person coordinates `ξ`. + Do not mix #877. A finite negative leftover 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 650529a7a..9a71ba4c8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,16 @@ All notable changes to this project are documented here. Format follows ### Added +- Period leftover pairs now caption leftover-map comparison leftover-pair leftover-map criterion leftover-map origin leftover-map item coordinates + through leftoverMapCompareListCriterionBadge independently of leftover-map comparison leftover-pair leftover-map post leftover-map origin leftover-map person coordinates (ADR 0354 / v2.111.0). After `make seed`, leftover-map comparison leftover-pair leftover-map + criterion leftover-map origin leftover-map item coordinates name leftover-map origin when leftoverMapPlotCoordinatePairIsOrigin returns true. Distinct accessible name + `leftover map comparison leftover pair leftover-map criterion {label} at leftover-map origin ζ {item}`. Rank-0 unused axes still name leftover-map origin `(0.00, 0.00)`. + Non-origin leftover-map comparison leftover-pair leftover-map criterion leftover-map item coordinates stay + `leftover map comparison leftover pair leftover-map criterion {label} at ζ {item}`. leftoverMapCompareListPostBadge stays leftover-map comparison leftover-pair leftover-map + post leftover-map origin leftover-map person coordinate keys. leftoverMapListCriterionBadge stays leftover-map pair leftover-map + criterion leftover-map origin leftover-map item coordinate keys this increment. Do not invent leftover-map origin from leftover-map person coordinates `ξ`. + Do not mix #877. A finite negative leftover is shown, never clamped. Never invent a leftover score or a theta. No new columns. + - Period leftover pairs now caption leftover-map comparison leftover-pair leftover-map post leftover-map origin leftover-map person coordinates through leftoverMapCompareListPostBadge independently of leftover-map pair leftover-map post leftover-map origin leftover-map person coordinates (ADR 0353 / v2.110.0). After `make seed`, leftover-map comparison leftover-pair leftover-map post leftover-map origin leftover-map person coordinates name leftover-map origin when leftoverMapPlotCoordinatePairIsOrigin returns true. Distinct accessible name diff --git a/docs/adr/0342-leftover-map-compare-list-criterion-coordinates.md b/docs/adr/0342-leftover-map-compare-list-criterion-coordinates.md index 8041d1dad..ce0cd62d6 100644 --- a/docs/adr/0342-leftover-map-compare-list-criterion-coordinates.md +++ b/docs/adr/0342-leftover-map-compare-list-criterion-coordinates.md @@ -4,7 +4,9 @@ **Date:** 2026-08-31 **Amended by:** [ADR 0343](0343-leftover-map-plot-tick-origin-badge.md) -(leftover-map origin on leftover-map graphic leftover-map axis ticks independently of leftover-map axis share and leftover-map singular values) +(leftover-map origin on leftover-map graphic leftover-map axis ticks independently of leftover-map axis share and leftover-map singular values); +[ADR 0354](0354-leftover-map-compare-list-criterion-origin-badge.md) +(leftover-map origin on leftover-map comparison leftover-pair leftover-map criterion leftover-map item coordinates independently of leftover-map comparison leftover-pair leftover-map post leftover-map origin leftover-map person coordinates) Amends leftover-map coordinates ([ADR 0267](0267-leftover-map-coordinates.md)) and leftover-map coordinates on grouping comparison strip pair rows diff --git a/docs/adr/0354-leftover-map-compare-list-criterion-origin-badge.md b/docs/adr/0354-leftover-map-compare-list-criterion-origin-badge.md new file mode 100644 index 000000000..9245dc9c9 --- /dev/null +++ b/docs/adr/0354-leftover-map-compare-list-criterion-origin-badge.md @@ -0,0 +1,95 @@ +# ADR 0354 — Name leftover-map origin on leftover-map comparison leftover-pair leftover-map criterion leftover-map item coordinates independently of leftover-map comparison leftover-pair leftover-map post leftover-map origin leftover-map person coordinates + +**Decision status:** Accepted +**Date:** 2026-09-02 + +Amends leftover-map item coordinates on leftover-map comparison leftover pair leftover-map criterion independently of leftover-map comparison leftover pair leftover-map post leftover-map person coordinates +([ADR 0342](0342-leftover-map-compare-list-criterion-coordinates.md)). Independent of leftover-map comparison leftover-pair leftover-map post leftover-map origin leftover-map person coordinates independently of leftover-map pair leftover-map post leftover-map origin leftover-map person coordinates +([ADR 0353](0353-leftover-map-compare-list-post-origin-badge.md)). Independent of leftover-map pair leftover-map criterion leftover-map origin leftover-map item coordinates independently of leftover-map pair leftover-map post leftover-map origin leftover-map person coordinates +([ADR 0352](0352-leftover-map-list-criterion-origin-badge.md)). Independent of leftover-map comparison graphic leftover-map criterion leftover-map origin leftover-map item coordinates independently of leftover-map comparison graphic leftover-map post leftover-map origin leftover-map person coordinates +([ADR 0350](0350-leftover-map-compare-plot-criterion-origin-badge.md)). Independent of leftover-map leftover-axis origin ticks on the competing origin-tick stack (do not mix #877). + +## Context + +ADR 0342 already names leftover-map comparison leftover-pair leftover-map criterion leftover-map item coordinates +`leftover map comparison leftover pair leftover-map criterion {label} at ζ {item}`. Rank-0 unused axes still persist leftover-map +origin `(0.00, 0.00)` (`formatSignedLeftoverValue(0)` emits no plus). Origin leftover-map +item coordinates still interpolate leftover-map origin only through leftover-map comparison leftover-pair leftover-map criterion leftover-map +item coordinate keys. A missing or non-finite leftover-map item coordinate pair omits independently +of leftover-map person coordinates `ξ`. A finite negative leftover is shown, never clamped. +Do not invent leftover-map origin from leftover-map person coordinates `ξ`. leftoverMapCompareListPostBadge stays +`leftover map comparison leftover pair leftover-map post {title} at leftover-map origin ξ {person}` +this increment. leftoverMapListCriterionBadge stays +`leftover pair leftover-map criterion {label} at leftover-map origin ζ {item}` +this increment. leftoverMapComparePlotCriterionBadge stays +`leftover map comparison graphic leftover-map criterion {label} at leftover-map origin ζ {item}` +this increment. leftoverMapPlotCriterionBadge stays leftover-map graphic leftover-map +criterion leftover-map origin leftover-map item coordinate keys this increment. + +This increment names leftover-map comparison leftover-pair leftover-map criterion leftover-map origin leftover-map +item coordinates as leftoverMapCompareListCriterionBadge. Leftover-map comparison leftover-pair leftover-map criterion leftover-map origin leftover-map +item coordinates stay +`leftover map comparison leftover pair leftover-map criterion {label} at leftover-map origin ζ {item}` +when leftoverMapPlotCoordinatePairIsOrigin returns true, so they stay distinct from leftover-map +comparison leftover-pair leftover-map criterion leftover-map item coordinates +`leftover map comparison leftover pair leftover-map criterion {label} at ζ {item}`, +leftover-map pair leftover-map criterion leftover-map origin leftover-map item coordinates +`leftover pair leftover-map criterion {label} at leftover-map origin ζ {item}`, +leftover-map graphic leftover-map criterion leftover-map origin leftover-map item coordinates +`leftover-map criterion {label} at leftover-map origin ζ {item}`, +leftover-map comparison graphic leftover-map criterion leftover-map origin leftover-map item coordinates +`leftover map comparison graphic leftover-map criterion {label} at leftover-map origin ζ {item}`, +and leftover-map comparison leftover-pair leftover-map post leftover-map origin leftover-map person coordinates +`leftover map comparison leftover pair leftover-map post {title} at leftover-map origin ξ {person}`. +It does not add columns. Do not invent a leftover score. Do not invent a theta. + +This protected increment uses **0354** so it does not collide with leftover-map comparison leftover-pair leftover-map +post leftover-map origin leftover-map person coordinates independently of leftover-map pair leftover-map post leftover-map origin leftover-map person coordinates +(0353) or leftover-map leftover-axis origin ticks (#877). + +## Decision + +On leftover-map comparison leftover-pair leftover-map criterion, caption leftover-map origin +when leftoverMapPlotCoordinatePairIsOrigin returns true. Rank-0 unused axes still name leftover-map +origin `(0.00, 0.00)`. Non-origin leftover-map item coordinates stay leftover-map comparison leftover-pair leftover-map criterion leftover-map +item coordinate keys. leftoverMapCompareListPostBadge, leftoverMapListCriterionBadge, +leftoverMapComparePlotCriterionBadge, leftoverMapPlotCriterionBadge, leftoverMapListPostBadge, +leftoverMapPlotTickAxisBadge, leftoverMapComparePlotTickAxisBadge, leftoverMapCompareAxisTickBadge, and leftoverMapAxisTickBadge +do not change leftover-map origin naming this increment. + +Do not add SQL. Do not edit shipped migrations. Do not invent a leftover +score. Do not invent a theta. + +## Consequences + +After `make seed`, leftover-map comparison leftover-pair leftover-map criterion leftover-map origin leftover-map item +coordinates name leftover-map origin independently of leftover-map comparison leftover-pair leftover-map post leftover-map origin leftover-map person coordinates. Rank-0 unused +axes still name leftover-map origin `(0.00, 0.00)`. leftoverMapCompareListPostBadge stays leftover-map comparison leftover-pair leftover-map +post leftover-map origin leftover-map person coordinate keys. leftoverMapListCriterionBadge stays leftover-map pair leftover-map +criterion leftover-map origin leftover-map item coordinate keys. leftover-map item coordinates on leftover-map comparison leftover pair leftover-map +criterion independently of leftover-map comparison leftover pair leftover-map post leftover-map person coordinates +(ADR 0342) remain. + +## Related + +Independent of leftover-map comparison leftover-pair leftover-map post leftover-map origin leftover-map person +coordinates independently of leftover-map pair leftover-map post leftover-map origin leftover-map person coordinates +([ADR 0353](0353-leftover-map-compare-list-post-origin-badge.md)). Independent of leftover-map +item coordinates on leftover-map comparison leftover pair leftover-map criterion independently of leftover-map comparison leftover pair leftover-map +post leftover-map person coordinates ([ADR 0342](0342-leftover-map-compare-list-criterion-coordinates.md)). Independent of leftover-map +pair leftover-map criterion leftover-map origin leftover-map item coordinates independently of leftover-map pair leftover-map post leftover-map origin leftover-map person coordinates +([ADR 0352](0352-leftover-map-list-criterion-origin-badge.md)). Independent of leftover-map leftover-axis origin ticks independently of leftover-map axis share and leftover-map singular values +([ADR 0346](0346-leftover-map-axis-tick-origin-badge.md)). + +## References + +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 + +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.) diff --git a/docs/product-technical-gap-baseline.md b/docs/product-technical-gap-baseline.md index 448e56adf..ca12bcc06 100644 --- a/docs/product-technical-gap-baseline.md +++ b/docs/product-technical-gap-baseline.md @@ -1,5 +1,14 @@ # Product & Technical Gap Baseline +> Exact-head loop overlay: 2026-09-02 20:20 KST. Protected `main` is +> `3f61c8242b9c02dec307a7396e83e28f7cdd9f3d`. Writes work (MCP comment + git push). Do not +> self-approve. #917 leftover-map comparison leftover-pair leftover-map post leftover-map origin leftover-map +> person coordinates independently of leftover-map pair leftover-map post leftover-map origin leftover-map person coordinates (v2.110.0 / ADR 0353) is +> `8192b485`, stacked on #916 @ `7978e925`. Independent APPROVE is missing. This increment: leftover-map comparison leftover-pair leftover-map criterion leftover-map origin leftover-map +> item coordinates independently of leftover-map comparison leftover-pair leftover-map post leftover-map origin leftover-map person coordinates as leftoverMapCompareListCriterionBadge (ADR 0354 / v2.111.0) on +> `feat/leftover-map-compare-list-criterion-origin-badge-v21110`. Distinct accessible name +> `leftover map comparison leftover pair leftover-map criterion {label} at leftover-map origin ζ {item}`. Rank-0 unused axes still name leftover-map origin `(0.00, 0.00)`. leftoverMapCompareListPostBadge stays leftover-map comparison leftover-pair leftover-map post leftover-map origin leftover-map person coordinate keys. leftoverMapListCriterionBadge stays leftover-map pair leftover-map criterion leftover-map origin leftover-map item coordinate keys. leftoverMapComparePlotCriterionBadge stays leftover-map comparison graphic leftover-map criterion leftover-map origin leftover-map item coordinate keys. Do not invent leftover-map origin from leftover-map person coordinates `ξ`. Do not mix #877. Do not mix #890 leftoverMapPlotOriginBadge reconstruction into this increment. Stack onto #917. 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. #96 already closed as weaker duplicate of #91. Next buyer increment after this stack: leftoverMapPlotOriginBadge reconstruction independently of leftover-map comparison leftover-pair leftover-map criterion leftover-map origin leftover-map item coordinates (ADR 0355 / v2.112.0). + > Exact-head loop overlay: 2026-09-02 17:35 KST. Protected `main` is > `3f61c8242b9c02dec307a7396e83e28f7cdd9f3d`. Writes work (MCP comment + git push). Do not > self-approve. #916 leftover-map pair leftover-map criterion leftover-map origin leftover-map diff --git a/docs/storybook-inventory.md b/docs/storybook-inventory.md index 2f2ca3244..66f85cded 100644 --- a/docs/storybook-inventory.md +++ b/docs/storybook-inventory.md @@ -6,7 +6,7 @@ operator-facing control you can click before changing product CSS. | Story | Operator next action | Token / module | |---|---|---| | `Reports/LeftoverMapPlot` | Read the leftover-map graphic display of persisted `ξ` (posts) and `ζ` (criteria), match leftover-map graphic leftover-map post markers to `Open leftover-map post {title} at ξ {person}`, match leftover-map graphic leftover-map criterion markers to `leftover-map criterion {label} at ζ {item}`, match axis ticks to those coordinates, pair-segment `d` to leftover-map distance, pair-segment `R̂` to leftover-map reconstruction, pair-segment `R̂²/R²` to leftover-map explained leftover share, pair-segment `U²/R²` to leftover-map unexplained leftover share, pair-segment `2R̂U/R²` to leftover-map cross share, pair-segment `U` to leftover-map unexplained leftover, pair-segment `R` to leftover residual, pair-segment `Y` to leftover observed, pair-segment `E` to leftover expected, and pair-segment leftover-map rank, then click a post marker to open that post. Leftover-map axes name persisted leftover-map singular values `σ_k` and leftover-map axis share when finite. The plot names leftover-map complete-case coverage, leftover-map item complete-case coverage, leftover-map incomplete post coverage, and leftover-map incomplete item coverage when persisted. The comparison variant names leftover-map complete-case coverage under `Leftover map comparison graphic coverage` and leftover-map item complete-case coverage under `Leftover map comparison graphic item coverage` and leftover-map incomplete post coverage under `Leftover map comparison graphic incomplete posts` and leftover-map incomplete item coverage under `Leftover map comparison graphic incomplete items` and leftover-map comparison graphic leftover-map criterion markers under `leftover map comparison graphic leftover-map criterion {label} at ζ {item}` and leftover-map comparison graphic leftover-map post markers under `Open leftover map comparison graphic leftover-map post {title} at ξ {person}`. `ClosestAndFarthest`, `RankZeroOrigin`, `MissingCoordinates`, `MissingAxisShare`, `Comparison`, `ComparisonMissingCoverage`, `ComparisonMissingItemCoverage`, `ComparisonMissingIncompletePosts`, and `ComparisonMissingIncompleteItems` cover two-pair maps, rank-0 origin with 0% share, a `0` tick, `d 0.00`, `R̂ 0.00`, `R̂²/R² 0.00`, `U²/R² 0.00`, `2R̂U/R² 0.00`, `U 0.00`, `R 0.00`, `Y 0.00`, `E 0.00`, and `rank 0`, omitted plots, missing share that keeps leftover-map axis `σ` without share, grouping comparison leftover-map graphic coverage that matches leftover map used N of M scored posts, omitted comparison graphic coverage when leftoverMapCoverageCounts fail-closes, grouping comparison leftover-map graphic item coverage that matches leftover map used N of M scored criteria, omitted comparison graphic item coverage when leftoverMapItemCoverageCounts fail-closes, grouping comparison leftover-map graphic incomplete posts that matches leftover map dropped N incomplete posts, omitted comparison graphic incomplete posts when leftoverMapIncompletePostCount fail-closes, grouping comparison leftover-map graphic incomplete items that matches leftover map dropped N incomplete criteria, and omitted comparison graphic incomplete items when leftoverMapIncompleteItemCount fail-closes. The plot does not invent a leftover score. | `LeftoverMapPlot`, `leftoverMapPlotLayout`, `leftoverMapPlotAxisShare`, `--color-primary`, `--color-palette-blue-mid` | -| `Reports/LeftoverPairList` | Read closest/farthest leftover pairs with named `R`, `Y`/`E`, rank, `U`, `s`, `e`, `x`, `R̂`, `ξ`/`ζ`, and `d`, then open that post. Leftover-map pair leftover-map post name persisted leftover-map person coordinates under `leftover pair leftover-map post {title} at ξ {person}` independently of leftover-map pair leftover-map criterion leftover-map item coordinates when leftoverMapListPostBadge returns a usable leftover-map pair leftover-map post leftover-map person coordinate caption. Leftover-map pair leftover-map post leftover-map origin leftover-map person coordinates name leftover-map origin under `leftover pair leftover-map post {title} at leftover-map origin ξ {person}` when leftoverMapPlotCoordinatePairIsOrigin returns true. Leftover-map pair leftover-map criterion name persisted leftover-map item coordinates under `leftover pair leftover-map criterion {label} at ζ {item}` independently of leftover-map pair leftover-map post leftover-map person coordinates when leftoverMapListCriterionBadge returns a usable leftover-map pair leftover-map criterion leftover-map item coordinate caption. Leftover-map pair leftover-map criterion leftover-map origin leftover-map item coordinates name leftover-map origin under `leftover pair leftover-map criterion {label} at leftover-map origin ζ {item}` when leftoverMapPlotCoordinatePairIsOrigin returns true. The leftover-map graphic display sits above the pair buttons when coordinates are finite, leftover-map axes name persisted leftover-map singular values and leftover-map axis share, leftover-map axis ticks name persisted coordinates, leftover-map graphic leftover-map post markers name persisted leftover-map person coordinates under `Open leftover-map post {title} at ξ {person}`, leftover-map graphic leftover-map criterion markers name persisted leftover-map item coordinates under `leftover-map criterion {label} at ζ {item}`, leftover-axis ticks name persisted leftover-map singular values and leftover-map axis share independently under `leftover axis {axis} tick {value} σ {singular} {share}%`, pair segments name persisted leftover-map distance, pair segments name persisted leftover-map reconstruction, pair segments name persisted leftover-map explained leftover share, pair segments name persisted leftover-map unexplained leftover share, pair segments name persisted leftover-map cross share, pair segments name persisted leftover-map unexplained leftover, pair segments name persisted leftover residual, pair segments name persisted leftover observed, pair segments name persisted leftover expected, and pair segments name persisted leftover-map rank. The pair-list note names leftover-map complete-case coverage only when leftoverMapCoverageCounts returns usable complete-case integers, leftover-map item complete-case coverage, leftover-map incomplete post coverage, and leftover-map incomplete item coverage when persisted. The grouping comparison strip names leftover-map complete-case coverage, leftover-map item complete-case coverage, leftover-map incomplete post coverage, leftover-map incomplete item coverage, leftover-axis report badges with persisted leftover-map singular values under `leftover map comparison leftover axis {axis} σ {value}`, leftover-axis ticks with persisted leftover-map singular values and leftover-map axis share under `leftover map comparison leftover axis {axis} tick {value} σ {singular} {share}%` independently of leftover-map singular values, and leftover-map comparison graphic leftover-map criterion markers under `leftover map comparison graphic leftover-map criterion {label} at ζ {item}` and leftover-map comparison graphic leftover-map post markers under `Open leftover map comparison graphic leftover-map post {title} at ξ {person}` with distinct comparison labels when leftoverMapCoverageCounts / leftoverMapItemCoverageCounts / leftoverMapIncompletePostCount / leftoverMapIncompleteItemCount / leftoverMapCompareAxisBadge / leftoverMapCompareAxisTickBadge / leftoverMapComparePlotCriterionBadge / leftoverMapComparePlotPostBadge return usable values. Leftover-map comparison leftover-pair leftover-map post name persisted leftover-map person coordinates under `leftover map comparison leftover pair leftover-map post {title} at ξ {person}` independently of leftover-map comparison leftover-pair leftover-map criterion leftover-map item coordinates when leftoverMapCompareListPostBadge returns a usable leftover-map comparison leftover-pair leftover-map post leftover-map person coordinate caption. Leftover-map comparison leftover-pair leftover-map post leftover-map origin leftover-map person coordinates name leftover-map origin under `leftover map comparison leftover pair leftover-map post {title} at leftover-map origin ξ {person}` when leftoverMapPlotCoordinatePairIsOrigin returns true. Leftover-map comparison leftover-pair leftover-map criterion name persisted leftover-map item coordinates under `leftover map comparison leftover pair leftover-map criterion {label} at ζ {item}` independently of leftover-map comparison leftover-pair leftover-map post leftover-map person coordinates when leftoverMapCompareListCriterionBadge returns a usable leftover-map comparison leftover-pair leftover-map criterion leftover-map item coordinate caption. | `LeftoverPairList`, `LeftoverMapPlot`, `leftoverMapCoordinates`, `ticket-list`, `post-badge` | +| `Reports/LeftoverPairList` | Read closest/farthest leftover pairs with named `R`, `Y`/`E`, rank, `U`, `s`, `e`, `x`, `R̂`, `ξ`/`ζ`, and `d`, then open that post. Leftover-map pair leftover-map post name persisted leftover-map person coordinates under `leftover pair leftover-map post {title} at ξ {person}` independently of leftover-map pair leftover-map criterion leftover-map item coordinates when leftoverMapListPostBadge returns a usable leftover-map pair leftover-map post leftover-map person coordinate caption. Leftover-map pair leftover-map post leftover-map origin leftover-map person coordinates name leftover-map origin under `leftover pair leftover-map post {title} at leftover-map origin ξ {person}` when leftoverMapPlotCoordinatePairIsOrigin returns true. Leftover-map pair leftover-map criterion name persisted leftover-map item coordinates under `leftover pair leftover-map criterion {label} at ζ {item}` independently of leftover-map pair leftover-map post leftover-map person coordinates when leftoverMapListCriterionBadge returns a usable leftover-map pair leftover-map criterion leftover-map item coordinate caption. Leftover-map pair leftover-map criterion leftover-map origin leftover-map item coordinates name leftover-map origin under `leftover pair leftover-map criterion {label} at leftover-map origin ζ {item}` when leftoverMapPlotCoordinatePairIsOrigin returns true. The leftover-map graphic display sits above the pair buttons when coordinates are finite, leftover-map axes name persisted leftover-map singular values and leftover-map axis share, leftover-map axis ticks name persisted coordinates, leftover-map graphic leftover-map post markers name persisted leftover-map person coordinates under `Open leftover-map post {title} at ξ {person}`, leftover-map graphic leftover-map criterion markers name persisted leftover-map item coordinates under `leftover-map criterion {label} at ζ {item}`, leftover-axis ticks name persisted leftover-map singular values and leftover-map axis share independently under `leftover axis {axis} tick {value} σ {singular} {share}%`, pair segments name persisted leftover-map distance, pair segments name persisted leftover-map reconstruction, pair segments name persisted leftover-map explained leftover share, pair segments name persisted leftover-map unexplained leftover share, pair segments name persisted leftover-map cross share, pair segments name persisted leftover-map unexplained leftover, pair segments name persisted leftover residual, pair segments name persisted leftover observed, pair segments name persisted leftover expected, and pair segments name persisted leftover-map rank. The pair-list note names leftover-map complete-case coverage only when leftoverMapCoverageCounts returns usable complete-case integers, leftover-map item complete-case coverage, leftover-map incomplete post coverage, and leftover-map incomplete item coverage when persisted. The grouping comparison strip names leftover-map complete-case coverage, leftover-map item complete-case coverage, leftover-map incomplete post coverage, leftover-map incomplete item coverage, leftover-axis report badges with persisted leftover-map singular values under `leftover map comparison leftover axis {axis} σ {value}`, leftover-axis ticks with persisted leftover-map singular values and leftover-map axis share under `leftover map comparison leftover axis {axis} tick {value} σ {singular} {share}%` independently of leftover-map singular values, and leftover-map comparison graphic leftover-map criterion markers under `leftover map comparison graphic leftover-map criterion {label} at ζ {item}` and leftover-map comparison graphic leftover-map post markers under `Open leftover map comparison graphic leftover-map post {title} at ξ {person}` with distinct comparison labels when leftoverMapCoverageCounts / leftoverMapItemCoverageCounts / leftoverMapIncompletePostCount / leftoverMapIncompleteItemCount / leftoverMapCompareAxisBadge / leftoverMapCompareAxisTickBadge / leftoverMapComparePlotCriterionBadge / leftoverMapComparePlotPostBadge return usable values. Leftover-map comparison leftover-pair leftover-map post name persisted leftover-map person coordinates under `leftover map comparison leftover pair leftover-map post {title} at ξ {person}` independently of leftover-map comparison leftover-pair leftover-map criterion leftover-map item coordinates when leftoverMapCompareListPostBadge returns a usable leftover-map comparison leftover-pair leftover-map post leftover-map person coordinate caption. Leftover-map comparison leftover-pair leftover-map post leftover-map origin leftover-map person coordinates name leftover-map origin under `leftover map comparison leftover pair leftover-map post {title} at leftover-map origin ξ {person}` when leftoverMapPlotCoordinatePairIsOrigin returns true. Leftover-map comparison leftover-pair leftover-map criterion name persisted leftover-map item coordinates under `leftover map comparison leftover pair leftover-map criterion {label} at ζ {item}` independently of leftover-map comparison leftover-pair leftover-map post leftover-map person coordinates when leftoverMapCompareListCriterionBadge returns a usable leftover-map comparison leftover-pair leftover-map criterion leftover-map item coordinate caption. Leftover-map comparison leftover-pair leftover-map criterion leftover-map origin leftover-map item coordinates name leftover-map origin under `leftover map comparison leftover pair leftover-map criterion {label} at leftover-map origin ζ {item}` when leftoverMapPlotCoordinatePairIsOrigin returns true. | `LeftoverPairList`, `LeftoverMapPlot`, `leftoverMapCoordinates`, `ticket-list`, `post-badge` | | `Workspace/OperationsDashboard` | Compare Event and post counts, inspect external-information coverage, then open the cited source behind a claim, handover, or repeat-issue fact. `EvidenceReady`, `NarrowViewport`, `AnalysisPendingAndMissingEvidence`, `AnalysisFailed`, and `LoadError` cover populated, mobile, unavailable-evidence, analysis-pending, retryable failure, and transport-error states. | `--color-dashboard-*`, `OperationsDashboard` | | `Post/SimilarVocPanel` | Compare ontology/semantic similar VOC and prior action evidence, then open the source; unavailable states show no fabricated TEPP theta or weight. | `SimilarVocPanel.css`, `SimilarVocPanel` | | `Post/Recorded perspectives` | Read the imported primary and every evidence-connected additional Voice with its recorded truth state instead of flattening them into one compound category. `CombinedEvidence`, `RejectedEvidence`, and `NarrowViewport` cover desktop, rejected-evidence, and narrow layouts. | `VoicePerspectiveList`, `ticket-list`, `post-meta` | diff --git a/frontend/package.json b/frontend/package.json index 838a4b548..6e52693ba 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,7 +1,7 @@ { "name": "frontend", "private": true, - "version": "2.110.0", + "version": "2.111.0", "type": "module", "scripts": { "dev": "vite", diff --git a/frontend/src/components/LeftoverMapPlot.tsx b/frontend/src/components/LeftoverMapPlot.tsx index 639700c93..c100e0fc9 100644 --- a/frontend/src/components/LeftoverMapPlot.tsx +++ b/frontend/src/components/LeftoverMapPlot.tsx @@ -322,6 +322,9 @@ function leftoverMapPlotPostText( * ADR 0353 fail-closes leftover-map comparison leftover-pair leftover-map post leftover-map origin leftover-map * person coordinates through leftoverMapCompareListPostBadge independently of leftover-map * pair leftover-map post leftover-map origin leftover-map person coordinates, not this graphic. + * ADR 0354 fail-closes leftover-map comparison leftover-pair leftover-map criterion leftover-map origin leftover-map + * item coordinates through leftoverMapCompareListCriterionBadge independently of leftover-map + * comparison leftover-pair leftover-map post leftover-map origin leftover-map person coordinates, not this graphic. * Never invent a leftover score. */ export function LeftoverMapPlot({ diff --git a/frontend/src/components/LeftoverPairList.tsx b/frontend/src/components/LeftoverPairList.tsx index ab69ba694..e3e7d1b2a 100644 --- a/frontend/src/components/LeftoverPairList.tsx +++ b/frontend/src/components/LeftoverPairList.tsx @@ -154,6 +154,8 @@ export type LeftoverPairListProps = { * not this pair list. * ADR 0342 captions leftover-map comparison leftover-pair leftover-map criterion leftover-map item coordinates through leftoverMapCompareListCriterionBadge, * not this pair list. + * ADR 0354 captions leftover-map origin on leftover-map comparison leftover-pair leftover-map criterion leftover-map item coordinates through leftoverMapCompareListCriterionBadge, + * 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 6e79b3697..29aa45765 100644 --- a/frontend/src/i18n.test.ts +++ b/frontend/src/i18n.test.ts @@ -67,6 +67,7 @@ describe("i18n", () => { "leftover map comparison leftover pair leftover-map post {title} at ξ {person}", "leftover map comparison leftover pair leftover-map post {title} at leftover-map origin ξ {person}", "leftover map comparison leftover pair leftover-map criterion {label} at ζ {item}", + "leftover map comparison leftover pair leftover-map criterion {label} at leftover-map origin ζ {item}", "Open this post to read the criterion it sat closest to after main effects.", "Open this post to read the criterion it sat farthest from after main effects.", "Leftover map leaves unexplained U {value} after IRT main effects. Open this post to read {criterion}.", diff --git a/frontend/src/i18n.ts b/frontend/src/i18n.ts index 6deb16be6..84aa84d22 100644 --- a/frontend/src/i18n.ts +++ b/frontend/src/i18n.ts @@ -679,6 +679,8 @@ const TRANSLATIONS: Partial>> = { "잔여 지도 비교 잔여 쌍 잔여 지도 원점 글 {title} (ξ {person})", "leftover map comparison leftover pair leftover-map criterion {label} at ζ {item}": "잔여 지도 비교 잔여 쌍 잔여 지도 기준 {label} (ζ {item})", + "leftover map comparison leftover pair leftover-map criterion {label} at leftover-map origin ζ {item}": + "잔여 지도 비교 잔여 쌍 잔여 지도 원점 기준 {label} (ζ {item})", "Open this post to read the criterion it sat closest to after main effects.": "주효과 이후 가장 가깝게 앉은 기준을 읽으려면 이 글을 여세요.", "Open this post to read the criterion it sat farthest from after main effects.": @@ -1411,6 +1413,8 @@ const TRANSLATIONS: Partial>> = { "残差图比较残差配对残差图原点帖子 {title}(ξ {person})", "leftover map comparison leftover pair leftover-map criterion {label} at ζ {item}": "残差图比较残差配对残差图准则 {label}(ζ {item})", + "leftover map comparison leftover pair leftover-map criterion {label} at leftover-map origin ζ {item}": + "残差图比较残差配对残差图原点准则 {label}(ζ {item})", "Open this post to read the criterion it sat closest to after main effects.": "打开这篇帖子,阅读主效应后距离最近的准则。", "Open this post to read the criterion it sat farthest from after main effects.": @@ -2147,6 +2151,8 @@ const TRANSLATIONS: Partial>> = { "残差マップ比較の残差ペアの残差マップ原点投稿 {title}(ξ {person})", "leftover map comparison leftover pair leftover-map criterion {label} at ζ {item}": "残差マップ比較の残差ペアの残差マップ基準 {label}(ζ {item})", + "leftover map comparison leftover pair leftover-map criterion {label} at leftover-map origin ζ {item}": + "残差マップ比較の残差ペアの残差マップ原点基準 {label}(ζ {item})", "Open this post to read the criterion it sat closest to after main effects.": "主効果後に最も近くなった基準を読むには、この投稿を開いてください。", "Open this post to read the criterion it sat farthest from after main effects.": @@ -2887,6 +2893,8 @@ const TRANSLATIONS: Partial>> = { "Cặp phần dư so sánh bản đồ phần dư bài gốc {title} tại ξ {person}", "leftover map comparison leftover pair leftover-map criterion {label} at ζ {item}": "Cặp phần dư so sánh bản đồ phần dư tiêu chí {label} tại ζ {item}", + "leftover map comparison leftover pair leftover-map criterion {label} at leftover-map origin ζ {item}": + "Cặp phần dư so sánh bản đồ phần dư tiêu chí gốc {label} tại ζ {item}", "Open this post to read the criterion it sat closest to after main effects.": "Mở bài viết này để đọc tiêu chí nằm gần nhất sau hiệu ứng chính.", "Open this post to read the criterion it sat farthest from after main effects.": diff --git a/frontend/src/leftoverMapAxisBadge.ts b/frontend/src/leftoverMapAxisBadge.ts index 0f66f8f86..f45c9b22f 100644 --- a/frontend/src/leftoverMapAxisBadge.ts +++ b/frontend/src/leftoverMapAxisBadge.ts @@ -44,6 +44,8 @@ * item coordinates as leftoverMapListCriterionBadge, not this helper. * ADR 0353 names leftover-map origin on leftover-map comparison leftover-pair leftover-map post leftover-map * person coordinates as leftoverMapCompareListPostBadge, not this helper. + * ADR 0354 names leftover-map origin on leftover-map comparison leftover-pair leftover-map criterion leftover-map + * item coordinates as leftoverMapCompareListCriterionBadge, not this helper. */ import type { LeftoverMapAxis } from "./api"; diff --git a/frontend/src/leftoverMapCoordinates.test.ts b/frontend/src/leftoverMapCoordinates.test.ts index dffa5b514..ea80317f4 100644 --- a/frontend/src/leftoverMapCoordinates.test.ts +++ b/frontend/src/leftoverMapCoordinates.test.ts @@ -25,6 +25,7 @@ import { LEFTOVER_MAP_COMPARE_LIST_POST_ACTION, LEFTOVER_MAP_COMPARE_LIST_POST_ACTION_ORIGIN, LEFTOVER_MAP_COMPARE_LIST_CRITERION, + LEFTOVER_MAP_COMPARE_LIST_CRITERION_ORIGIN, LEFTOVER_MAP_LIST_CRITERION, LEFTOVER_MAP_LIST_CRITERION_ORIGIN, LEFTOVER_MAP_LIST_POST_ACTION, @@ -135,6 +136,21 @@ describe("leftoverMapPlotCoordinatePairIsOrigin", () => { expect(leftoverMapComparePlotPostBadge("Public post", 0, 0)?.key).not.toBe( LEFTOVER_MAP_LIST_POST_ACTION_ORIGIN, ); + expect(leftoverMapCompareListCriterionBadge("sales-lead", 0, 0)?.key).toBe( + LEFTOVER_MAP_COMPARE_LIST_CRITERION_ORIGIN, + ); + expect(leftoverMapCompareListCriterionBadge("sales-lead", 0, 0)?.key).not.toBe( + LEFTOVER_MAP_COMPARE_LIST_CRITERION, + ); + expect(leftoverMapCompareListCriterionBadge("sales-lead", 0, 0)?.key).not.toBe( + LEFTOVER_MAP_LIST_CRITERION_ORIGIN, + ); + expect(leftoverMapCompareListCriterionBadge("sales-lead", 0, 0)?.key).not.toBe( + LEFTOVER_MAP_COMPARE_PLOT_CRITERION_ORIGIN, + ); + expect(leftoverMapCompareListPostBadge("Public post", 0, 0)?.key).not.toBe( + LEFTOVER_MAP_COMPARE_LIST_CRITERION_ORIGIN, + ); }); }); @@ -329,6 +345,9 @@ describe("leftoverMapCompareListPostBadge", () => { expect(leftoverMapListPostBadge("Public post", 0, 0)?.key).not.toBe( LEFTOVER_MAP_COMPARE_LIST_POST_ACTION_ORIGIN, ); + expect(leftoverMapCompareListCriterionBadge("sales-lead", 0, 0)?.key).not.toBe( + LEFTOVER_MAP_COMPARE_LIST_POST_ACTION_ORIGIN, + ); }); it("omits leftover-map person coordinates when ξ is missing or non-finite", () => { @@ -391,11 +410,14 @@ describe("leftoverMapCompareListCriterionBadge", () => { }); }); - it("names rank-0 origin leftover-map item coordinates as ζ (0.00, 0.00)", () => { + it("names rank-0 leftover-map origin leftover-map item coordinates independently of leftover-map comparison leftover-pair leftover-map post leftover-map origin leftover-map person coordinates", () => { expect(leftoverMapCompareListCriterionBadge("sales-lead", 0, 0)).toEqual({ - key: LEFTOVER_MAP_COMPARE_LIST_CRITERION, + key: LEFTOVER_MAP_COMPARE_LIST_CRITERION_ORIGIN, values: { label: "sales-lead", item: "(0.00, 0.00)" }, }); + expect(leftoverMapCompareListCriterionBadge("sales-lead", 0, 0)?.key).not.toBe( + LEFTOVER_MAP_COMPARE_LIST_CRITERION, + ); expect(leftoverMapCompareListCriterionBadge("sales-lead", 0, 0)?.key).not.toBe( LEFTOVER_MAP_COMPARE_PLOT_CRITERION_ORIGIN, ); @@ -408,6 +430,12 @@ describe("leftoverMapCompareListCriterionBadge", () => { expect(leftoverMapCompareListCriterionBadge("sales-lead", 0, 0)?.key).not.toBe( LEFTOVER_MAP_COMPARE_LIST_POST_ACTION_ORIGIN, ); + expect(leftoverMapListCriterionBadge("sales-lead", 0, 0)?.key).not.toBe( + LEFTOVER_MAP_COMPARE_LIST_CRITERION_ORIGIN, + ); + expect(leftoverMapCompareListPostBadge("Public post", 0, 0)?.key).not.toBe( + LEFTOVER_MAP_COMPARE_LIST_CRITERION_ORIGIN, + ); }); it("omits leftover-map item coordinates when ζ is missing or non-finite", () => { @@ -428,6 +456,14 @@ describe("leftoverMapCompareListCriterionBadge", () => { expect(LEFTOVER_MAP_COMPARE_LIST_CRITERION).toBe( "leftover map comparison leftover pair leftover-map criterion {label} at ζ {item}", ); + expect(LEFTOVER_MAP_COMPARE_LIST_CRITERION_ORIGIN).toBe( + "leftover map comparison leftover pair leftover-map criterion {label} at leftover-map origin ζ {item}", + ); + expect(LEFTOVER_MAP_COMPARE_LIST_CRITERION_ORIGIN).not.toBe(LEFTOVER_MAP_COMPARE_LIST_CRITERION); + expect(LEFTOVER_MAP_COMPARE_LIST_CRITERION_ORIGIN).not.toBe(LEFTOVER_MAP_LIST_CRITERION_ORIGIN); + expect(LEFTOVER_MAP_COMPARE_LIST_CRITERION_ORIGIN).not.toBe(LEFTOVER_MAP_PLOT_CRITERION_ORIGIN); + expect(LEFTOVER_MAP_COMPARE_LIST_CRITERION_ORIGIN).not.toBe(LEFTOVER_MAP_COMPARE_PLOT_CRITERION_ORIGIN); + expect(LEFTOVER_MAP_COMPARE_LIST_CRITERION_ORIGIN).not.toBe(LEFTOVER_MAP_COMPARE_LIST_POST_ACTION_ORIGIN); expect(LEFTOVER_MAP_COMPARE_LIST_CRITERION).not.toBe(LEFTOVER_MAP_LIST_CRITERION); expect(LEFTOVER_MAP_COMPARE_LIST_CRITERION).not.toBe(LEFTOVER_MAP_LIST_CRITERION_ORIGIN); expect(LEFTOVER_MAP_COMPARE_LIST_CRITERION).not.toBe(LEFTOVER_MAP_PLOT_CRITERION); @@ -450,5 +486,8 @@ describe("leftoverMapCompareListCriterionBadge", () => { expect(leftoverMapCompareListCriterionBadge("sales-lead", 0.5, -0.02)?.key).not.toBe( LEFTOVER_MAP_LIST_CRITERION_ORIGIN, ); + expect(leftoverMapCompareListCriterionBadge("sales-lead", 0.5, -0.02)?.key).not.toBe( + LEFTOVER_MAP_COMPARE_LIST_CRITERION_ORIGIN, + ); }); }); diff --git a/frontend/src/leftoverMapCoordinates.ts b/frontend/src/leftoverMapCoordinates.ts index bc6cb2dd3..188305002 100644 --- a/frontend/src/leftoverMapCoordinates.ts +++ b/frontend/src/leftoverMapCoordinates.ts @@ -22,11 +22,14 @@ * ADR 0352 names leftover-map origin on leftover-map pair leftover-map criterion leftover-map * item coordinates as leftoverMapListCriterionBadge independently of leftover-map pair leftover-map post leftover-map * origin leftover-map person coordinates. leftoverMapCompareListCriterionBadge stays leftover-map comparison leftover-pair leftover-map - * criterion leftover-map item coordinate keys. + * criterion leftover-map item coordinate keys until ADR 0354. * ADR 0353 names leftover-map origin on leftover-map comparison leftover-pair leftover-map post leftover-map * person coordinates as leftoverMapCompareListPostBadge independently of leftover-map pair leftover-map post leftover-map * origin leftover-map person coordinates. leftoverMapCompareListCriterionBadge stays leftover-map comparison leftover-pair leftover-map - * criterion leftover-map item coordinate keys. + * criterion leftover-map item coordinate keys until ADR 0354. + * ADR 0354 names leftover-map origin on leftover-map comparison leftover-pair leftover-map criterion leftover-map + * item coordinates as leftoverMapCompareListCriterionBadge independently of leftover-map comparison leftover-pair leftover-map post leftover-map + * origin leftover-map person coordinates. */ import { formatSignedLeftoverValue } from "./leftoverMapUnexplained"; @@ -58,6 +61,9 @@ export const LEFTOVER_MAP_COMPARE_LIST_POST_ACTION_ORIGIN = export const LEFTOVER_MAP_COMPARE_LIST_CRITERION = "leftover map comparison leftover pair leftover-map criterion {label} at ζ {item}"; +export const LEFTOVER_MAP_COMPARE_LIST_CRITERION_ORIGIN = + "leftover map comparison leftover pair leftover-map criterion {label} at leftover-map origin ζ {item}"; + const PERSON_BADGE = "\u03BE"; const ITEM_BADGE = "\u03B6"; @@ -122,6 +128,8 @@ export function formatLeftoverMapCoordinates( * item coordinates as leftoverMapListCriterionBadge, not this helper. * ADR 0353 names leftover-map origin on leftover-map comparison leftover-pair leftover-map post leftover-map * person coordinates as leftoverMapCompareListPostBadge, not this helper. + * ADR 0354 names leftover-map origin on leftover-map comparison leftover-pair leftover-map criterion leftover-map + * item coordinates as leftoverMapCompareListCriterionBadge, not this helper. */ export function leftoverMapListPostBadge( title: string, @@ -147,6 +155,8 @@ export function leftoverMapListPostBadge( * ADR 0352 names leftover-map origin on leftover-map pair leftover-map criterion leftover-map * item coordinates as leftoverMapListCriterionBadge independently of leftover-map pair leftover-map post leftover-map * origin leftover-map person coordinates. + * ADR 0354 names leftover-map origin on leftover-map comparison leftover-pair leftover-map criterion leftover-map + * item coordinates as leftoverMapCompareListCriterionBadge, not this helper. */ export function leftoverMapListCriterionBadge( label: string, @@ -170,6 +180,8 @@ export function leftoverMapListCriterionBadge( * ADR 0353 names leftover-map origin on leftover-map comparison leftover-pair leftover-map post leftover-map * person coordinates as leftoverMapCompareListPostBadge independently of leftover-map pair leftover-map post leftover-map * origin leftover-map person coordinates. + * ADR 0354 names leftover-map origin on leftover-map comparison leftover-pair leftover-map criterion leftover-map + * item coordinates as leftoverMapCompareListCriterionBadge, not this helper. */ export function leftoverMapCompareListPostBadge( title: string, @@ -194,6 +206,9 @@ export function leftoverMapCompareListPostBadge( * item coordinates as leftoverMapListCriterionBadge, not this helper. * ADR 0353 names leftover-map origin on leftover-map comparison leftover-pair leftover-map post leftover-map * person coordinates as leftoverMapCompareListPostBadge, not this helper. + * ADR 0354 names leftover-map origin on leftover-map comparison leftover-pair leftover-map criterion leftover-map + * item coordinates as leftoverMapCompareListCriterionBadge independently of leftover-map comparison leftover-pair leftover-map post leftover-map + * origin leftover-map person coordinates. */ export function leftoverMapCompareListCriterionBadge( label: string, @@ -204,5 +219,9 @@ export function leftoverMapCompareListCriterionBadge( if (item === null) { return null; } - return { key: LEFTOVER_MAP_COMPARE_LIST_CRITERION, values: { label, item } }; + const origin = leftoverMapPlotCoordinatePairIsOrigin(item); + return { + key: origin ? LEFTOVER_MAP_COMPARE_LIST_CRITERION_ORIGIN : LEFTOVER_MAP_COMPARE_LIST_CRITERION, + values: { label, item }, + }; } diff --git a/frontend/src/leftoverMapPlotAxisSingular.ts b/frontend/src/leftoverMapPlotAxisSingular.ts index d23a44c80..99a542a72 100644 --- a/frontend/src/leftoverMapPlotAxisSingular.ts +++ b/frontend/src/leftoverMapPlotAxisSingular.ts @@ -61,6 +61,9 @@ * ADR 0353 names leftover-map origin on leftover-map comparison leftover-pair leftover-map post leftover-map * person coordinates as leftoverMapCompareListPostBadge independently of leftover-map pair leftover-map post leftover-map * origin leftover-map person coordinates, not leftoverMapPlotTickAxisBadge. + * ADR 0354 names leftover-map origin on leftover-map comparison leftover-pair leftover-map criterion leftover-map + * item coordinates as leftoverMapCompareListCriterionBadge independently of leftover-map comparison leftover-pair leftover-map post leftover-map + * origin leftover-map person coordinates, not leftoverMapPlotTickAxisBadge. */ import type { LeftoverMapAxis } from "./api"; diff --git a/frontend/src/leftoverMapPlotLayout.test.ts b/frontend/src/leftoverMapPlotLayout.test.ts index 6c76d5ea0..66ed137fa 100644 --- a/frontend/src/leftoverMapPlotLayout.test.ts +++ b/frontend/src/leftoverMapPlotLayout.test.ts @@ -1303,6 +1303,12 @@ describe("leftoverMapComparePlotCriterionBadge", () => { expect(leftoverMapPlotCriterionBadge("sales-lead", 0, 0)?.key).not.toBe( LEFTOVER_MAP_COMPARE_PLOT_CRITERION_ORIGIN, ); + expect(leftoverMapCompareListCriterionBadge("sales-lead", 0, 0)?.key).not.toBe( + LEFTOVER_MAP_COMPARE_PLOT_CRITERION_ORIGIN, + ); + expect(leftoverMapComparePlotCriterionBadge("sales-lead", 0, 0)?.key).not.toBe( + leftoverMapCompareListCriterionBadge("sales-lead", 0, 0)?.key ?? "", + ); }); it("omits leftover-map item coordinates when ζ is missing or non-finite", () => { @@ -1341,6 +1347,9 @@ describe("leftoverMapComparePlotCriterionBadge", () => { expect(leftoverMapComparePlotCriterionBadge("sales-lead", 0.5, -0.02)?.key).not.toBe( leftoverMapCompareListCriterionBadge("sales-lead", 0.5, -0.02)?.key ?? "", ); + expect(leftoverMapCompareListCriterionBadge("sales-lead", 0, 0)?.key).not.toBe( + leftoverMapComparePlotCriterionBadge("sales-lead", 0, 0)?.key ?? "", + ); }); }); diff --git a/frontend/src/leftoverMapPlotLayout.ts b/frontend/src/leftoverMapPlotLayout.ts index 013e6bd0c..5d13d8a69 100644 --- a/frontend/src/leftoverMapPlotLayout.ts +++ b/frontend/src/leftoverMapPlotLayout.ts @@ -187,6 +187,10 @@ * person coordinates through leftoverMapCompareListPostBadge independently of leftover-map * pair leftover-map post leftover-map origin leftover-map person coordinates ξ, not leftover-map pair leftover-map post leftover-map * person coordinates. + * ADR 0354 fail-closes leftover-map comparison leftover-pair leftover-map criterion leftover-map origin leftover-map + * item coordinates through leftoverMapCompareListCriterionBadge independently of leftover-map + * comparison leftover-pair leftover-map post leftover-map origin leftover-map person coordinates ξ, not leftover-map pair leftover-map criterion leftover-map + * item coordinates. */ import { formatLeftoverMapCoordinatePair, leftoverMapPlotCoordinatePairIsOrigin } from "./leftoverMapCoordinates"; diff --git a/pyproject.toml b/pyproject.toml index 5866f6380..f70ea4a5f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "lineageweave" -version = "2.110.0" +version = "2.111.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" }