diff --git a/AGENTS.md b/AGENTS.md index b83fd7c22..dd1c2c6d7 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -861,6 +861,11 @@ returns a leftover-map origin leftover-map person coordinate caption independent `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. +ADR 0350 captions leftover-map comparison graphic leftover-map criterion leftover-map origin leftover-map item coordinates with leftover-map origin when leftoverMapComparePlotCriterionBadge +returns a leftover-map origin leftover-map item coordinate caption independently of leftover-map comparison graphic leftover-map post leftover-map origin leftover-map person coordinates. Distinct accessible name +`leftover map comparison graphic 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 `ξ`. leftoverMapPlotCriterionBadge stays leftover-map graphic leftover-map +criterion leftover-map origin leftover-map item coordinate keys. leftoverMapComparePlotPostBadge stays leftover-map comparison graphic leftover-map post leftover-map origin leftover-map person 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 @@ -1048,6 +1053,8 @@ Leftover-map graphic leftover-map post leftover-map origin leftover-map person c (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. +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) captions leftover-map comparison graphic leftover-map criterion leftover-map origin leftover-map item coordinates when leftoverMapComparePlotCriterionBadge 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 3d8a6e402..74d2633de 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -823,6 +823,8 @@ ADR 0348 captions leftover-map graphic leftover-map post leftover-map origin lef 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. +ADR 0350 captions leftover-map comparison graphic leftover-map criterion leftover-map origin leftover-map item coordinates when leftoverMapComparePlotCriterionBadge +returns a leftover-map origin leftover-map item coordinate caption independently of leftover-map comparison 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.107.0-leftover-map-compare-plot-criterion-origin-badge.md b/CHANGELOG.d/2.107.0-leftover-map-compare-plot-criterion-origin-badge.md new file mode 100644 index 000000000..ca80bfd09 --- /dev/null +++ b/CHANGELOG.d/2.107.0-leftover-map-compare-plot-criterion-origin-badge.md @@ -0,0 +1,12 @@ +## 2.107.0 — Leftover-map origin on leftover-map comparison graphic leftover-map criterion leftover-map item coordinates independently of leftover-map comparison graphic leftover-map post leftover-map origin leftover-map person coordinates + +- Caption leftover-map comparison graphic leftover-map criterion leftover-map origin leftover-map item coordinates through leftoverMapComparePlotCriterionBadge + independently of leftover-map comparison graphic leftover-map post leftover-map origin leftover-map person coordinates (ADR 0350). After `make seed`, leftover-map comparison graphic leftover-map + criterion leftover-map origin leftover-map item coordinates name leftover-map origin when leftoverMapPlotCoordinatePairIsOrigin returns true. Distinct accessible name + `leftover map comparison graphic 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 graphic leftover-map criterion leftover-map item coordinates stay + `leftover map comparison graphic leftover-map criterion {label} at ζ {item}`. leftoverMapPlotCriterionBadge stays leftover-map graphic leftover-map + criterion leftover-map origin leftover-map item coordinate keys. leftoverMapComparePlotPostBadge stays leftover-map comparison graphic leftover-map + post leftover-map origin leftover-map person 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 a97a8a249..4839cc063 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,8 +8,17 @@ 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 +- Period leftover pairs now caption leftover-map comparison graphic leftover-map criterion leftover-map origin leftover-map item coordinates + through leftoverMapComparePlotCriterionBadge independently of leftover-map comparison graphic leftover-map post leftover-map origin leftover-map person coordinates (ADR 0350 / v2.107.0). After `make seed`, leftover-map comparison graphic leftover-map + criterion leftover-map origin leftover-map item coordinates name leftover-map origin when leftoverMapPlotCoordinatePairIsOrigin returns true. Distinct accessible name + `leftover map comparison graphic 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 graphic leftover-map criterion leftover-map item coordinates stay + `leftover map comparison graphic leftover-map criterion {label} at ζ {item}`. leftoverMapPlotCriterionBadge stays leftover-map graphic leftover-map + criterion leftover-map origin leftover-map item coordinate keys. leftoverMapComparePlotPostBadge stays leftover-map comparison graphic leftover-map + post leftover-map origin leftover-map person 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. + + 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 diff --git a/docs/adr/0336-leftover-map-compare-plot-criterion-coordinates.md b/docs/adr/0336-leftover-map-compare-plot-criterion-coordinates.md index 007bbce63..eaf1352db 100644 --- a/docs/adr/0336-leftover-map-compare-plot-criterion-coordinates.md +++ b/docs/adr/0336-leftover-map-compare-plot-criterion-coordinates.md @@ -4,7 +4,9 @@ **Date:** 2026-08-31 **Amended by:** [ADR 0337](0337-leftover-map-compare-plot-post-coordinates.md) -(leftover-map person coordinates on leftover-map comparison graphic leftover-map post markers) +(leftover-map person coordinates on leftover-map comparison graphic leftover-map post markers); +[ADR 0350](0350-leftover-map-compare-plot-criterion-origin-badge.md) +(leftover-map origin on leftover-map comparison graphic leftover-map criterion leftover-map item coordinates independently of leftover-map comparison 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 graphic leftover-map criterion leftover-map item coordinates diff --git a/docs/adr/0350-leftover-map-compare-plot-criterion-origin-badge.md b/docs/adr/0350-leftover-map-compare-plot-criterion-origin-badge.md new file mode 100644 index 000000000..500f397f6 --- /dev/null +++ b/docs/adr/0350-leftover-map-compare-plot-criterion-origin-badge.md @@ -0,0 +1,90 @@ +# ADR 0350 — Name leftover-map origin on leftover-map comparison graphic leftover-map criterion leftover-map item coordinates independently of leftover-map comparison graphic 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 graphic leftover-map criterion markers independently of leftover-map post ξ markers +([ADR 0336](0336-leftover-map-compare-plot-criterion-coordinates.md)). Independent of 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](0349-leftover-map-compare-plot-post-origin-badge.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 0336 already names leftover-map comparison graphic leftover-map criterion leftover-map item coordinates +`leftover map comparison graphic 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 graphic 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 `ξ`. leftoverMapPlotCriterionBadge stays +`leftover-map criterion {label} at leftover-map origin ζ {item}` +this increment. leftoverMapComparePlotPostBadge stays +`Open leftover map comparison graphic leftover-map post {title} at leftover-map origin ξ {person}` +this increment. + +This increment names leftover-map comparison graphic leftover-map criterion leftover-map origin leftover-map +item coordinates as leftoverMapComparePlotCriterionBadge. Leftover-map comparison graphic leftover-map criterion leftover-map origin leftover-map +item coordinates stay +`leftover map comparison graphic leftover-map criterion {label} at leftover-map origin ζ {item}` +when leftoverMapPlotCoordinatePairIsOrigin returns true, so they stay distinct from leftover-map +comparison graphic leftover-map criterion leftover-map item coordinates +`leftover map comparison graphic leftover-map criterion {label} at ζ {item}`, +leftover-map graphic leftover-map criterion leftover-map origin leftover-map item coordinates +`leftover-map criterion {label} at leftover-map origin ζ {item}`, +and leftover-map comparison graphic leftover-map post leftover-map origin leftover-map person coordinates +`Open leftover map comparison graphic 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 **0350** so it does not collide with 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 +(0349) or leftover-map leftover-axis origin ticks (#877). + +## Decision + +On leftover-map comparison graphic leftover-map criterion 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 item coordinates stay leftover-map comparison graphic leftover-map criterion leftover-map +item coordinate keys. leftoverMapPlotCriterionBadge, leftoverMapComparePlotPostBadge, +leftoverMapPlotPostBadge, leftoverMapListCriterionBadge, leftoverMapCompareListCriterionBadge, 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 criterion leftover-map origin leftover-map item +coordinates name leftover-map origin independently of leftover-map comparison graphic leftover-map post leftover-map origin leftover-map person coordinates. Rank-0 unused +axes still name leftover-map origin `(0.00, 0.00)`. leftoverMapPlotCriterionBadge stays leftover-map graphic leftover-map +criterion leftover-map origin leftover-map item coordinate keys. leftoverMapComparePlotPostBadge +stays leftover-map comparison graphic leftover-map post leftover-map origin leftover-map person coordinate keys. leftover-map comparison graphic leftover-map +criterion leftover-map item coordinates independently of leftover-map post ξ markers +(ADR 0336) remain. + +## Related + +Independent of 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](0349-leftover-map-compare-plot-post-origin-badge.md)). Independent of leftover-map +item coordinates on leftover-map comparison graphic leftover-map criterion markers independently of leftover-map +post ξ markers ([ADR 0336](0336-leftover-map-compare-plot-criterion-coordinates.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)). + +## 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 ac310e3d2..efad46f55 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-02 07:32 KST. Protected `main` is +> `3f61c8242b9c02dec307a7396e83e28f7cdd9f3d`. Writes work. Do not +> self-approve. #893 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 (v2.106.0 / ADR 0349) is +> `f2a1860`, stacked on #892 @ `c941929`. Independent APPROVE is missing (Devin COMMENTED, +> not APPROVE). Next buyer increment on this cycle: 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 as leftoverMapComparePlotCriterionBadge (ADR 0350 / v2.107.0) delivered locally on +> `feat/leftover-map-compare-plot-criterion-origin-badge-v21070`. Distinct accessible name +> `leftover map comparison graphic leftover-map criterion {label} at leftover-map origin ζ {item}`. Rank-0 unused axes still name leftover-map origin `(0.00, 0.00)`. leftoverMapPlotCriterionBadge stays leftover-map graphic leftover-map criterion leftover-map origin leftover-map item coordinate keys. leftoverMapComparePlotPostBadge stays leftover-map comparison graphic leftover-map post leftover-map origin leftover-map person coordinate keys. Do not invent leftover-map origin from leftover-map person coordinates `ξ`. Do not mix #877. Stack onto #893. 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:25 KST. Protected `main` is > `cb187cadee5fb6c46d8a944815ccc154a1e028d1`. Writes work. Do not > self-approve. #892 leftover-map graphic leftover-map post leftover-map origin leftover-map diff --git a/frontend/package.json b/frontend/package.json index f4c502de3..b8468a54c 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,7 +1,7 @@ { "name": "frontend", "private": true, - "version": "2.106.0", + "version": "2.107.0", "type": "module", "scripts": { "dev": "vite", diff --git a/frontend/src/components/LeftoverMapPlot.test.tsx b/frontend/src/components/LeftoverMapPlot.test.tsx index ccb6c94ab..34740d19f 100644 --- a/frontend/src/components/LeftoverMapPlot.test.tsx +++ b/frontend/src/components/LeftoverMapPlot.test.tsx @@ -1000,8 +1000,13 @@ describe("LeftoverMapPlot", () => { />, ); expect( - screen.getByLabelText("leftover map comparison graphic leftover-map criterion sales-lead at ζ (0.00, 0.00)"), + screen.getByLabelText( + "leftover map comparison graphic leftover-map criterion sales-lead at leftover-map origin ζ (0.00, 0.00)", + ), ).toBeInTheDocument(); + expect( + screen.queryByLabelText("leftover map comparison graphic leftover-map criterion sales-lead at ζ (0.00, 0.00)"), + ).not.toBeInTheDocument(); expect( screen.getByRole("button", { name: "Open leftover map comparison graphic leftover-map post Public post at leftover-map origin ξ (0.00, 0.00)", diff --git a/frontend/src/components/LeftoverMapPlot.tsx b/frontend/src/components/LeftoverMapPlot.tsx index 137206fe8..1d2cef010 100644 --- a/frontend/src/components/LeftoverMapPlot.tsx +++ b/frontend/src/components/LeftoverMapPlot.tsx @@ -173,6 +173,8 @@ function leftoverMapPlotPostText( * 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 origin on leftover-map comparison graphic leftover-map + * criterion leftover-map item coordinates independently of leftover-map comparison graphic leftover-map post leftover-map origin leftover-map person coordinates when leftoverMapPlotCoordinatePairIsOrigin + * returns true. 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 @@ -305,6 +307,12 @@ function leftoverMapPlotPostText( * ADR 0348 fail-closes 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 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. + * ADR 0350 fail-closes leftover-map comparison graphic leftover-map criterion leftover-map origin leftover-map + * item coordinates through leftoverMapComparePlotCriterionBadge independently of leftover-map + * comparison graphic leftover-map post leftover-map origin leftover-map person coordinates. * Never invent a leftover score. */ export function LeftoverMapPlot({ diff --git a/frontend/src/i18n.test.ts b/frontend/src/i18n.test.ts index 483dfda89..2115d077f 100644 --- a/frontend/src/i18n.test.ts +++ b/frontend/src/i18n.test.ts @@ -79,6 +79,7 @@ describe("i18n", () => { "leftover-map criterion {label} at ζ {item}", "leftover-map criterion {label} at leftover-map origin ζ {item}", "leftover map comparison graphic leftover-map criterion {label} at ζ {item}", + "leftover map comparison graphic leftover-map criterion {label} at leftover-map origin ζ {item}", "leftover-map axis 1", "leftover-map axis 2", "leftover-map axis {axis} ({share}%)", @@ -175,6 +176,7 @@ describe("i18n", () => { "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}", + "leftover map comparison graphic leftover-map criterion {label} at leftover-map origin ζ {item}", "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.", @@ -490,6 +492,24 @@ describe("i18n", () => { }, ); + it.each([ + ["ko", "잔여 지도 비교 그림 원점 기준 sales-lead (ζ (0.00, 0.00))"], + ["zh", "残差地图比较图形原点准则 sales-lead(ζ (0.00, 0.00))"], + ["ja", "残差マップの比較図原点基準 sales-lead(ζ (0.00, 0.00))"], + ["vi", "tiêu chí gốc đồ họa so sánh bản đồ phần dư sales-lead tại ζ (0.00, 0.00)"], + ] as const)( + "formats leftover map comparison graphic leftover-map criterion leftover-map origin ζ in %s", + (locale, expected) => { + setLocale(locale); + expect( + tf("leftover map comparison graphic leftover-map criterion {label} at leftover-map origin ζ {item}", { + label: "sales-lead", + item: "(0.00, 0.00)", + }), + ).toBe(expected); + }, + ); + it.each([ ["ko", "잔여 지도 원점 글 Public post 열기 (ξ (0.00, 0.00))"], ["zh", "打开残差图原点帖子 Public post(ξ (0.00, 0.00))"], diff --git a/frontend/src/i18n.ts b/frontend/src/i18n.ts index 8763884df..d84245cbd 100644 --- a/frontend/src/i18n.ts +++ b/frontend/src/i18n.ts @@ -698,6 +698,8 @@ const TRANSLATIONS: Partial>> = { "잔여 지도 원점 기준 {label} (ζ {item})", "leftover map comparison graphic leftover-map criterion {label} at ζ {item}": "잔여 지도 비교 그림 기준 {label} (ζ {item})", + "leftover map comparison graphic leftover-map criterion {label} at leftover-map origin ζ {item}": + "잔여 지도 비교 그림 원점 기준 {label} (ζ {item})", "Open leftover-map post {title}": "잔여 지도 글 {title} 열기", "Open leftover map comparison graphic leftover-map post {title} at ξ {person}": "잔여 지도 비교 그림 글 {title} 열기 (ξ {person})", @@ -1422,6 +1424,8 @@ const TRANSLATIONS: Partial>> = { "残差图原点准则 {label}(ζ {item})", "leftover map comparison graphic leftover-map criterion {label} at ζ {item}": "残差地图比较图形准则 {label}(ζ {item})", + "leftover map comparison graphic leftover-map criterion {label} at leftover-map origin ζ {item}": + "残差地图比较图形原点准则 {label}(ζ {item})", "Open leftover-map post {title}": "打开残差图帖子 {title}", "Open leftover map comparison graphic leftover-map post {title} at ξ {person}": "打开残差地图比较图形帖子 {title}(ξ {person})", @@ -2150,6 +2154,8 @@ const TRANSLATIONS: Partial>> = { "残差マップの原点基準 {label}(ζ {item})", "leftover map comparison graphic leftover-map criterion {label} at ζ {item}": "残差マップの比較図基準 {label}(ζ {item})", + "leftover map comparison graphic leftover-map criterion {label} at leftover-map origin ζ {item}": + "残差マップの比較図原点基準 {label}(ζ {item})", "Open leftover-map post {title}": "残差マップの投稿 {title} を開く", "Open leftover map comparison graphic leftover-map post {title} at ξ {person}": "残差マップの比較図の投稿 {title} を開く(ξ {person})", @@ -2882,6 +2888,8 @@ const TRANSLATIONS: Partial>> = { "tiêu chí gốc bản đồ phần dư {label} tại ζ {item}", "leftover map comparison graphic leftover-map criterion {label} at ζ {item}": "tiêu chí đồ họa so sánh bản đồ phần dư {label} tại ζ {item}", + "leftover map comparison graphic leftover-map criterion {label} at leftover-map origin ζ {item}": + "tiêu chí gốc đồ họa so sánh bản đồ phần dư {label} tại ζ {item}", "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}", diff --git a/frontend/src/leftoverMapAxisBadge.ts b/frontend/src/leftoverMapAxisBadge.ts index 57fcb37ae..7d44fdcf6 100644 --- a/frontend/src/leftoverMapAxisBadge.ts +++ b/frontend/src/leftoverMapAxisBadge.ts @@ -36,6 +36,8 @@ * 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. + * ADR 0350 names leftover-map origin on leftover-map comparison graphic leftover-map criterion leftover-map + * item coordinates as leftoverMapComparePlotCriterionBadge, not this helper. */ import type { LeftoverMapAxis } from "./api"; diff --git a/frontend/src/leftoverMapCoordinates.test.ts b/frontend/src/leftoverMapCoordinates.test.ts index 4cf5bb6c1..0a920507a 100644 --- a/frontend/src/leftoverMapCoordinates.test.ts +++ b/frontend/src/leftoverMapCoordinates.test.ts @@ -5,6 +5,7 @@ import { leftoverMapPlotCriterionBadge, leftoverMapPlotPostBadge, LEFTOVER_MAP_COMPARE_PLOT_CRITERION, + LEFTOVER_MAP_COMPARE_PLOT_CRITERION_ORIGIN, LEFTOVER_MAP_COMPARE_PLOT_POST_ACTION, LEFTOVER_MAP_COMPARE_PLOT_POST_ACTION_ORIGIN, LEFTOVER_MAP_PLOT_CRITERION, @@ -75,9 +76,18 @@ describe("leftoverMapPlotCoordinatePairIsOrigin", () => { expect(leftoverMapPlotCoordinatePairIsOrigin("0.00")).toBe(false); expect(formatLeftoverMapCoordinatePair(0, 0)).toBe("(0.00, 0.00)"); expect(leftoverMapPlotCriterionBadge("sales-lead", 0, 0)?.key).toBe(LEFTOVER_MAP_PLOT_CRITERION_ORIGIN); + expect(leftoverMapComparePlotCriterionBadge("sales-lead", 0, 0)?.key).toBe( + LEFTOVER_MAP_COMPARE_PLOT_CRITERION_ORIGIN, + ); 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_CRITERION, + ); + expect(leftoverMapPlotCriterionBadge("sales-lead", 0, 0)?.key).not.toBe( + LEFTOVER_MAP_COMPARE_PLOT_CRITERION_ORIGIN, + ); 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); @@ -90,9 +100,18 @@ describe("leftoverMapPlotCoordinatePairIsOrigin", () => { 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_COMPARE_PLOT_CRITERION_ORIGIN, + ); + expect(leftoverMapComparePlotCriterionBadge("sales-lead", 0, 0)?.key).not.toBe( + LEFTOVER_MAP_COMPARE_PLOT_POST_ACTION_ORIGIN, + ); expect(leftoverMapListCriterionBadge("sales-lead", 0, 0)?.key).not.toBe( LEFTOVER_MAP_PLOT_CRITERION_ORIGIN, ); + expect(leftoverMapListCriterionBadge("sales-lead", 0, 0)?.key).not.toBe( + LEFTOVER_MAP_COMPARE_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, @@ -174,6 +193,12 @@ describe("leftoverMapListCriterionBadge", () => { key: LEFTOVER_MAP_LIST_CRITERION, values: { label: "sales-lead", item: "(0.00, 0.00)" }, }); + expect(leftoverMapListCriterionBadge("sales-lead", 0, 0)?.key).not.toBe( + LEFTOVER_MAP_COMPARE_PLOT_CRITERION_ORIGIN, + ); + expect(leftoverMapListCriterionBadge("sales-lead", 0, 0)?.key).not.toBe( + LEFTOVER_MAP_PLOT_CRITERION_ORIGIN, + ); }); it("omits leftover-map item coordinates when ζ is missing or non-finite", () => { @@ -197,6 +222,7 @@ describe("leftoverMapListCriterionBadge", () => { expect(LEFTOVER_MAP_LIST_CRITERION).not.toBe(LEFTOVER_MAP_PLOT_CRITERION); expect(LEFTOVER_MAP_LIST_CRITERION).not.toBe(LEFTOVER_MAP_PLOT_CRITERION_ORIGIN); expect(LEFTOVER_MAP_LIST_CRITERION).not.toBe(LEFTOVER_MAP_COMPARE_PLOT_CRITERION); + expect(LEFTOVER_MAP_LIST_CRITERION).not.toBe(LEFTOVER_MAP_COMPARE_PLOT_CRITERION_ORIGIN); expect(LEFTOVER_MAP_LIST_CRITERION).not.toBe(LEFTOVER_MAP_LIST_POST_ACTION); expect(LEFTOVER_MAP_LIST_CRITERION).not.toBe("Criterion ζ {label}"); expect(leftoverMapListCriterionBadge("sales-lead", 0.5, -0.02)?.key).not.toBe( @@ -291,6 +317,12 @@ describe("leftoverMapCompareListCriterionBadge", () => { key: LEFTOVER_MAP_COMPARE_LIST_CRITERION, values: { label: "sales-lead", item: "(0.00, 0.00)" }, }); + expect(leftoverMapCompareListCriterionBadge("sales-lead", 0, 0)?.key).not.toBe( + LEFTOVER_MAP_COMPARE_PLOT_CRITERION_ORIGIN, + ); + expect(leftoverMapCompareListCriterionBadge("sales-lead", 0, 0)?.key).not.toBe( + LEFTOVER_MAP_PLOT_CRITERION_ORIGIN, + ); }); it("omits leftover-map item coordinates when ζ is missing or non-finite", () => { @@ -315,6 +347,7 @@ describe("leftoverMapCompareListCriterionBadge", () => { expect(LEFTOVER_MAP_COMPARE_LIST_CRITERION).not.toBe(LEFTOVER_MAP_PLOT_CRITERION); expect(LEFTOVER_MAP_COMPARE_LIST_CRITERION).not.toBe(LEFTOVER_MAP_PLOT_CRITERION_ORIGIN); expect(LEFTOVER_MAP_COMPARE_LIST_CRITERION).not.toBe(LEFTOVER_MAP_COMPARE_PLOT_CRITERION); + expect(LEFTOVER_MAP_COMPARE_LIST_CRITERION).not.toBe(LEFTOVER_MAP_COMPARE_PLOT_CRITERION_ORIGIN); expect(LEFTOVER_MAP_COMPARE_LIST_CRITERION).not.toBe(LEFTOVER_MAP_COMPARE_LIST_POST_ACTION); expect(leftoverMapCompareListCriterionBadge("sales-lead", 0.5, -0.02)?.key).not.toBe( leftoverMapListCriterionBadge("sales-lead", 0.5, -0.02)?.key ?? "", diff --git a/frontend/src/leftoverMapCoordinates.ts b/frontend/src/leftoverMapCoordinates.ts index 0518c9669..228e832df 100644 --- a/frontend/src/leftoverMapCoordinates.ts +++ b/frontend/src/leftoverMapCoordinates.ts @@ -11,6 +11,10 @@ * 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. + * ADR 0350 names leftover-map origin on leftover-map comparison graphic leftover-map + * criterion leftover-map item coordinates as leftoverMapComparePlotCriterionBadge independently of leftover-map + * comparison graphic leftover-map post leftover-map origin leftover-map person coordinates. leftoverMapListCriterionBadge stays leftover-map pair leftover-map + * criterion leftover-map item coordinate keys. */ import { formatSignedLeftoverValue } from "./leftoverMapUnexplained"; @@ -106,6 +110,8 @@ export function leftoverMapListPostBadge( /** ADR 0340 leftover-map pair leftover-map criterion leftover-map item coordinates ζ. * ADR 0347 names leftover-map origin on leftover-map graphic leftover-map criterion * leftover-map item coordinates as leftoverMapPlotCriterionBadge, not this helper. + * ADR 0350 names leftover-map origin on leftover-map comparison graphic leftover-map criterion + * leftover-map item coordinates as leftoverMapComparePlotCriterionBadge, not this helper. */ export function leftoverMapListCriterionBadge( label: string, @@ -132,7 +138,10 @@ export function leftoverMapCompareListPostBadge( return { key: LEFTOVER_MAP_COMPARE_LIST_POST_ACTION, values: { title, person } }; } -/** ADR 0342 leftover-map comparison leftover-pair leftover-map criterion leftover-map item coordinates ζ. */ +/** ADR 0342 leftover-map comparison leftover-pair leftover-map criterion leftover-map item coordinates ζ. + * ADR 0350 names leftover-map origin on leftover-map comparison graphic leftover-map criterion + * leftover-map item coordinates as leftoverMapComparePlotCriterionBadge, not this helper. + */ export function leftoverMapCompareListCriterionBadge( label: string, axis1: number | null | undefined, diff --git a/frontend/src/leftoverMapPlotAxisSingular.ts b/frontend/src/leftoverMapPlotAxisSingular.ts index eef2b2706..99d8fc3df 100644 --- a/frontend/src/leftoverMapPlotAxisSingular.ts +++ b/frontend/src/leftoverMapPlotAxisSingular.ts @@ -49,6 +49,9 @@ * 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. + * ADR 0350 names leftover-map origin on leftover-map comparison graphic leftover-map criterion leftover-map + * item coordinates as leftoverMapComparePlotCriterionBadge independently of leftover-map comparison 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 be80eae59..0e78fd2cf 100644 --- a/frontend/src/leftoverMapPlotLayout.test.ts +++ b/frontend/src/leftoverMapPlotLayout.test.ts @@ -26,6 +26,7 @@ import { LEFTOVER_MAP_PLOT_CRITERION, LEFTOVER_MAP_PLOT_CRITERION_ORIGIN, LEFTOVER_MAP_COMPARE_PLOT_CRITERION, + LEFTOVER_MAP_COMPARE_PLOT_CRITERION_ORIGIN, LEFTOVER_MAP_PLOT_POST_ACTION, LEFTOVER_MAP_PLOT_POST_ACTION_ORIGIN, LEFTOVER_MAP_PLOT_POST_ACTION_OMITTED, @@ -1234,6 +1235,9 @@ describe("leftoverMapPlotCriterionBadge", () => { }); expect(leftoverMapPlotCriterionBadge("sales-lead", 0, 0)?.key).not.toBe(LEFTOVER_MAP_PLOT_CRITERION); expect(leftoverMapPlotCriterionBadge("sales-lead", 0, 0)?.key).not.toBe(LEFTOVER_MAP_COMPARE_PLOT_CRITERION); + expect(leftoverMapPlotCriterionBadge("sales-lead", 0, 0)?.key).not.toBe( + LEFTOVER_MAP_COMPARE_PLOT_CRITERION_ORIGIN, + ); expect(leftoverMapPlotPostBadge("Public post", 0, 0)?.key).not.toBe(LEFTOVER_MAP_PLOT_CRITERION_ORIGIN); expect(leftoverMapPlotPostBadge("Public post", 0, 0)?.key).toBe(LEFTOVER_MAP_PLOT_POST_ACTION_ORIGIN); expect(leftoverMapPlotCriterionBadge("sales-lead", 0, 0)?.key).not.toBe(LEFTOVER_MAP_PLOT_POST_ACTION_ORIGIN); @@ -1253,6 +1257,7 @@ describe("leftoverMapPlotCriterionBadge", () => { ); expect(LEFTOVER_MAP_PLOT_CRITERION_ORIGIN).not.toBe(LEFTOVER_MAP_PLOT_CRITERION); expect(LEFTOVER_MAP_PLOT_CRITERION_ORIGIN).not.toBe(LEFTOVER_MAP_COMPARE_PLOT_CRITERION); + expect(LEFTOVER_MAP_PLOT_CRITERION_ORIGIN).not.toBe(LEFTOVER_MAP_COMPARE_PLOT_CRITERION_ORIGIN); expect(LEFTOVER_MAP_PLOT_CRITERION).not.toBe(LEFTOVER_MAP_PLOT_POST_ACTION); expect(LEFTOVER_MAP_PLOT_CRITERION).not.toBe("Criterion ζ {label}"); expect(LEFTOVER_MAP_PLOT_CRITERION).not.toBe("Criterion ζ"); @@ -1281,17 +1286,23 @@ describe("leftoverMapComparePlotCriterionBadge", () => { }); }); - 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 graphic leftover-map post leftover-map origin leftover-map person coordinates", () => { expect(leftoverMapComparePlotCriterionBadge("sales-lead", 0, 0)).toEqual({ - key: LEFTOVER_MAP_COMPARE_PLOT_CRITERION, + key: LEFTOVER_MAP_COMPARE_PLOT_CRITERION_ORIGIN, values: { label: "sales-lead", item: "(0.00, 0.00)" }, }); + expect(leftoverMapComparePlotCriterionBadge("sales-lead", 0, 0)?.key).not.toBe( + LEFTOVER_MAP_COMPARE_PLOT_CRITERION, + ); 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, ); + expect(leftoverMapPlotCriterionBadge("sales-lead", 0, 0)?.key).not.toBe( + LEFTOVER_MAP_COMPARE_PLOT_CRITERION_ORIGIN, + ); }); it("omits leftover-map item coordinates when ζ is missing or non-finite", () => { @@ -1305,6 +1316,11 @@ describe("leftoverMapComparePlotCriterionBadge", () => { expect(LEFTOVER_MAP_COMPARE_PLOT_CRITERION).toBe( "leftover map comparison graphic leftover-map criterion {label} at ζ {item}", ); + expect(LEFTOVER_MAP_COMPARE_PLOT_CRITERION_ORIGIN).toBe( + "leftover map comparison graphic leftover-map criterion {label} at leftover-map origin ζ {item}", + ); + expect(LEFTOVER_MAP_COMPARE_PLOT_CRITERION_ORIGIN).not.toBe(LEFTOVER_MAP_COMPARE_PLOT_CRITERION); + expect(LEFTOVER_MAP_COMPARE_PLOT_CRITERION_ORIGIN).not.toBe(LEFTOVER_MAP_PLOT_CRITERION_ORIGIN); expect(LEFTOVER_MAP_COMPARE_PLOT_CRITERION).not.toBe(LEFTOVER_MAP_PLOT_CRITERION); expect(LEFTOVER_MAP_COMPARE_PLOT_CRITERION).not.toBe(LEFTOVER_MAP_PLOT_CRITERION_ORIGIN); expect(LEFTOVER_MAP_COMPARE_PLOT_CRITERION).not.toBe(LEFTOVER_MAP_PLOT_POST_ACTION); @@ -1313,6 +1329,9 @@ describe("leftoverMapComparePlotCriterionBadge", () => { expect(leftoverMapComparePlotCriterionBadge("sales-lead", 0.5, -0.02)?.key).not.toBe( LEFTOVER_MAP_PLOT_CRITERION, ); + expect(leftoverMapComparePlotCriterionBadge("sales-lead", 0.5, -0.02)?.key).not.toBe( + LEFTOVER_MAP_COMPARE_PLOT_CRITERION_ORIGIN, + ); expect(leftoverMapComparePlotCriterionBadge("sales-lead", 0.5, -0.02)?.key).not.toBe( LEFTOVER_MAP_PLOT_POST_ACTION, ); @@ -1413,6 +1432,9 @@ describe("leftoverMapComparePlotPostBadge", () => { expect(leftoverMapComparePlotCriterionBadge("sales-lead", 0, 0)?.key).not.toBe( LEFTOVER_MAP_COMPARE_PLOT_POST_ACTION_ORIGIN, ); + expect(leftoverMapComparePlotPostBadge("Public post", 0, 0)?.key).not.toBe( + LEFTOVER_MAP_COMPARE_PLOT_CRITERION_ORIGIN, + ); }); it("omits leftover-map person coordinates when ξ is missing or non-finite", () => { @@ -1435,6 +1457,7 @@ describe("leftoverMapComparePlotPostBadge", () => { 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); expect(LEFTOVER_MAP_COMPARE_PLOT_POST_ACTION).not.toBe(LEFTOVER_MAP_COMPARE_PLOT_CRITERION); + expect(LEFTOVER_MAP_COMPARE_PLOT_POST_ACTION_ORIGIN).not.toBe(LEFTOVER_MAP_COMPARE_PLOT_CRITERION_ORIGIN); expect(LEFTOVER_MAP_COMPARE_PLOT_POST_ACTION).not.toBe(LEFTOVER_MAP_PLOT_CRITERION); expect(leftoverMapComparePlotPostBadge("Public post", 0.5, 0.1)?.key).not.toBe( LEFTOVER_MAP_PLOT_POST_ACTION, diff --git a/frontend/src/leftoverMapPlotLayout.ts b/frontend/src/leftoverMapPlotLayout.ts index fcc0343b3..b9b7c930e 100644 --- a/frontend/src/leftoverMapPlotLayout.ts +++ b/frontend/src/leftoverMapPlotLayout.ts @@ -171,6 +171,10 @@ * 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. + * ADR 0350 fail-closes leftover-map comparison graphic leftover-map criterion leftover-map origin leftover-map + * item coordinates through leftoverMapComparePlotCriterionBadge independently of leftover-map + * comparison graphic leftover-map post leftover-map origin leftover-map person coordinates ξ, not leftover-map graphic leftover-map criterion leftover-map + * item coordinates. */ import { formatLeftoverMapCoordinatePair, leftoverMapPlotCoordinatePairIsOrigin } from "./leftoverMapCoordinates"; @@ -221,6 +225,9 @@ export const LEFTOVER_MAP_PLOT_CRITERION_ORIGIN = export const LEFTOVER_MAP_COMPARE_PLOT_CRITERION = "leftover map comparison graphic leftover-map criterion {label} at ζ {item}"; +export const LEFTOVER_MAP_COMPARE_PLOT_CRITERION_ORIGIN = + "leftover map comparison graphic leftover-map criterion {label} at leftover-map origin ζ {item}"; + export type LeftoverMapPlotCriterionBadge = { key: string; values: { label: string; item: string }; @@ -256,7 +263,11 @@ export function leftoverMapComparePlotCriterionBadge( if (item === null) { return null; } - return { key: LEFTOVER_MAP_COMPARE_PLOT_CRITERION, values: { label, item } }; + const origin = leftoverMapPlotCoordinatePairIsOrigin(item); + return { + key: origin ? LEFTOVER_MAP_COMPARE_PLOT_CRITERION_ORIGIN : LEFTOVER_MAP_COMPARE_PLOT_CRITERION, + values: { label, item }, + }; } export function leftoverMapPlotPostBadge( diff --git a/pyproject.toml b/pyproject.toml index 165418469..c6a696c7d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "lineageweave" -version = "2.106.0" +version = "2.107.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" }