diff --git a/AGENTS.md b/AGENTS.md index e3c5b4395..a25092777 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -871,6 +871,11 @@ returns a leftover-map origin leftover-map person coordinate caption independent `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 `ζ`. leftoverMapComparePlotPostBadge stays leftover-map comparison graphic leftover-map post leftover-map origin leftover-map person coordinate keys. leftoverMapPlotPostBadge stays leftover-map graphic leftover-map post leftover-map origin leftover-map person coordinate keys this increment. +ADR 0352 captions leftover-map pair leftover-map criterion leftover-map origin leftover-map item coordinates with leftover-map origin when leftoverMapListCriterionBadge +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. Distinct accessible name +`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 `ξ`. leftoverMapListPostBadge stays leftover-map pair leftover-map +post leftover-map origin leftover-map person coordinate keys. leftoverMapPlotCriterionBadge stays leftover-map graphic 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 @@ -1062,6 +1067,8 @@ Leftover-map comparison graphic leftover-map criterion leftover-map origin lefto (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. Leftover-map pair leftover-map post leftover-map origin leftover-map person coordinates independently of leftover-map comparison graphic leftover-map post leftover-map origin leftover-map person coordinates (ADR 0351) captions leftover-map pair leftover-map post leftover-map origin leftover-map person coordinates when leftoverMapListPostBadge returns a leftover-map origin leftover-map person coordinate caption. +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) 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. 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 74e92a64b..3ffad37b0 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -827,6 +827,8 @@ ADR 0350 captions leftover-map comparison graphic leftover-map criterion leftove 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. ADR 0351 captions leftover-map pair leftover-map post leftover-map origin leftover-map person coordinates when leftoverMapListPostBadge returns a leftover-map origin leftover-map person coordinate caption independently of leftover-map comparison graphic leftover-map post leftover-map origin leftover-map person coordinates. +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 independently of leftover-map 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.109.0-leftover-map-list-criterion-origin-badge.md b/CHANGELOG.d/2.109.0-leftover-map-list-criterion-origin-badge.md new file mode 100644 index 000000000..f5589d87d --- /dev/null +++ b/CHANGELOG.d/2.109.0-leftover-map-list-criterion-origin-badge.md @@ -0,0 +1,12 @@ +## 2.109.0 — Leftover-map origin on leftover-map pair leftover-map criterion leftover-map item coordinates independently of leftover-map pair leftover-map post leftover-map origin leftover-map person coordinates + +- Caption leftover-map pair leftover-map criterion leftover-map origin leftover-map item coordinates through leftoverMapListCriterionBadge + independently of leftover-map pair leftover-map post leftover-map origin leftover-map person coordinates (ADR 0352). After `make seed`, leftover-map pair leftover-map + criterion leftover-map origin leftover-map item coordinates name leftover-map origin when leftoverMapPlotCoordinatePairIsOrigin returns true. Distinct accessible name + `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 pair leftover-map criterion leftover-map item coordinates stay + `leftover pair leftover-map criterion {label} at ζ {item}`. leftoverMapListPostBadge stays leftover-map pair leftover-map + post leftover-map origin leftover-map person coordinate keys. leftoverMapPlotCriterionBadge stays leftover-map graphic 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 cee432c28..28faf394f 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 pair leftover-map criterion leftover-map origin leftover-map item coordinates + through leftoverMapListCriterionBadge independently of leftover-map pair leftover-map post leftover-map origin leftover-map person coordinates (ADR 0352 / v2.109.0). After `make seed`, leftover-map pair leftover-map + criterion leftover-map origin leftover-map item coordinates name leftover-map origin when leftoverMapPlotCoordinatePairIsOrigin returns true. Distinct accessible name + `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 pair leftover-map criterion leftover-map item coordinates stay + `leftover pair leftover-map criterion {label} at ζ {item}`. leftoverMapListPostBadge stays leftover-map pair leftover-map + post leftover-map origin leftover-map person coordinate keys. leftoverMapPlotCriterionBadge stays leftover-map graphic 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 pair leftover-map post leftover-map origin leftover-map person coordinates through leftoverMapListPostBadge independently of leftover-map comparison graphic leftover-map post leftover-map origin leftover-map person coordinates (ADR 0351 / v2.108.0). After `make seed`, leftover-map 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/CLAUDE.md b/CLAUDE.md index 6b92d1ddf..1ca8e9411 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -49,7 +49,7 @@ cutoff. Global Ask optional `knowledge_cutoff` uses the same cover Create/start endpoint rules (ADR 0017 / 0021), tie-vs-miss similarity (ADR 0026), R&R catalog ids (ADR 0019 / 0027), leftover pairs -(ADR 0048–0164 / 0182 / 0185 / 0201 / 0233 / 0266 / 0267 / 0268 / 0269 / 0270 / 0271 / 0272 / 0273 / 0274 / 0275 / 0276 / 0277 / 0278 / 0279 / 0280 / 0281 / 0282 / 0283 / 0284 / 0285 / 0286 / 0287 / 0288 / 0289 / 0290 / 0291 / 0292 / 0293 / 0294 / 0295 / 0296 / 0297 / 0298 / 0299 / 0300 / 0301 / 0302 / 0303 / 0304 / 0305 / 0306 / 0307 / 0308 / 0309 / 0310 / 0311 / 0312 / 0313 / 0314 / 0315 / 0316 / 0317 / 0318 / 0319 / 0320 / 0321 / 0322 / 0323 / 0324 / 0325 / 0326 / 0327 / 0328 / 0329 / 0330 / 0331 / 0332 / 0333 / 0334 / 0335 / 0336 / 0337 / 0338 / 0339 / 0340 / 0341 / 0342 / 0343 / 0344 / 0345 / 0346 / 0347), occupational construct catalog search +(ADR 0048–0164 / 0182 / 0185 / 0201 / 0233 / 0266 / 0267 / 0268 / 0269 / 0270 / 0271 / 0272 / 0273 / 0274 / 0275 / 0276 / 0277 / 0278 / 0279 / 0280 / 0281 / 0282 / 0283 / 0284 / 0285 / 0286 / 0287 / 0288 / 0289 / 0290 / 0291 / 0292 / 0293 / 0294 / 0295 / 0296 / 0297 / 0298 / 0299 / 0300 / 0301 / 0302 / 0303 / 0304 / 0305 / 0306 / 0307 / 0308 / 0309 / 0310 / 0311 / 0312 / 0313 / 0314 / 0315 / 0316 / 0317 / 0318 / 0319 / 0320 / 0321 / 0322 / 0323 / 0324 / 0325 / 0326 / 0327 / 0328 / 0329 / 0330 / 0331 / 0332 / 0333 / 0334 / 0335 / 0336 / 0337 / 0338 / 0339 / 0340 / 0341 / 0342 / 0343 / 0344 / 0345 / 0346 / 0347 / 0348 / 0349 / 0350 / 0351 / 0352), occupational construct catalog search (ADR 0257), the text-channel embedding swap and cosine clamp (ADR 0190), per-edge channel-score persistence (ADR 0195), token-backed status notices (ADR 0220), diff --git a/docs/adr/0340-leftover-map-list-criterion-coordinates.md b/docs/adr/0340-leftover-map-list-criterion-coordinates.md index 5611e668e..20645fa60 100644 --- a/docs/adr/0340-leftover-map-list-criterion-coordinates.md +++ b/docs/adr/0340-leftover-map-list-criterion-coordinates.md @@ -4,7 +4,9 @@ **Date:** 2026-08-31 **Amended by:** [ADR 0341](0341-leftover-map-compare-list-post-coordinates.md) -(leftover-map person coordinates on leftover-map comparison leftover pair leftover-map post independently of leftover-map comparison leftover pair leftover-map criterion leftover-map item coordinates) +(leftover-map person coordinates on leftover-map comparison leftover pair leftover-map post independently of leftover-map comparison leftover pair leftover-map criterion leftover-map item coordinates); +[ADR 0352](0352-leftover-map-list-criterion-origin-badge.md) +(leftover-map origin on leftover-map pair leftover-map criterion leftover-map item coordinates independently of leftover-map pair leftover-map post leftover-map origin leftover-map person coordinates) Amends leftover-map coordinates ([ADR 0267](0267-leftover-map-coordinates.md)). Independent of leftover-map diff --git a/docs/adr/0352-leftover-map-list-criterion-origin-badge.md b/docs/adr/0352-leftover-map-list-criterion-origin-badge.md new file mode 100644 index 000000000..2dcedc46e --- /dev/null +++ b/docs/adr/0352-leftover-map-list-criterion-origin-badge.md @@ -0,0 +1,93 @@ +# ADR 0352 — Name leftover-map origin on leftover-map pair leftover-map criterion leftover-map item coordinates independently of leftover-map 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 pair leftover-map criterion independently of leftover-map pair leftover-map post leftover-map person coordinates +([ADR 0340](0340-leftover-map-list-criterion-coordinates.md)). Independent of leftover-map pair leftover-map post leftover-map origin leftover-map person coordinates independently of leftover-map comparison graphic leftover-map post leftover-map origin leftover-map person coordinates +([ADR 0351](0351-leftover-map-list-post-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 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 on the competing origin-tick stack (do not mix #877). + +## Context + +ADR 0340 already names leftover-map pair leftover-map criterion leftover-map item coordinates +`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 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 `ξ`. leftoverMapListPostBadge stays +`leftover pair leftover-map post {title} at leftover-map origin ξ {person}` +this increment. leftoverMapPlotCriterionBadge stays +`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. leftoverMapCompareListCriterionBadge stays leftover-map comparison leftover-pair leftover-map +criterion leftover-map item coordinate keys this increment. + +This increment names leftover-map pair leftover-map criterion leftover-map origin leftover-map +item coordinates as leftoverMapListCriterionBadge. Leftover-map pair leftover-map criterion leftover-map origin leftover-map +item coordinates stay +`leftover pair leftover-map criterion {label} at leftover-map origin ζ {item}` +when leftoverMapPlotCoordinatePairIsOrigin returns true, so they stay distinct from leftover-map +pair leftover-map criterion leftover-map item coordinates +`leftover pair 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}`, +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 pair leftover-map post leftover-map origin leftover-map person coordinates +`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 **0352** so it does not collide with leftover-map pair leftover-map +post leftover-map origin leftover-map person coordinates independently of leftover-map comparison graphic leftover-map post leftover-map origin leftover-map person coordinates +(0351) or leftover-map leftover-axis origin ticks (#877). + +## Decision + +On leftover-map 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 pair leftover-map criterion leftover-map +item coordinate keys. leftoverMapListPostBadge, leftoverMapPlotCriterionBadge, +leftoverMapComparePlotCriterionBadge, leftoverMapCompareListCriterionBadge, 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 pair leftover-map criterion leftover-map origin leftover-map item +coordinates name leftover-map origin independently of leftover-map pair leftover-map post leftover-map origin leftover-map person coordinates. Rank-0 unused +axes still name leftover-map origin `(0.00, 0.00)`. leftoverMapListPostBadge stays leftover-map pair leftover-map +post leftover-map origin leftover-map person coordinate keys. leftoverMapPlotCriterionBadge stays leftover-map graphic leftover-map +criterion leftover-map origin leftover-map item coordinate keys. leftover-map item coordinates on leftover-map pair leftover-map +criterion independently of leftover-map pair leftover-map post leftover-map person coordinates +(ADR 0340) remain. + +## Related + +Independent of leftover-map pair leftover-map post leftover-map origin leftover-map person +coordinates independently of leftover-map comparison graphic leftover-map post leftover-map origin leftover-map person coordinates +([ADR 0351](0351-leftover-map-list-post-origin-badge.md)). Independent of leftover-map +item coordinates on leftover-map pair leftover-map criterion independently of leftover-map pair leftover-map +post leftover-map person coordinates ([ADR 0340](0340-leftover-map-list-criterion-coordinates.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 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 dbd99539b..2dddc720f 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 17:25 KST. Protected `main` is +> `3f61c8242b9c02dec307a7396e83e28f7cdd9f3d`. Writes work (MCP comment + git push). Do not +> self-approve. #913 leftover-map pair leftover-map post leftover-map origin leftover-map +> person coordinates independently of leftover-map comparison graphic leftover-map post leftover-map origin leftover-map person coordinates (v2.108.0 / ADR 0351) is +> `371bb82`, stacked on #912 @ `2ac677b`. Independent APPROVE is missing (Devin/Codex COMMENTED, +> not APPROVE). This increment: 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 as leftoverMapListCriterionBadge (ADR 0352 / v2.109.0) on +> `feat/leftover-map-list-criterion-origin-badge-v21090`. Distinct accessible name +> `leftover pair leftover-map criterion {label} at leftover-map origin ζ {item}`. Rank-0 unused axes still name leftover-map origin `(0.00, 0.00)`. leftoverMapListPostBadge stays leftover-map pair leftover-map post leftover-map origin leftover-map person coordinate keys. leftoverMapPlotCriterionBadge stays leftover-map graphic leftover-map criterion leftover-map origin leftover-map item coordinate keys. leftoverMapCompareListCriterionBadge stays leftover-map comparison leftover-pair leftover-map criterion leftover-map item coordinate keys. Do not invent leftover-map origin from leftover-map person coordinates `ξ`. Do not mix #877. Stack onto #913. 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: leftover-map comparison leftover-pair leftover-map post leftover-map origin leftover-map person coordinates as leftoverMapCompareListPostBadge independently of leftover-map pair leftover-map post leftover-map origin leftover-map person coordinates (ADR 0353 / v2.110.0). + > Exact-head loop overlay: 2026-09-02 07:40 KST. Protected `main` is > `3f61c8242b9c02dec307a7396e83e28f7cdd9f3d`. Writes work. Do not > self-approve. #912 leftover-map comparison graphic leftover-map criterion leftover-map origin leftover-map diff --git a/docs/storybook-inventory.md b/docs/storybook-inventory.md index bcea4a2a8..3a11cb68b 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 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. 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 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 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` | | `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 7839ded0c..3c56e2cd3 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,7 +1,7 @@ { "name": "frontend", "private": true, - "version": "2.108.0", + "version": "2.109.0", "type": "module", "scripts": { "dev": "vite", diff --git a/frontend/src/components/LeftoverMapPlot.tsx b/frontend/src/components/LeftoverMapPlot.tsx index 69957a8e9..6de62d036 100644 --- a/frontend/src/components/LeftoverMapPlot.tsx +++ b/frontend/src/components/LeftoverMapPlot.tsx @@ -316,6 +316,9 @@ function leftoverMapPlotPostText( * ADR 0351 fail-closes leftover-map pair leftover-map post leftover-map origin leftover-map * person coordinates through leftoverMapListPostBadge independently of leftover-map * comparison graphic leftover-map post leftover-map origin leftover-map person coordinates, not this graphic. + * ADR 0352 fail-closes leftover-map pair leftover-map criterion leftover-map origin leftover-map + * item coordinates through leftoverMapListCriterionBadge independently of leftover-map + * 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.test.tsx b/frontend/src/components/LeftoverPairList.test.tsx index 77e609040..f86bbb533 100644 --- a/frontend/src/components/LeftoverPairList.test.tsx +++ b/frontend/src/components/LeftoverPairList.test.tsx @@ -242,8 +242,11 @@ describe("LeftoverPairList", () => { }), ).not.toBeInTheDocument(); expect( - screen.getByLabelText("leftover pair leftover-map criterion sales-lead at ζ (0.00, 0.00)"), + screen.getByLabelText("leftover pair leftover-map criterion sales-lead at leftover-map origin ζ (0.00, 0.00)"), ).toBeInTheDocument(); + expect( + screen.queryByLabelText("leftover pair leftover-map criterion sales-lead at ζ (0.00, 0.00)"), + ).not.toBeInTheDocument(); }); it("keeps leftover-map pair leftover-map post leftover-map person coordinates omitted when ξ is missing", () => { diff --git a/frontend/src/components/LeftoverPairList.tsx b/frontend/src/components/LeftoverPairList.tsx index acfe67639..aea34e847 100644 --- a/frontend/src/components/LeftoverPairList.tsx +++ b/frontend/src/components/LeftoverPairList.tsx @@ -146,6 +146,8 @@ export type LeftoverPairListProps = { * independently of leftover-map comparison graphic leftover-map post leftover-map origin leftover-map person coordinates. * ADR 0340 captions leftover-map pair leftover-map criterion leftover-map item coordinates through leftoverMapListCriterionBadge * independently of leftover-map pair leftover-map post leftover-map person coordinates. + * ADR 0352 captions leftover-map origin on leftover-map pair leftover-map criterion leftover-map item coordinates through leftoverMapListCriterionBadge + * independently of leftover-map pair leftover-map post leftover-map origin leftover-map person coordinates. * ADR 0341 captions leftover-map comparison leftover-pair leftover-map post leftover-map person coordinates through leftoverMapCompareListPostBadge, * not this pair list. * ADR 0342 captions leftover-map comparison leftover-pair leftover-map criterion leftover-map item coordinates through leftoverMapCompareListCriterionBadge, diff --git a/frontend/src/i18n.test.ts b/frontend/src/i18n.test.ts index 58f812205..f0318aa61 100644 --- a/frontend/src/i18n.test.ts +++ b/frontend/src/i18n.test.ts @@ -63,6 +63,7 @@ describe("i18n", () => { "leftover pair leftover-map post {title} at ξ {person}", "leftover pair leftover-map post {title} at leftover-map origin ξ {person}", "leftover pair leftover-map criterion {label} at ζ {item}", + "leftover pair leftover-map criterion {label} at leftover-map origin ζ {item}", "leftover map comparison leftover pair leftover-map post {title} at ξ {person}", "leftover map comparison leftover pair leftover-map criterion {label} at ζ {item}", "Open this post to read the criterion it sat closest to after main effects.", diff --git a/frontend/src/i18n.ts b/frontend/src/i18n.ts index 69784f1d0..880d5cfde 100644 --- a/frontend/src/i18n.ts +++ b/frontend/src/i18n.ts @@ -671,6 +671,8 @@ const TRANSLATIONS: Partial>> = { "잔여 쌍 잔여 지도 원점 글 {title} (ξ {person})", "leftover pair leftover-map criterion {label} at ζ {item}": "잔여 쌍 잔여 지도 기준 {label} (ζ {item})", + "leftover pair leftover-map criterion {label} at leftover-map origin ζ {item}": + "잔여 쌍 잔여 지도 원점 기준 {label} (ζ {item})", "leftover map comparison leftover pair leftover-map post {title} at ξ {person}": "잔여 지도 비교 잔여 쌍 잔여 지도 글 {title} (ξ {person})", "leftover map comparison leftover pair leftover-map criterion {label} at ζ {item}": @@ -1399,6 +1401,8 @@ const TRANSLATIONS: Partial>> = { "残差配对残差图原点帖子 {title}(ξ {person})", "leftover pair leftover-map criterion {label} at ζ {item}": "残差配对残差图准则 {label}(ζ {item})", + "leftover pair leftover-map criterion {label} at leftover-map origin ζ {item}": + "残差配对残差图原点准则 {label}(ζ {item})", "leftover map comparison leftover pair leftover-map post {title} at ξ {person}": "残差图比较残差配对残差图帖子 {title}(ξ {person})", "leftover map comparison leftover pair leftover-map criterion {label} at ζ {item}": @@ -2131,6 +2135,8 @@ const TRANSLATIONS: Partial>> = { "残差ペアの残差マップ原点投稿 {title}(ξ {person})", "leftover pair leftover-map criterion {label} at ζ {item}": "残差ペアの残差マップ基準 {label}(ζ {item})", + "leftover pair leftover-map criterion {label} at leftover-map origin ζ {item}": + "残差ペアの残差マップ原点基準 {label}(ζ {item})", "leftover map comparison leftover pair leftover-map post {title} at ξ {person}": "残差マップ比較の残差ペアの残差マップ投稿 {title}(ξ {person})", "leftover map comparison leftover pair leftover-map criterion {label} at ζ {item}": @@ -2867,6 +2873,8 @@ const TRANSLATIONS: Partial>> = { "Cặp phần dư bài gốc bản đồ phần dư {title} tại ξ {person}", "leftover pair leftover-map criterion {label} at ζ {item}": "Cặp phần dư tiêu chí bản đồ phần dư {label} tại ζ {item}", + "leftover pair leftover-map criterion {label} at leftover-map origin ζ {item}": + "Cặp phần dư tiêu chí gốc bản đồ phần dư {label} tại ζ {item}", "leftover map comparison leftover pair leftover-map post {title} at ξ {person}": "Cặp phần dư so sánh bản đồ phần dư bài viết {title} tại ξ {person}", "leftover map comparison leftover pair leftover-map criterion {label} at ζ {item}": diff --git a/frontend/src/leftoverMapAxisBadge.ts b/frontend/src/leftoverMapAxisBadge.ts index 09463b99c..7a6905942 100644 --- a/frontend/src/leftoverMapAxisBadge.ts +++ b/frontend/src/leftoverMapAxisBadge.ts @@ -40,6 +40,8 @@ * item coordinates as leftoverMapComparePlotCriterionBadge, not this helper. * ADR 0351 names leftover-map origin on leftover-map pair leftover-map post leftover-map * person coordinates as leftoverMapListPostBadge, not this helper. + * ADR 0352 names leftover-map origin on leftover-map pair leftover-map criterion leftover-map + * item coordinates as leftoverMapListCriterionBadge, not this helper. */ import type { LeftoverMapAxis } from "./api"; diff --git a/frontend/src/leftoverMapCoordinates.test.ts b/frontend/src/leftoverMapCoordinates.test.ts index 4ca8cae41..24f5f2c27 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_CRITERION, LEFTOVER_MAP_LIST_CRITERION, + LEFTOVER_MAP_LIST_CRITERION_ORIGIN, LEFTOVER_MAP_LIST_POST_ACTION, LEFTOVER_MAP_LIST_POST_ACTION_ORIGIN, } from "./leftoverMapCoordinates"; @@ -107,12 +108,17 @@ describe("leftoverMapPlotCoordinatePairIsOrigin", () => { expect(leftoverMapComparePlotCriterionBadge("sales-lead", 0, 0)?.key).not.toBe( LEFTOVER_MAP_COMPARE_PLOT_POST_ACTION_ORIGIN, ); + expect(leftoverMapListCriterionBadge("sales-lead", 0, 0)?.key).toBe(LEFTOVER_MAP_LIST_CRITERION_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(leftoverMapListCriterionBadge("sales-lead", 0, 0)?.key).not.toBe(LEFTOVER_MAP_LIST_CRITERION); + expect(leftoverMapListCriterionBadge("sales-lead", 0, 0)?.key).not.toBe( + LEFTOVER_MAP_LIST_POST_ACTION_ORIGIN, + ); expect(leftoverMapListPostBadge("Public post", 0, 0)?.key).toBe(LEFTOVER_MAP_LIST_POST_ACTION_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( @@ -150,6 +156,9 @@ describe("leftoverMapListPostBadge", () => { expect(leftoverMapListPostBadge("Public post", 0, 0)?.key).not.toBe( LEFTOVER_MAP_COMPARE_PLOT_POST_ACTION_ORIGIN, ); + expect(leftoverMapListPostBadge("Public post", 0, 0)?.key).not.toBe( + LEFTOVER_MAP_LIST_CRITERION_ORIGIN, + ); expect(leftoverMapComparePlotPostBadge("Public post", 0, 0)?.key).not.toBe( LEFTOVER_MAP_LIST_POST_ACTION_ORIGIN, ); @@ -181,6 +190,7 @@ describe("leftoverMapListPostBadge", () => { expect(LEFTOVER_MAP_LIST_POST_ACTION_ORIGIN).not.toBe(LEFTOVER_MAP_LIST_POST_ACTION); expect(LEFTOVER_MAP_LIST_POST_ACTION_ORIGIN).not.toBe(LEFTOVER_MAP_PLOT_POST_ACTION_ORIGIN); expect(LEFTOVER_MAP_LIST_POST_ACTION_ORIGIN).not.toBe(LEFTOVER_MAP_COMPARE_PLOT_POST_ACTION_ORIGIN); + expect(LEFTOVER_MAP_LIST_POST_ACTION_ORIGIN).not.toBe(LEFTOVER_MAP_LIST_CRITERION_ORIGIN); 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); @@ -213,11 +223,12 @@ describe("leftoverMapListCriterionBadge", () => { }); }); - 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 pair leftover-map post leftover-map origin leftover-map person coordinates", () => { expect(leftoverMapListCriterionBadge("sales-lead", 0, 0)).toEqual({ - key: LEFTOVER_MAP_LIST_CRITERION, + key: LEFTOVER_MAP_LIST_CRITERION_ORIGIN, values: { label: "sales-lead", item: "(0.00, 0.00)" }, }); + expect(leftoverMapListCriterionBadge("sales-lead", 0, 0)?.key).not.toBe(LEFTOVER_MAP_LIST_CRITERION); expect(leftoverMapListCriterionBadge("sales-lead", 0, 0)?.key).not.toBe( LEFTOVER_MAP_COMPARE_PLOT_CRITERION_ORIGIN, ); @@ -227,6 +238,12 @@ describe("leftoverMapListCriterionBadge", () => { expect(leftoverMapListCriterionBadge("sales-lead", 0, 0)?.key).not.toBe( LEFTOVER_MAP_LIST_POST_ACTION_ORIGIN, ); + expect(leftoverMapComparePlotCriterionBadge("sales-lead", 0, 0)?.key).not.toBe( + LEFTOVER_MAP_LIST_CRITERION_ORIGIN, + ); + expect(leftoverMapCompareListCriterionBadge("sales-lead", 0, 0)?.key).not.toBe( + LEFTOVER_MAP_LIST_CRITERION_ORIGIN, + ); }); it("omits leftover-map item coordinates when ζ is missing or non-finite", () => { @@ -247,6 +264,13 @@ describe("leftoverMapListCriterionBadge", () => { expect(LEFTOVER_MAP_LIST_CRITERION).toBe( "leftover pair leftover-map criterion {label} at ζ {item}", ); + expect(LEFTOVER_MAP_LIST_CRITERION_ORIGIN).toBe( + "leftover pair leftover-map criterion {label} at leftover-map origin ζ {item}", + ); + expect(LEFTOVER_MAP_LIST_CRITERION_ORIGIN).not.toBe(LEFTOVER_MAP_LIST_CRITERION); + expect(LEFTOVER_MAP_LIST_CRITERION_ORIGIN).not.toBe(LEFTOVER_MAP_PLOT_CRITERION_ORIGIN); + expect(LEFTOVER_MAP_LIST_CRITERION_ORIGIN).not.toBe(LEFTOVER_MAP_COMPARE_PLOT_CRITERION_ORIGIN); + expect(LEFTOVER_MAP_LIST_CRITERION_ORIGIN).not.toBe(LEFTOVER_MAP_LIST_POST_ACTION_ORIGIN); 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); @@ -265,6 +289,9 @@ describe("leftoverMapListCriterionBadge", () => { expect(leftoverMapListCriterionBadge("sales-lead", 0.5, -0.02)?.key).not.toBe( leftoverMapCompareListCriterionBadge("sales-lead", 0.5, -0.02)?.key ?? "", ); + expect(leftoverMapListCriterionBadge("sales-lead", 0.5, -0.02)?.key).not.toBe( + LEFTOVER_MAP_LIST_CRITERION_ORIGIN, + ); }); }); @@ -355,6 +382,9 @@ describe("leftoverMapCompareListCriterionBadge", () => { expect(leftoverMapCompareListCriterionBadge("sales-lead", 0, 0)?.key).not.toBe( LEFTOVER_MAP_PLOT_CRITERION_ORIGIN, ); + expect(leftoverMapCompareListCriterionBadge("sales-lead", 0, 0)?.key).not.toBe( + LEFTOVER_MAP_LIST_CRITERION_ORIGIN, + ); }); it("omits leftover-map item coordinates when ζ is missing or non-finite", () => { @@ -376,6 +406,7 @@ describe("leftoverMapCompareListCriterionBadge", () => { "leftover map comparison leftover pair leftover-map criterion {label} at ζ {item}", ); 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); 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); @@ -393,5 +424,8 @@ describe("leftoverMapCompareListCriterionBadge", () => { expect(leftoverMapCompareListCriterionBadge("sales-lead", 0.5, -0.02)?.key).not.toBe( leftoverMapCompareListPostBadge("Public post", 0.5, 0.1)?.key ?? "", ); + expect(leftoverMapCompareListCriterionBadge("sales-lead", 0.5, -0.02)?.key).not.toBe( + LEFTOVER_MAP_LIST_CRITERION_ORIGIN, + ); }); }); diff --git a/frontend/src/leftoverMapCoordinates.ts b/frontend/src/leftoverMapCoordinates.ts index 3ba947f73..e1f85c12b 100644 --- a/frontend/src/leftoverMapCoordinates.ts +++ b/frontend/src/leftoverMapCoordinates.ts @@ -19,6 +19,10 @@ * person coordinates as leftoverMapListPostBadge independently of leftover-map comparison graphic leftover-map post leftover-map * origin leftover-map person coordinates. leftoverMapCompareListPostBadge stays leftover-map comparison leftover-pair leftover-map * post leftover-map person coordinate keys. + * 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. */ import { formatSignedLeftoverValue } from "./leftoverMapUnexplained"; @@ -38,6 +42,9 @@ export const LEFTOVER_MAP_LIST_POST_ACTION_ORIGIN = export const LEFTOVER_MAP_LIST_CRITERION = "leftover pair leftover-map criterion {label} at ζ {item}"; +export const LEFTOVER_MAP_LIST_CRITERION_ORIGIN = + "leftover pair leftover-map criterion {label} at leftover-map origin ζ {item}"; + export const LEFTOVER_MAP_COMPARE_LIST_POST_ACTION = "leftover map comparison leftover pair leftover-map post {title} at ξ {person}"; @@ -104,6 +111,8 @@ export function formatLeftoverMapCoordinates( * ADR 0351 names leftover-map origin on leftover-map pair leftover-map post leftover-map * person coordinates as leftoverMapListPostBadge independently of leftover-map comparison graphic leftover-map post leftover-map * origin leftover-map person coordinates. + * ADR 0352 names leftover-map origin on leftover-map pair leftover-map criterion leftover-map + * item coordinates as leftoverMapListCriterionBadge, not this helper. */ export function leftoverMapListPostBadge( title: string, @@ -126,6 +135,9 @@ export function leftoverMapListPostBadge( * 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. + * 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. */ export function leftoverMapListCriterionBadge( label: string, @@ -136,7 +148,11 @@ export function leftoverMapListCriterionBadge( if (item === null) { return null; } - return { key: LEFTOVER_MAP_LIST_CRITERION, values: { label, item } }; + const origin = leftoverMapPlotCoordinatePairIsOrigin(item); + return { + key: origin ? LEFTOVER_MAP_LIST_CRITERION_ORIGIN : LEFTOVER_MAP_LIST_CRITERION, + values: { label, item }, + }; } /** ADR 0341 leftover-map comparison leftover-pair leftover-map post leftover-map person coordinates ξ. @@ -158,6 +174,8 @@ export function leftoverMapCompareListPostBadge( /** 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. + * ADR 0352 names leftover-map origin on leftover-map pair leftover-map criterion leftover-map + * item coordinates as leftoverMapListCriterionBadge, not this helper. */ export function leftoverMapCompareListCriterionBadge( label: string, diff --git a/frontend/src/leftoverMapPlotAxisSingular.ts b/frontend/src/leftoverMapPlotAxisSingular.ts index c3cd6eb47..747f582bd 100644 --- a/frontend/src/leftoverMapPlotAxisSingular.ts +++ b/frontend/src/leftoverMapPlotAxisSingular.ts @@ -55,6 +55,9 @@ * ADR 0351 names leftover-map origin on leftover-map pair leftover-map post leftover-map * person coordinates as leftoverMapListPostBadge independently of leftover-map comparison graphic leftover-map post leftover-map * origin leftover-map person coordinates, not leftoverMapPlotTickAxisBadge. + * 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, not leftoverMapPlotTickAxisBadge. */ import type { LeftoverMapAxis } from "./api"; diff --git a/frontend/src/leftoverMapPlotLayout.test.ts b/frontend/src/leftoverMapPlotLayout.test.ts index c1ef0c795..b7ccfc595 100644 --- a/frontend/src/leftoverMapPlotLayout.test.ts +++ b/frontend/src/leftoverMapPlotLayout.test.ts @@ -37,7 +37,7 @@ import { PLOT_PADDING, PLOT_WIDTH, } from "./leftoverMapPlotLayout"; -import { leftoverMapCompareListCriterionBadge, leftoverMapCompareListPostBadge, leftoverMapListPostBadge } from "./leftoverMapCoordinates"; +import { leftoverMapCompareListCriterionBadge, leftoverMapCompareListPostBadge, leftoverMapListCriterionBadge, leftoverMapListPostBadge } from "./leftoverMapCoordinates"; function pair( overrides: Partial = {}, @@ -1438,6 +1438,9 @@ describe("leftoverMapComparePlotPostBadge", () => { expect(leftoverMapComparePlotPostBadge("Public post", 0, 0)?.key).not.toBe( leftoverMapListPostBadge("Public post", 0, 0)?.key ?? "", ); + expect(leftoverMapListCriterionBadge("sales-lead", 0, 0)?.key).not.toBe( + leftoverMapListPostBadge("Public post", 0, 0)?.key ?? "", + ); }); it("omits leftover-map person coordinates when ξ is missing or non-finite", () => { diff --git a/frontend/src/leftoverMapPlotLayout.ts b/frontend/src/leftoverMapPlotLayout.ts index 2324542a0..5b04856b9 100644 --- a/frontend/src/leftoverMapPlotLayout.ts +++ b/frontend/src/leftoverMapPlotLayout.ts @@ -179,6 +179,10 @@ * person coordinates through leftoverMapListPostBadge independently of leftover-map * comparison graphic leftover-map post leftover-map origin leftover-map person coordinates ξ, not leftover-map comparison graphic leftover-map post leftover-map * person coordinates. + * ADR 0352 fail-closes leftover-map pair leftover-map criterion leftover-map origin leftover-map + * item coordinates through leftoverMapListCriterionBadge independently of leftover-map + * pair leftover-map post leftover-map origin leftover-map person coordinates ξ, not leftover-map comparison leftover-pair leftover-map criterion leftover-map + * item coordinates. */ import { formatLeftoverMapCoordinatePair, leftoverMapPlotCoordinatePairIsOrigin } from "./leftoverMapCoordinates"; diff --git a/pyproject.toml b/pyproject.toml index 3f8a85dde..e7a795d55 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "lineageweave" -version = "2.108.0" +version = "2.109.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" }