From f2a1860185714d2921162a754425065d867bcce6 Mon Sep 17 00:00:00 2001 From: seonghobae Date: Mon, 31 Aug 2026 17:23:08 +0000 Subject: [PATCH] feat(reports): leftover-map origin on leftover-map comparison graphic leftover-map post leftover-map person coordinates independently of leftover-map graphic leftover-map post leftover-map origin leftover-map person coordinates (v2.106.0) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Caption leftover-map comparison graphic leftover-map post leftover-map origin leftover-map person coordinates through leftoverMapComparePlotPostBadge independently of leftover-map graphic leftover-map post leftover-map origin leftover-map person coordinates (ADR 0349). Distinct accessible name Open leftover map comparison graphic leftover-map post {title} at leftover-map origin ξ {person} when leftoverMapPlotCoordinatePairIsOrigin returns true. Rank-0 unused axes still name leftover-map origin (0.00, 0.00). leftoverMapPlotPostBadge stays leftover-map graphic leftover-map post leftover-map origin leftover-map person coordinate keys. leftoverMapComparePlotCriterionBadge stays leftover-map comparison graphic leftover-map criterion leftover-map item coordinate keys. Do not invent leftover-map origin from leftover-map item coordinates ζ. Do not mix #877. --- AGENTS.md | 7 ++ ARCHITECTURE.md | 2 + ...over-map-compare-plot-post-origin-badge.md | 12 +++ CHANGELOG.md | 10 +++ ...tover-map-compare-plot-post-coordinates.md | 4 +- ...over-map-compare-plot-post-origin-badge.md | 88 +++++++++++++++++++ docs/product-technical-gap-baseline.md | 10 +++ frontend/package.json | 2 +- .../src/components/LeftoverMapPlot.test.tsx | 7 +- frontend/src/components/LeftoverMapPlot.tsx | 4 +- frontend/src/i18n.test.ts | 19 ++++ frontend/src/i18n.ts | 8 ++ frontend/src/leftoverMapAxisBadge.ts | 2 + frontend/src/leftoverMapCoordinates.test.ts | 18 ++++ frontend/src/leftoverMapCoordinates.ts | 6 ++ frontend/src/leftoverMapPlotAxisSingular.ts | 3 + frontend/src/leftoverMapPlotLayout.test.ts | 31 ++++++- frontend/src/leftoverMapPlotLayout.ts | 13 ++- pyproject.toml | 2 +- 19 files changed, 240 insertions(+), 8 deletions(-) create mode 100644 CHANGELOG.d/2.106.0-leftover-map-compare-plot-post-origin-badge.md create mode 100644 docs/adr/0349-leftover-map-compare-plot-post-origin-badge.md diff --git a/AGENTS.md b/AGENTS.md index 347e41661..b83fd7c22 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -856,6 +856,11 @@ returns a leftover-map origin leftover-map person coordinate caption independent `Open 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 `ζ`. leftoverMapComparePlotPostBadge stays leftover-map comparison graphic leftover-map post leftover-map person coordinate keys. leftoverMapPlotCriterionBadge stays leftover-map graphic leftover-map criterion leftover-map origin leftover-map item coordinate keys this increment. +ADR 0349 captions leftover-map comparison graphic leftover-map post leftover-map origin leftover-map person coordinates with leftover-map origin when leftoverMapComparePlotPostBadge +returns a leftover-map origin leftover-map person coordinate caption independently of leftover-map graphic leftover-map post leftover-map origin leftover-map person coordinates. Distinct accessible name +`Open leftover map comparison graphic 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 `ζ`. leftoverMapPlotPostBadge stays leftover-map graphic leftover-map +post leftover-map origin leftover-map person coordinate keys. leftoverMapComparePlotCriterionBadge stays leftover-map comparison graphic leftover-map criterion 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 @@ -1041,6 +1046,8 @@ Leftover-map graphic leftover-map criterion leftover-map origin leftover-map ite (ADR 0347) captions leftover-map graphic leftover-map criterion leftover-map origin leftover-map item coordinates when leftoverMapPlotCriterionBadge returns a leftover-map origin leftover-map item coordinate caption. Leftover-map graphic leftover-map post leftover-map origin leftover-map person coordinates independently of leftover-map criterion leftover-map item coordinates (ADR 0348) captions leftover-map graphic leftover-map post leftover-map origin leftover-map person coordinates when leftoverMapPlotPostBadge returns a leftover-map origin leftover-map person coordinate caption. +Leftover-map comparison graphic leftover-map post leftover-map origin leftover-map person coordinates independently of leftover-map graphic leftover-map post leftover-map origin leftover-map person coordinates +(ADR 0349) captions leftover-map comparison graphic leftover-map post leftover-map origin leftover-map person coordinates when leftoverMapComparePlotPostBadge returns a leftover-map origin leftover-map person 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 e6bf0fd85..3d8a6e402 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -821,6 +821,8 @@ ADR 0347 captions leftover-map graphic leftover-map criterion leftover-map origi returns a leftover-map origin leftover-map item coordinate caption independently of leftover-map person coordinates. ADR 0348 captions leftover-map graphic leftover-map post leftover-map origin leftover-map person coordinates when leftoverMapPlotPostBadge returns a leftover-map origin leftover-map person coordinate caption independently of leftover-map criterion leftover-map item coordinates. +ADR 0349 captions leftover-map comparison graphic leftover-map post leftover-map origin leftover-map person coordinates when leftoverMapComparePlotPostBadge +returns a leftover-map origin leftover-map person coordinate caption independently of leftover-map graphic 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.106.0-leftover-map-compare-plot-post-origin-badge.md b/CHANGELOG.d/2.106.0-leftover-map-compare-plot-post-origin-badge.md new file mode 100644 index 000000000..565a01406 --- /dev/null +++ b/CHANGELOG.d/2.106.0-leftover-map-compare-plot-post-origin-badge.md @@ -0,0 +1,12 @@ +## 2.106.0 — Leftover-map origin on leftover-map comparison graphic leftover-map post leftover-map person coordinates independently of leftover-map graphic leftover-map post leftover-map origin leftover-map person coordinates + +- Caption leftover-map comparison graphic leftover-map post leftover-map origin leftover-map person coordinates through leftoverMapComparePlotPostBadge + independently of leftover-map graphic leftover-map post leftover-map origin leftover-map person coordinates (ADR 0349). After `make seed`, leftover-map comparison graphic leftover-map + post leftover-map origin leftover-map person coordinates name leftover-map origin when leftoverMapPlotCoordinatePairIsOrigin returns true. Distinct accessible name + `Open leftover map comparison graphic leftover-map post {title} at leftover-map origin ξ {person}`. Rank-0 unused axes still name leftover-map origin `(0.00, 0.00)`. + Non-origin leftover-map comparison graphic leftover-map post leftover-map person coordinates stay + `Open leftover map comparison graphic leftover-map post {title} at ξ {person}`. leftoverMapPlotPostBadge stays leftover-map graphic leftover-map + post leftover-map origin leftover-map person coordinate keys. leftoverMapComparePlotCriterionBadge stays leftover-map comparison graphic leftover-map criterion leftover-map + item coordinate keys this increment. Do not invent leftover-map origin from leftover-map item 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 78e3264ba..a97a8a249 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 graphic leftover-map post leftover-map origin leftover-map person coordinates + through leftoverMapComparePlotPostBadge independently of leftover-map graphic leftover-map post leftover-map origin leftover-map person coordinates (ADR 0349 / v2.106.0). After `make seed`, leftover-map comparison graphic leftover-map + post leftover-map origin leftover-map person coordinates name leftover-map origin when leftoverMapPlotCoordinatePairIsOrigin returns true. Distinct accessible name + `Open leftover map comparison graphic leftover-map post {title} at leftover-map origin ξ {person}`. Rank-0 unused axes still name leftover-map origin `(0.00, 0.00)`. + Non-origin leftover-map comparison graphic leftover-map post leftover-map person coordinates stay + `Open leftover map comparison graphic leftover-map post {title} at ξ {person}`. leftoverMapPlotPostBadge stays leftover-map graphic leftover-map + post leftover-map origin leftover-map person coordinate keys. leftoverMapComparePlotCriterionBadge stays leftover-map comparison graphic leftover-map criterion leftover-map + item coordinate keys this increment. Do not invent leftover-map origin from leftover-map item 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 graphic leftover-map post leftover-map origin leftover-map person coordinates through leftoverMapPlotPostBadge independently of leftover-map criterion leftover-map item coordinates (ADR 0348 / v2.105.0). After `make seed`, leftover-map graphic 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/0337-leftover-map-compare-plot-post-coordinates.md b/docs/adr/0337-leftover-map-compare-plot-post-coordinates.md index dc0122fe1..dc32fd301 100644 --- a/docs/adr/0337-leftover-map-compare-plot-post-coordinates.md +++ b/docs/adr/0337-leftover-map-compare-plot-post-coordinates.md @@ -4,7 +4,9 @@ **Date:** 2026-08-31 **Amended by:** [ADR 0338](0338-leftover-map-plot-post-coordinates.md) -(leftover-map person coordinates on leftover-map graphic leftover-map post markers) +(leftover-map person coordinates on leftover-map graphic leftover-map post markers); +[ADR 0349](0349-leftover-map-compare-plot-post-origin-badge.md) +(leftover-map origin on leftover-map comparison graphic leftover-map post leftover-map person coordinates independently of leftover-map graphic leftover-map post leftover-map origin leftover-map person coordinates) Amends leftover-map graphic display of persisted coordinates on the grouping comparison strip ([ADR 0304](0304-leftover-map-compare-graphic.md)), leftover-map comparison graphic leftover-map criterion leftover-map item coordinates diff --git a/docs/adr/0349-leftover-map-compare-plot-post-origin-badge.md b/docs/adr/0349-leftover-map-compare-plot-post-origin-badge.md new file mode 100644 index 000000000..f72db4703 --- /dev/null +++ b/docs/adr/0349-leftover-map-compare-plot-post-origin-badge.md @@ -0,0 +1,88 @@ +# ADR 0349 — Name leftover-map origin on leftover-map comparison graphic leftover-map post leftover-map person coordinates independently of leftover-map graphic leftover-map post leftover-map origin leftover-map person coordinates + +**Decision status:** Accepted +**Date:** 2026-08-31 + +Amends leftover-map person coordinates on leftover-map comparison graphic leftover-map post markers independently of leftover-map criterion leftover-map item coordinates +([ADR 0337](0337-leftover-map-compare-plot-post-coordinates.md)). Independent of leftover-map graphic leftover-map post leftover-map origin leftover-map person coordinates independently of leftover-map criterion leftover-map item coordinates +([ADR 0348](0348-leftover-map-plot-post-origin-badge.md)). Independent of leftover-map graphic leftover-map criterion leftover-map origin leftover-map item coordinates independently of leftover-map person coordinates +([ADR 0347](0347-leftover-map-plot-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)). Independent of leftover-map leftover-axis origin ticks on the competing origin-tick stack (do not mix #877). + +## Context + +ADR 0337 already names leftover-map comparison graphic leftover-map post leftover-map person coordinates +`Open leftover map comparison graphic leftover-map post {title} at ξ {person}`. Rank-0 unused axes still persist leftover-map +origin `(0.00, 0.00)` (`formatSignedLeftoverValue(0)` emits no plus). Origin leftover-map +person coordinates still interpolate leftover-map origin only through leftover-map comparison graphic leftover-map post leftover-map +person coordinate keys. A missing or non-finite leftover-map person coordinate pair omits independently +of leftover-map item coordinates `ζ`. A finite negative leftover is shown, never clamped. +Do not invent leftover-map origin from leftover-map item coordinates `ζ`. leftoverMapPlotPostBadge stays +`Open leftover-map post {title} at leftover-map origin ξ {person}` +this increment. leftoverMapComparePlotCriterionBadge stays leftover-map comparison graphic leftover-map criterion leftover-map +item coordinate keys this increment. + +This increment names leftover-map comparison graphic leftover-map post leftover-map origin leftover-map +person coordinates as leftoverMapComparePlotPostBadge. Leftover-map comparison graphic leftover-map post leftover-map origin leftover-map +person coordinates stay +`Open leftover map comparison graphic leftover-map post {title} at leftover-map origin ξ {person}` +when leftoverMapPlotCoordinatePairIsOrigin returns true, so they stay distinct from leftover-map +comparison graphic leftover-map post leftover-map person coordinates +`Open leftover map comparison graphic leftover-map post {title} at ξ {person}`, +leftover-map graphic leftover-map post leftover-map origin leftover-map person coordinates +`Open leftover-map post {title} at leftover-map origin ξ {person}`, +and leftover-map graphic leftover-map criterion leftover-map origin leftover-map item coordinates +`leftover-map criterion {label} at leftover-map origin ζ {item}`. +It does not add columns. Do not invent a leftover score. Do not invent a theta. + +This protected increment uses **0349** so it does not collide with leftover-map graphic leftover-map +post leftover-map origin leftover-map person coordinates independently of leftover-map criterion leftover-map item coordinates +(0348) or leftover-map leftover-axis origin ticks (#877). + +## Decision + +On leftover-map comparison graphic leftover-map post markers, 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 person coordinates stay leftover-map comparison graphic leftover-map post leftover-map +person coordinate keys. leftoverMapPlotPostBadge, leftoverMapPlotCriterionBadge, +leftoverMapComparePlotCriterionBadge, leftoverMapListPostBadge, leftoverMapCompareListPostBadge, 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 graphic leftover-map post leftover-map origin leftover-map person +coordinates name leftover-map origin independently of leftover-map graphic leftover-map post leftover-map origin leftover-map person coordinates. Rank-0 unused +axes still name leftover-map origin `(0.00, 0.00)`. leftoverMapPlotPostBadge stays leftover-map graphic leftover-map +post leftover-map origin leftover-map person coordinate keys. leftoverMapComparePlotCriterionBadge +stays leftover-map comparison graphic leftover-map criterion leftover-map item coordinate keys. leftover-map comparison graphic leftover-map +post leftover-map person coordinates independently of leftover-map criterion leftover-map item coordinates +(ADR 0337) remain. + +## Related + +Independent of leftover-map graphic leftover-map post leftover-map origin leftover-map person +coordinates independently of leftover-map criterion leftover-map item coordinates +([ADR 0348](0348-leftover-map-plot-post-origin-badge.md)). Independent of leftover-map +person coordinates on leftover-map comparison graphic leftover-map post markers independently of leftover-map +criterion leftover-map item coordinates ([ADR 0337](0337-leftover-map-compare-plot-post-coordinates.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)). Independent of leftover-map +graphic leftover-map criterion leftover-map origin leftover-map item coordinates independently of leftover-map +person coordinates ([ADR 0347](0347-leftover-map-plot-criterion-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 48dad4fcc..ac310e3d2 100644 --- a/docs/product-technical-gap-baseline.md +++ b/docs/product-technical-gap-baseline.md @@ -1,5 +1,15 @@ # Product & Technical Gap Baseline +> Exact-head loop overlay: 2026-09-01 02:25 KST. Protected `main` is +> `cb187cadee5fb6c46d8a944815ccc154a1e028d1`. Writes work. Do not +> self-approve. #892 leftover-map graphic leftover-map post leftover-map origin leftover-map +> person coordinates independently of leftover-map criterion leftover-map item coordinates (v2.105.0 / ADR 0348) is +> `c941929`, stacked on #891 @ `47dd988`. Independent APPROVE is missing (Devin COMMENTED, +> not APPROVE). Next buyer increment on this cycle: leftover-map comparison graphic leftover-map post leftover-map origin leftover-map +> person coordinates independently of leftover-map graphic leftover-map post leftover-map origin leftover-map person coordinates as leftoverMapComparePlotPostBadge (ADR 0349 / v2.106.0) delivered locally on +> `feat/leftover-map-compare-plot-post-origin-badge-v21060`. Distinct accessible name +> `Open leftover map comparison graphic leftover-map post {title} at leftover-map origin ξ {person}`. Rank-0 unused axes still name leftover-map origin `(0.00, 0.00)`. leftoverMapPlotPostBadge stays leftover-map graphic leftover-map post leftover-map origin leftover-map person coordinate keys. leftoverMapComparePlotCriterionBadge stays leftover-map comparison graphic leftover-map criterion leftover-map item coordinate keys. Do not invent leftover-map origin from leftover-map item coordinates `ζ`. Do not mix #877. Stack onto #892. 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 closed as weaker duplicate of #91. + > Exact-head loop overlay: 2026-09-01 02:20 KST. Protected `main` is > `cb187cadee5fb6c46d8a944815ccc154a1e028d1`. Writes work. Do not > self-approve. #891 leftover-map graphic leftover-map criterion leftover-map origin leftover-map diff --git a/frontend/package.json b/frontend/package.json index b94b545db..f4c502de3 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,7 +1,7 @@ { "name": "frontend", "private": true, - "version": "2.105.0", + "version": "2.106.0", "type": "module", "scripts": { "dev": "vite", diff --git a/frontend/src/components/LeftoverMapPlot.test.tsx b/frontend/src/components/LeftoverMapPlot.test.tsx index 9ccf3aaa6..ccb6c94ab 100644 --- a/frontend/src/components/LeftoverMapPlot.test.tsx +++ b/frontend/src/components/LeftoverMapPlot.test.tsx @@ -1004,9 +1004,14 @@ describe("LeftoverMapPlot", () => { ).toBeInTheDocument(); expect( screen.getByRole("button", { - name: "Open leftover map comparison graphic leftover-map post Public post at ξ (0.00, 0.00)", + name: "Open leftover map comparison graphic leftover-map post Public post at leftover-map origin ξ (0.00, 0.00)", }), ).toBeInTheDocument(); + expect( + screen.queryByRole("button", { + name: "Open leftover map comparison graphic leftover-map post Public post at ξ (0.00, 0.00)", + }), + ).not.toBeInTheDocument(); expect( screen.queryByRole("button", { name: "Open leftover-map post Public post at ξ (0.00, 0.00)", diff --git a/frontend/src/components/LeftoverMapPlot.tsx b/frontend/src/components/LeftoverMapPlot.tsx index 58c7547e1..137206fe8 100644 --- a/frontend/src/components/LeftoverMapPlot.tsx +++ b/frontend/src/components/LeftoverMapPlot.tsx @@ -172,7 +172,9 @@ function leftoverMapPlotPostText( * returns true. Caption leftover-map comparison graphic leftover-map * criterion markers with persisted leftover-map item coordinates ``ζ_{1:2}`` * when leftoverMapComparePlotCriterionBadge returns a usable leftover-map comparison - * graphic leftover-map criterion leftover-map item coordinate caption. Caption leftover-map + * graphic leftover-map criterion leftover-map item coordinate caption. Caption leftover-map origin on leftover-map comparison graphic leftover-map + * post leftover-map person coordinates independently of leftover-map graphic leftover-map post leftover-map origin leftover-map person coordinates when leftoverMapPlotCoordinatePairIsOrigin + * returns true. Caption leftover-map * comparison graphic leftover-map post markers with persisted leftover-map person coordinates * ``ξ_{1:2}`` when leftoverMapComparePlotPostBadge returns a usable leftover-map comparison * graphic leftover-map post leftover-map person coordinate caption. Caption leftover-map graphic leftover-map diff --git a/frontend/src/i18n.test.ts b/frontend/src/i18n.test.ts index 73f53946c..483dfda89 100644 --- a/frontend/src/i18n.test.ts +++ b/frontend/src/i18n.test.ts @@ -174,6 +174,7 @@ describe("i18n", () => { "Open leftover-map post {title} at leftover-map origin ξ {person}", "Open leftover-map post {title}", "Open leftover map comparison graphic leftover-map post {title} at ξ {person}", + "Open leftover map comparison graphic leftover-map post {title} at leftover-map origin ξ {person}", "Read observed Y {observed} and expected E {expected} after IRT main effects, then open this post.", "Leftover map has no leftover structure after IRT main effects. Open this post.", "Leftover map rank {rank} after IRT main effects. Open this post.", @@ -537,6 +538,24 @@ describe("i18n", () => { ).toBe(expected); }); + it.each([ + ["ko", "잔여 지도 비교 그림 원점 글 Public post 열기 (ξ (0.00, 0.00))"], + ["zh", "打开残差地图比较图形原点帖子 Public post(ξ (0.00, 0.00))"], + ["ja", "残差マップの比較図の原点投稿 Public post を開く(ξ (0.00, 0.00))"], + ["vi", "Mở bài gốc đồ họa so sánh bản đồ phần dư Public post tại ξ (0.00, 0.00)"], + ] as const)( + "formats leftover map comparison graphic leftover-map post leftover-map origin ξ in %s", + (locale, expected) => { + setLocale(locale); + expect( + tf("Open leftover map comparison graphic leftover-map post {title} at leftover-map origin ξ {person}", { + title: "Public post", + person: "(0.00, 0.00)", + }), + ).toBe(expected); + }, + ); + it.each([ ["ko", "잔여 지도 그림 포함 범위"], ["zh", "残差图图形覆盖范围"], diff --git a/frontend/src/i18n.ts b/frontend/src/i18n.ts index d45eb28e4..8763884df 100644 --- a/frontend/src/i18n.ts +++ b/frontend/src/i18n.ts @@ -701,6 +701,8 @@ const TRANSLATIONS: Partial>> = { "Open leftover-map post {title}": "잔여 지도 글 {title} 열기", "Open leftover map comparison graphic leftover-map post {title} at ξ {person}": "잔여 지도 비교 그림 글 {title} 열기 (ξ {person})", + "Open leftover map comparison graphic leftover-map post {title} at leftover-map origin ξ {person}": + "잔여 지도 비교 그림 원점 글 {title} 열기 (ξ {person})", "leftover-map axis 1": "잔여 지도 축 1", "leftover-map axis 2": "잔여 지도 축 2", "leftover-map axis {axis} ({share}%)": "잔여 지도 축 {axis} ({share}%)", @@ -1423,6 +1425,8 @@ const TRANSLATIONS: Partial>> = { "Open leftover-map post {title}": "打开残差图帖子 {title}", "Open leftover map comparison graphic leftover-map post {title} at ξ {person}": "打开残差地图比较图形帖子 {title}(ξ {person})", + "Open leftover map comparison graphic leftover-map post {title} at leftover-map origin ξ {person}": + "打开残差地图比较图形原点帖子 {title}(ξ {person})", "leftover-map axis 1": "残差图轴 1", "leftover-map axis 2": "残差图轴 2", "leftover-map axis {axis} ({share}%)": "残差图轴 {axis} ({share}%)", @@ -2149,6 +2153,8 @@ const TRANSLATIONS: Partial>> = { "Open leftover-map post {title}": "残差マップの投稿 {title} を開く", "Open leftover map comparison graphic leftover-map post {title} at ξ {person}": "残差マップの比較図の投稿 {title} を開く(ξ {person})", + "Open leftover map comparison graphic leftover-map post {title} at leftover-map origin ξ {person}": + "残差マップの比較図の原点投稿 {title} を開く(ξ {person})", "leftover-map axis 1": "残差マップ軸 1", "leftover-map axis 2": "残差マップ軸 2", "leftover-map axis {axis} ({share}%)": "残差マップ軸 {axis} ({share}%)", @@ -2879,6 +2885,8 @@ const TRANSLATIONS: Partial>> = { "Open leftover-map post {title}": "Mở bài viết bản đồ phần dư {title}", "Open leftover map comparison graphic leftover-map post {title} at ξ {person}": "Mở bài đồ họa so sánh bản đồ phần dư {title} tại ξ {person}", + "Open leftover map comparison graphic leftover-map post {title} at leftover-map origin ξ {person}": + "Mở bài gốc đồ họa so sánh bản đồ phần dư {title} tại ξ {person}", "leftover-map axis 1": "trục bản đồ phần dư 1", "leftover-map axis 2": "trục bản đồ phần dư 2", "leftover-map axis {axis} ({share}%)": "trục bản đồ phần dư {axis} ({share}%)", diff --git a/frontend/src/leftoverMapAxisBadge.ts b/frontend/src/leftoverMapAxisBadge.ts index eb81991fd..57fcb37ae 100644 --- a/frontend/src/leftoverMapAxisBadge.ts +++ b/frontend/src/leftoverMapAxisBadge.ts @@ -34,6 +34,8 @@ * item coordinates as leftoverMapPlotCriterionBadge, not this helper. * ADR 0348 names leftover-map origin on leftover-map graphic leftover-map post leftover-map * person coordinates as leftoverMapPlotPostBadge, not this helper. + * ADR 0349 names leftover-map origin on leftover-map comparison graphic leftover-map post leftover-map + * person coordinates as leftoverMapComparePlotPostBadge, not this helper. */ import type { LeftoverMapAxis } from "./api"; diff --git a/frontend/src/leftoverMapCoordinates.test.ts b/frontend/src/leftoverMapCoordinates.test.ts index e6be8c09e..4cf5bb6c1 100644 --- a/frontend/src/leftoverMapCoordinates.test.ts +++ b/frontend/src/leftoverMapCoordinates.test.ts @@ -6,6 +6,7 @@ import { leftoverMapPlotPostBadge, LEFTOVER_MAP_COMPARE_PLOT_CRITERION, LEFTOVER_MAP_COMPARE_PLOT_POST_ACTION, + LEFTOVER_MAP_COMPARE_PLOT_POST_ACTION_ORIGIN, LEFTOVER_MAP_PLOT_CRITERION, LEFTOVER_MAP_PLOT_CRITERION_ORIGIN, LEFTOVER_MAP_PLOT_POST_ACTION, @@ -80,13 +81,22 @@ describe("leftoverMapPlotCoordinatePairIsOrigin", () => { expect(leftoverMapPlotPostBadge("Public post", 0, 0)?.key).toBe(LEFTOVER_MAP_PLOT_POST_ACTION_ORIGIN); expect(leftoverMapPlotPostBadge("Public post", 0, 0)?.key).not.toBe(LEFTOVER_MAP_PLOT_CRITERION_ORIGIN); expect(leftoverMapPlotPostBadge("Public post", 0, 0)?.key).not.toBe(LEFTOVER_MAP_PLOT_POST_ACTION); + expect(leftoverMapComparePlotPostBadge("Public post", 0, 0)?.key).toBe( + LEFTOVER_MAP_COMPARE_PLOT_POST_ACTION_ORIGIN, + ); expect(leftoverMapComparePlotPostBadge("Public post", 0, 0)?.key).not.toBe( LEFTOVER_MAP_PLOT_POST_ACTION_ORIGIN, ); + expect(leftoverMapComparePlotPostBadge("Public post", 0, 0)?.key).not.toBe( + LEFTOVER_MAP_COMPARE_PLOT_POST_ACTION, + ); expect(leftoverMapListCriterionBadge("sales-lead", 0, 0)?.key).not.toBe( LEFTOVER_MAP_PLOT_CRITERION_ORIGIN, ); expect(leftoverMapListPostBadge("Public post", 0, 0)?.key).not.toBe(LEFTOVER_MAP_PLOT_POST_ACTION_ORIGIN); + expect(leftoverMapListPostBadge("Public post", 0, 0)?.key).not.toBe( + LEFTOVER_MAP_COMPARE_PLOT_POST_ACTION_ORIGIN, + ); }); }); @@ -108,6 +118,9 @@ describe("leftoverMapListPostBadge", () => { values: { title: "Public post", person: "(0.00, 0.00)" }, }); expect(leftoverMapListPostBadge("Public post", 0, 0)?.key).not.toBe(LEFTOVER_MAP_PLOT_POST_ACTION_ORIGIN); + expect(leftoverMapListPostBadge("Public post", 0, 0)?.key).not.toBe( + LEFTOVER_MAP_COMPARE_PLOT_POST_ACTION_ORIGIN, + ); }); it("omits leftover-map person coordinates when ξ is missing or non-finite", () => { @@ -129,6 +142,7 @@ describe("leftoverMapListPostBadge", () => { ); expect(LEFTOVER_MAP_LIST_POST_ACTION).not.toBe(LEFTOVER_MAP_PLOT_POST_ACTION); expect(LEFTOVER_MAP_LIST_POST_ACTION).not.toBe(LEFTOVER_MAP_PLOT_POST_ACTION_ORIGIN); + expect(LEFTOVER_MAP_LIST_POST_ACTION).not.toBe(LEFTOVER_MAP_COMPARE_PLOT_POST_ACTION_ORIGIN); expect(LEFTOVER_MAP_LIST_POST_ACTION).not.toBe(LEFTOVER_MAP_COMPARE_PLOT_POST_ACTION); expect(LEFTOVER_MAP_LIST_POST_ACTION).not.toBe(LEFTOVER_MAP_COMPARE_LIST_POST_ACTION); expect(leftoverMapListPostBadge("Public post", 0.5, 0.1)?.key).not.toBe( @@ -217,6 +231,9 @@ describe("leftoverMapCompareListPostBadge", () => { key: LEFTOVER_MAP_COMPARE_LIST_POST_ACTION, values: { title: "Public post", person: "(0.00, 0.00)" }, }); + expect(leftoverMapCompareListPostBadge("Public post", 0, 0)?.key).not.toBe( + LEFTOVER_MAP_COMPARE_PLOT_POST_ACTION_ORIGIN, + ); }); it("omits leftover-map person coordinates when ξ is missing or non-finite", () => { @@ -241,6 +258,7 @@ describe("leftoverMapCompareListPostBadge", () => { expect(LEFTOVER_MAP_COMPARE_LIST_POST_ACTION).not.toBe(LEFTOVER_MAP_LIST_POST_ACTION); expect(LEFTOVER_MAP_COMPARE_LIST_POST_ACTION).not.toBe(LEFTOVER_MAP_PLOT_POST_ACTION); expect(LEFTOVER_MAP_COMPARE_LIST_POST_ACTION).not.toBe(LEFTOVER_MAP_COMPARE_PLOT_POST_ACTION); + expect(LEFTOVER_MAP_COMPARE_LIST_POST_ACTION).not.toBe(LEFTOVER_MAP_COMPARE_PLOT_POST_ACTION_ORIGIN); expect(leftoverMapCompareListPostBadge("Public post", 0.5, 0.1)?.key).not.toBe( leftoverMapListPostBadge("Public post", 0.5, 0.1)?.key ?? "", ); diff --git a/frontend/src/leftoverMapCoordinates.ts b/frontend/src/leftoverMapCoordinates.ts index a0b1e7574..0518c9669 100644 --- a/frontend/src/leftoverMapCoordinates.ts +++ b/frontend/src/leftoverMapCoordinates.ts @@ -7,6 +7,10 @@ * post leftover-map person coordinates as leftoverMapPlotPostBadge independently of leftover-map * criterion leftover-map item coordinates. leftoverMapListPostBadge stays leftover-map pair leftover-map * post leftover-map person coordinate keys. + * ADR 0349 names leftover-map origin on leftover-map comparison graphic leftover-map + * post leftover-map person coordinates as leftoverMapComparePlotPostBadge independently of leftover-map + * graphic leftover-map post leftover-map origin leftover-map person coordinates. leftoverMapListPostBadge stays leftover-map pair leftover-map + * post leftover-map person coordinate keys. */ import { formatSignedLeftoverValue } from "./leftoverMapUnexplained"; @@ -84,6 +88,8 @@ export function formatLeftoverMapCoordinates( /** ADR 0339 leftover-map pair leftover-map post leftover-map person coordinates ξ. * ADR 0348 names leftover-map origin on leftover-map graphic leftover-map post leftover-map * person coordinates as leftoverMapPlotPostBadge, not this helper. + * ADR 0349 names leftover-map origin on leftover-map comparison graphic leftover-map post leftover-map + * person coordinates as leftoverMapComparePlotPostBadge, not this helper. */ export function leftoverMapListPostBadge( title: string, diff --git a/frontend/src/leftoverMapPlotAxisSingular.ts b/frontend/src/leftoverMapPlotAxisSingular.ts index 9ae05e2f8..eef2b2706 100644 --- a/frontend/src/leftoverMapPlotAxisSingular.ts +++ b/frontend/src/leftoverMapPlotAxisSingular.ts @@ -46,6 +46,9 @@ * ADR 0348 names leftover-map origin on leftover-map graphic leftover-map post leftover-map * person coordinates as leftoverMapPlotPostBadge independently of leftover-map criterion leftover-map * item coordinates, not leftoverMapPlotTickAxisBadge. + * ADR 0349 names leftover-map origin on leftover-map comparison graphic leftover-map post leftover-map + * person coordinates as leftoverMapComparePlotPostBadge independently of leftover-map graphic 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 ac8c7a976..be80eae59 100644 --- a/frontend/src/leftoverMapPlotLayout.test.ts +++ b/frontend/src/leftoverMapPlotLayout.test.ts @@ -30,6 +30,7 @@ import { LEFTOVER_MAP_PLOT_POST_ACTION_ORIGIN, LEFTOVER_MAP_PLOT_POST_ACTION_OMITTED, LEFTOVER_MAP_COMPARE_PLOT_POST_ACTION, + LEFTOVER_MAP_COMPARE_PLOT_POST_ACTION_ORIGIN, LEFTOVER_MAP_PLOT_TICK, PLOT_HEIGHT, PLOT_PADDING, @@ -1288,6 +1289,9 @@ describe("leftoverMapComparePlotCriterionBadge", () => { expect(leftoverMapComparePlotCriterionBadge("sales-lead", 0, 0)?.key).not.toBe( LEFTOVER_MAP_PLOT_CRITERION_ORIGIN, ); + expect(leftoverMapComparePlotCriterionBadge("sales-lead", 0, 0)?.key).not.toBe( + LEFTOVER_MAP_COMPARE_PLOT_POST_ACTION_ORIGIN, + ); }); it("omits leftover-map item coordinates when ζ is missing or non-finite", () => { @@ -1340,6 +1344,9 @@ describe("leftoverMapPlotPostBadge", () => { }); expect(leftoverMapPlotPostBadge("Public post", 0, 0)?.key).not.toBe(LEFTOVER_MAP_PLOT_POST_ACTION); expect(leftoverMapPlotPostBadge("Public post", 0, 0)?.key).not.toBe(LEFTOVER_MAP_COMPARE_PLOT_POST_ACTION); + expect(leftoverMapPlotPostBadge("Public post", 0, 0)?.key).not.toBe( + LEFTOVER_MAP_COMPARE_PLOT_POST_ACTION_ORIGIN, + ); expect(leftoverMapPlotCriterionBadge("sales-lead", 0, 0)?.key).not.toBe(LEFTOVER_MAP_PLOT_POST_ACTION_ORIGIN); }); @@ -1368,6 +1375,9 @@ describe("leftoverMapPlotPostBadge", () => { expect(leftoverMapPlotPostBadge("Public post", 0.5, 0.1)?.key).not.toBe( LEFTOVER_MAP_PLOT_POST_ACTION_ORIGIN, ); + expect(leftoverMapPlotPostBadge("Public post", 0.5, 0.1)?.key).not.toBe( + LEFTOVER_MAP_COMPARE_PLOT_POST_ACTION_ORIGIN, + ); expect(leftoverMapPlotPostBadge("Public post", 0.5, 0.1)?.key).not.toBe( LEFTOVER_MAP_PLOT_CRITERION, ); @@ -1386,14 +1396,23 @@ describe("leftoverMapComparePlotPostBadge", () => { }); }); - it("names rank-0 origin leftover-map person coordinates as ξ (0.00, 0.00)", () => { + it("names rank-0 leftover-map origin leftover-map person coordinates independently of leftover-map graphic leftover-map post leftover-map origin leftover-map person coordinates", () => { expect(leftoverMapComparePlotPostBadge("Public post", 0, 0)).toEqual({ - key: LEFTOVER_MAP_COMPARE_PLOT_POST_ACTION, + key: LEFTOVER_MAP_COMPARE_PLOT_POST_ACTION_ORIGIN, values: { title: "Public post", person: "(0.00, 0.00)" }, }); + expect(leftoverMapComparePlotPostBadge("Public post", 0, 0)?.key).not.toBe( + LEFTOVER_MAP_COMPARE_PLOT_POST_ACTION, + ); expect(leftoverMapComparePlotPostBadge("Public post", 0, 0)?.key).not.toBe( LEFTOVER_MAP_PLOT_POST_ACTION_ORIGIN, ); + expect(leftoverMapPlotPostBadge("Public post", 0, 0)?.key).not.toBe( + LEFTOVER_MAP_COMPARE_PLOT_POST_ACTION_ORIGIN, + ); + expect(leftoverMapComparePlotCriterionBadge("sales-lead", 0, 0)?.key).not.toBe( + LEFTOVER_MAP_COMPARE_PLOT_POST_ACTION_ORIGIN, + ); }); it("omits leftover-map person coordinates when ξ is missing or non-finite", () => { @@ -1407,6 +1426,11 @@ describe("leftoverMapComparePlotPostBadge", () => { expect(LEFTOVER_MAP_COMPARE_PLOT_POST_ACTION).toBe( "Open leftover map comparison graphic leftover-map post {title} at ξ {person}", ); + expect(LEFTOVER_MAP_COMPARE_PLOT_POST_ACTION_ORIGIN).toBe( + "Open leftover map comparison graphic leftover-map post {title} at leftover-map origin ξ {person}", + ); + expect(LEFTOVER_MAP_COMPARE_PLOT_POST_ACTION_ORIGIN).not.toBe(LEFTOVER_MAP_COMPARE_PLOT_POST_ACTION); + expect(LEFTOVER_MAP_COMPARE_PLOT_POST_ACTION_ORIGIN).not.toBe(LEFTOVER_MAP_PLOT_POST_ACTION_ORIGIN); expect(LEFTOVER_MAP_COMPARE_PLOT_POST_ACTION).not.toBe(LEFTOVER_MAP_PLOT_POST_ACTION); expect(LEFTOVER_MAP_COMPARE_PLOT_POST_ACTION).not.toBe(LEFTOVER_MAP_PLOT_POST_ACTION_ORIGIN); expect(LEFTOVER_MAP_COMPARE_PLOT_POST_ACTION).not.toBe(LEFTOVER_MAP_PLOT_POST_ACTION_OMITTED); @@ -1415,6 +1439,9 @@ describe("leftoverMapComparePlotPostBadge", () => { expect(leftoverMapComparePlotPostBadge("Public post", 0.5, 0.1)?.key).not.toBe( LEFTOVER_MAP_PLOT_POST_ACTION, ); + expect(leftoverMapComparePlotPostBadge("Public post", 0.5, 0.1)?.key).not.toBe( + LEFTOVER_MAP_COMPARE_PLOT_POST_ACTION_ORIGIN, + ); expect(leftoverMapComparePlotPostBadge("Public post", 0.5, 0.1)?.key).not.toBe( leftoverMapPlotPostBadge("Public post", 0.5, 0.1)?.key ?? "", ); diff --git a/frontend/src/leftoverMapPlotLayout.ts b/frontend/src/leftoverMapPlotLayout.ts index 0f34a8d66..fcc0343b3 100644 --- a/frontend/src/leftoverMapPlotLayout.ts +++ b/frontend/src/leftoverMapPlotLayout.ts @@ -167,6 +167,10 @@ * person coordinates through leftoverMapPlotPostBadge independently of leftover-map * criterion leftover-map item coordinates ζ, not leftover-map comparison graphic leftover-map post leftover-map * person coordinates. + * ADR 0349 fail-closes leftover-map comparison graphic leftover-map post leftover-map origin leftover-map + * person coordinates through leftoverMapComparePlotPostBadge independently of leftover-map + * graphic leftover-map post leftover-map origin leftover-map person coordinates ξ, not leftover-map graphic leftover-map post leftover-map + * person coordinates. */ import { formatLeftoverMapCoordinatePair, leftoverMapPlotCoordinatePairIsOrigin } from "./leftoverMapCoordinates"; @@ -205,6 +209,9 @@ export const LEFTOVER_MAP_PLOT_POST_ACTION_OMITTED = export const LEFTOVER_MAP_COMPARE_PLOT_POST_ACTION = "Open leftover map comparison graphic leftover-map post {title} at ξ {person}"; +export const LEFTOVER_MAP_COMPARE_PLOT_POST_ACTION_ORIGIN = + "Open leftover map comparison graphic leftover-map post {title} at leftover-map origin ξ {person}"; + export const LEFTOVER_MAP_PLOT_CRITERION = "leftover-map criterion {label} at ζ {item}"; @@ -277,7 +284,11 @@ export function leftoverMapComparePlotPostBadge( if (person === null) { return null; } - return { key: LEFTOVER_MAP_COMPARE_PLOT_POST_ACTION, values: { title, person } }; + const origin = leftoverMapPlotCoordinatePairIsOrigin(person); + return { + key: origin ? LEFTOVER_MAP_COMPARE_PLOT_POST_ACTION_ORIGIN : LEFTOVER_MAP_COMPARE_PLOT_POST_ACTION, + values: { title, person }, + }; } export const LEFTOVER_MAP_PLOT_TICK = diff --git a/pyproject.toml b/pyproject.toml index e4f8a7808..165418469 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "lineageweave" -version = "2.105.0" +version = "2.106.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" }