Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -826,6 +826,11 @@ post leftover-map person coordinates stay `leftover map comparison leftover pair
criterion leftover-map item coordinates stay `leftover pair leftover-map criterion {label} at ζ {item}` this increment. Leftover-map graphic leftover-map
criterion markers stay `leftover-map criterion {label} at ζ {item}` this increment. Leftover-map comparison graphic leftover-map
criterion markers stay `leftover map comparison graphic leftover-map criterion {label} at ζ {item}` this increment.
ADR 0343 captions leftover-map graphic leftover-map axis origin ticks with leftover-map origin when leftoverMapPlotTickAxisBadge
returns a leftover-map origin tick caption independently of leftover-map axis share and leftover-map singular values. Distinct accessible name
`leftover-map axis {axis} origin tick {value}`. Rank-0 unused axes still name leftover-map origin `0.00`. Share and singular omit independently.
Do not invent leftover-map origin from leftover-map axis share or leftover-map singular values `σ_k`. leftoverMapComparePlotTickAxisBadge stays
`leftover map comparison graphic leftover-map axis {axis} tick {value}` 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
Expand Down Expand Up @@ -999,6 +1004,8 @@ Leftover-map comparison leftover-pair leftover-map criterion leftover-map item c
(ADR 0342) captions leftover-map comparison leftover-pair leftover-map criterion with persisted leftover-map
item coordinates when leftoverMapCompareListCriterionBadge returns a usable leftover-map comparison leftover-pair leftover-map criterion leftover-map
item coordinate caption.
Leftover-map graphic leftover-map axis origin ticks independently of leftover-map axis share and leftover-map singular values
(ADR 0343) captions leftover-map graphic leftover-map axis origin ticks when leftoverMapPlotTickAxisBadge returns a leftover-map origin tick 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)
Expand Down
2 changes: 2 additions & 0 deletions ARCHITECTURE.md
Original file line number Diff line number Diff line change
Expand Up @@ -809,6 +809,8 @@ person coordinate caption independently of leftover-map comparison leftover-pair
ADR 0342 captions leftover-map comparison leftover-pair leftover-map criterion with persisted leftover-map
item coordinates when leftoverMapCompareListCriterionBadge returns a usable leftover-map comparison leftover-pair leftover-map criterion leftover-map
item coordinate caption independently of leftover-map comparison leftover-pair leftover-map post leftover-map person coordinates.
ADR 0343 captions leftover-map graphic leftover-map axis origin ticks when leftoverMapPlotTickAxisBadge
returns a leftover-map origin tick caption independently of leftover-map axis share and leftover-map singular values.
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
Expand Down
16 changes: 16 additions & 0 deletions CHANGELOG.d/2.100.0-leftover-map-plot-tick-origin-badge.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
## 2.100.0 — Leftover-map origin on leftover-map graphic leftover-map axis ticks independently of leftover-map axis share and leftover-map singular values

- Caption leftover-map graphic leftover-map axis origin ticks through leftoverMapPlotTickAxisBadge
independently of leftover-map axis share and leftover-map singular values (ADR 0343). After `make seed`, leftover-map graphic leftover-map
axis origin ticks name leftover-map origin when leftoverMapPlotTickIsOrigin returns true. Distinct accessible name
`leftover-map axis {axis} origin tick {value}`. Rank-0 unused axes still name leftover-map origin `0.00`. Share and
singular omit independently as
`leftover-map axis {axis} origin tick {value} σ {singular}`,
`leftover-map axis {axis} origin tick {value} {share}%`, and
`leftover-map axis {axis} origin tick {value} σ {singular} {share}%`.
Non-origin leftover-map graphic leftover-map axis ticks stay
`leftover-map axis {axis} tick {value}`. leftoverMapComparePlotTickAxisBadge stays
`leftover map comparison graphic leftover-map axis {axis} tick {value}`
this increment. Do not invent leftover-map origin from leftover-map axis share or leftover-map singular values `σ_k`.
Do not mix #877. A finite negative leftover is shown, never clamped. Never invent a leftover score.
Never invent a theta. No new columns.
14 changes: 14 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,20 @@ All notable changes to this project are documented here. Format follows

### Added

- Period leftover pairs now caption leftover-map graphic leftover-map axis origin ticks
through leftoverMapPlotTickAxisBadge independently of leftover-map axis share and leftover-map singular values (ADR 0343 / v2.100.0). After `make seed`, leftover-map graphic leftover-map
axis origin ticks name leftover-map origin when leftoverMapPlotTickIsOrigin returns true. Distinct accessible name
`leftover-map axis {axis} origin tick {value}`. Rank-0 unused axes still name leftover-map origin `0.00`. Share and
singular omit independently as
`leftover-map axis {axis} origin tick {value} σ {singular}`,
`leftover-map axis {axis} origin tick {value} {share}%`, and
`leftover-map axis {axis} origin tick {value} σ {singular} {share}%`.
Non-origin leftover-map graphic leftover-map axis ticks stay
`leftover-map axis {axis} tick {value}`. leftoverMapComparePlotTickAxisBadge stays
`leftover map comparison graphic leftover-map axis {axis} tick {value}`
this increment. Do not invent leftover-map origin from leftover-map axis share or leftover-map singular values `σ_k`.
Do not mix #877. A finite negative leftover is shown, never clamped. Never invent a leftover score or a theta. No new columns.

- Period leftover pairs now caption leftover-map comparison leftover-pair leftover-map
criterion with persisted leftover-map item coordinates through leftoverMapCompareListCriterionBadge
independently of leftover-map comparison leftover-pair leftover-map post leftover-map person coordinates (ADR 0342 / v2.99.0). After `make seed`,
Expand Down
2 changes: 1 addition & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -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), 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), 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),
Expand Down
3 changes: 3 additions & 0 deletions docs/adr/0327-leftover-map-plot-tick-axis-badge.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@
**Decision status:** Accepted
**Date:** 2026-08-31

**Amended by:** [ADR 0343](0343-leftover-map-plot-tick-origin-badge.md)
(leftover-map origin on leftover-map graphic leftover-map axis ticks independently of leftover-map axis share and leftover-map singular values)

Amends leftover-map coordinate ticks on the leftover-map graphic
([ADR 0270](0270-leftover-map-coordinate-ticks.md)), leftover-map singular
values on leftover-map graphic-display axes
Expand Down
3 changes: 3 additions & 0 deletions docs/adr/0332-leftover-map-plot-tick-share-badge.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@
**Decision status:** Accepted
**Date:** 2026-08-31

**Amended by:** [ADR 0343](0343-leftover-map-plot-tick-origin-badge.md)
(leftover-map origin on leftover-map graphic leftover-map axis ticks independently of leftover-map axis share and leftover-map singular values)

Amends leftover-map graphic leftover-map axis tick leftover-map singular
values independently of leftover-map axis share
([ADR 0327](0327-leftover-map-plot-tick-axis-badge.md)), leftover-map
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@
**Decision status:** Accepted
**Date:** 2026-08-31

**Amended by:** [ADR 0343](0343-leftover-map-plot-tick-origin-badge.md)
(leftover-map origin on leftover-map graphic leftover-map axis ticks independently of leftover-map axis share and leftover-map singular values)

Amends leftover-map coordinates
([ADR 0267](0267-leftover-map-coordinates.md)) and leftover-map coordinates on grouping comparison strip pair rows
([ADR 0302](0302-leftover-map-compare-coordinates.md)). Independent of leftover-map
Expand Down
91 changes: 91 additions & 0 deletions docs/adr/0343-leftover-map-plot-tick-origin-badge.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
# ADR 0343 — Name leftover-map origin on leftover-map graphic leftover-map axis ticks independently of leftover-map axis share and leftover-map singular values

**Decision status:** Accepted
**Date:** 2026-08-31

Amends leftover-map coordinate ticks
([ADR 0270](0270-leftover-map-coordinate-ticks.md)), leftover-map graphic leftover-map axis ticks leftover-map singular values
([ADR 0327](0327-leftover-map-plot-tick-axis-badge.md)), and leftover-map graphic leftover-map axis ticks leftover-map axis share
([ADR 0332](0332-leftover-map-plot-tick-share-badge.md)). Independent of leftover-map
comparison leftover-pair leftover-map criterion leftover-map item coordinates independently of leftover-map comparison leftover-pair leftover-map post leftover-map person coordinates
([ADR 0342](0342-leftover-map-compare-list-criterion-coordinates.md)). Independent of leftover-map
comparison graphic leftover-map axis origin ticks (do not mix #877).

## Context

ADR 0270 already names leftover-map graphic leftover-map axis ticks
`leftover-map axis {axis} tick {value}`. ADR 0327 already names leftover-map
singular values `σ_k` on those ticks. ADR 0332 already names leftover-map
axis share on those ticks. Rank-0 unused axes still persist leftover-map
origin `0.00` (`formatSignedLeftoverValue(0)` emits no plus). Origin ticks
still interpolate leftover-map origin only through leftover-map tick keys.
Share and singular omit independently. A finite negative leftover is shown,
never clamped. Do not invent leftover-map origin from leftover-map axis share
or leftover-map singular values `σ_k`. leftoverMapComparePlotTickAxisBadge stays
`leftover map comparison graphic leftover-map axis {axis} tick {value}`
this increment.

This increment names leftover-map graphic leftover-map axis origin ticks as
leftoverMapPlotTickAxisBadge. Leftover-map graphic leftover-map axis origin ticks stay
`leftover-map axis {axis} origin tick {value}`
when leftoverMapPlotTickIsOrigin returns true, so they stay distinct from leftover-map
graphic leftover-map axis ticks
`leftover-map axis {axis} tick {value}`
and leftover-map comparison graphic leftover-map axis ticks
`leftover map comparison graphic leftover-map axis {axis} tick {value}`.
Share and singular still omit independently:
`leftover-map axis {axis} origin tick {value} σ {singular}`,
`leftover-map axis {axis} origin tick {value} {share}%`, and
`leftover-map axis {axis} origin tick {value} σ {singular} {share}%`.
It does not add columns. Do not invent a leftover score. Do not invent a theta.

This protected increment uses **0343** so it does not collide with leftover-map
item coordinates on leftover-map comparison leftover pair leftover-map criterion independently of leftover-map comparison leftover pair leftover-map post leftover-map person coordinates
(0342) or leftover-map comparison graphic leftover-map axis origin ticks (#877).

## Decision

On leftover-map graphic leftover-map axis ticks, caption leftover-map origin
when leftoverMapPlotTickIsOrigin returns true. Rank-0 unused axes still name leftover-map
origin `0.00`. Share and singular omit independently of leftover-map origin.
Non-origin ticks stay leftover-map tick keys. leftoverMapComparePlotTickAxisBadge,
leftoverMapCompareAxisTickBadge, and leftoverMapAxisTickBadge do not name leftover-map
origin 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 graphic leftover-map axis origin ticks name
leftover-map origin independently of leftover-map axis share and leftover-map
singular values. Rank-0 unused axes still name leftover-map origin `0.00`.
leftoverMapComparePlotTickAxisBadge stays leftover-map comparison graphic leftover-map
axis tick keys. leftover-map graphic leftover-map axis ticks leftover-map singular values
independently of leftover-map axis share (ADR 0327) and leftover-map graphic leftover-map
axis ticks leftover-map axis share independently of leftover-map singular values
(ADR 0332) remain.

## Related

Independent of leftover-map comparison leftover-pair leftover-map criterion leftover-map item coordinates independently of leftover-map
comparison leftover-pair leftover-map post leftover-map person coordinates
([ADR 0342](0342-leftover-map-compare-list-criterion-coordinates.md)). Independent of leftover-map
graphic leftover-map axis ticks leftover-map axis share independently of leftover-map
singular values ([ADR 0332](0332-leftover-map-plot-tick-share-badge.md)). Independent of leftover-map
graphic leftover-map axis ticks leftover-map singular values independently of leftover-map
axis share ([ADR 0327](0327-leftover-map-plot-tick-axis-badge.md)). Independent of leftover-map
coordinate ticks ([ADR 0270](0270-leftover-map-coordinate-ticks.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.)
9 changes: 9 additions & 0 deletions docs/product-technical-gap-baseline.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,14 @@
# Product & Technical Gap Baseline

> Exact-head loop overlay: 2026-08-31 18:55 KST. Protected `main` is
> `cb187cadee5fb6c46d8a944815ccc154a1e028d1`. Writes work. Do not
> self-approve. #884 leftover-map item coordinates on leftover-map comparison leftover pair leftover-map
> criterion independently of leftover-map comparison leftover pair leftover-map post leftover-map person coordinates (v2.99.0 / ADR 0342) is
> `bcbb7ce`, stacked on #883 @ `bdd48e2`. Independent APPROVE is missing. Next buyer increment on this cycle: leftover-map graphic leftover-map
> axis origin ticks independently of leftover-map axis share and leftover-map singular values as leftoverMapPlotTickAxisBadge (ADR 0343 / v2.100.0) delivered locally on
> `feat/leftover-map-plot-tick-origin-badge-v21000`. Distinct accessible name
> `leftover-map axis {axis} origin tick {value}`. Rank-0 unused axes still name leftover-map origin `0.00`. Share and singular omit independently. leftoverMapComparePlotTickAxisBadge stays leftover-map comparison graphic leftover-map axis tick keys. Do not invent leftover-map origin from leftover-map axis share or `σ_k`. Do not mix #877. Stack onto #884. 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.

> Exact-head loop overlay: 2026-08-31 18:50 KST. Protected `main` is
> `cb187cadee5fb6c46d8a944815ccc154a1e028d1`. Writes work. Do not
> self-approve. #883 leftover-map person coordinates on leftover-map comparison leftover-pair leftover-map
Expand Down
2 changes: 1 addition & 1 deletion frontend/package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "frontend",
"private": true,
"version": "2.99.0",
"version": "2.100.0",
"type": "module",
"scripts": {
"dev": "vite",
Expand Down
8 changes: 5 additions & 3 deletions frontend/src/components/LeftoverMapPlot.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ describe("LeftoverMapPlot", () => {
expect(screen.getByText("leftover-map axis 2")).toBeInTheDocument();
expect(screen.getByLabelText("leftover-map axis 1 tick +0.50")).toBeInTheDocument();
expect(screen.getByLabelText("leftover-map axis 2 tick −0.02")).toBeInTheDocument();
expect(screen.getByLabelText("leftover-map axis 1 tick 0.00")).toBeInTheDocument();
expect(screen.getByLabelText("leftover-map axis 1 origin tick 0.00")).toBeInTheDocument();
expect(screen.getByLabelText("leftover-map distance d 0.12")).toBeInTheDocument();
expect(screen.getByLabelText("leftover-map distance d 1.84")).toBeInTheDocument();
expect(screen.getByLabelText("leftover-map reconstruction R̂ +0.25")).toBeInTheDocument();
Expand Down Expand Up @@ -176,9 +176,11 @@ describe("LeftoverMapPlot", () => {
expect(screen.queryByLabelText("Criterion ζ sales-lead")).not.toBeInTheDocument();
expect(screen.getByText("leftover-map axis 1 σ 0.00 (0%)")).toBeInTheDocument();
expect(screen.getByText("leftover-map axis 2 σ 0.00 (0%)")).toBeInTheDocument();
expect(screen.getAllByLabelText("leftover-map axis 1 tick 0.00 σ 0.00 0%").length).toBeGreaterThan(0);
expect(screen.getAllByLabelText("leftover-map axis 1 origin tick 0.00 σ 0.00 0%").length).toBeGreaterThan(0);
expect(screen.queryByLabelText("leftover-map axis 1 tick 0.00")).not.toBeInTheDocument();
expect(screen.queryByLabelText("leftover-map axis 1 origin tick 0.00")).not.toBeInTheDocument();
expect(screen.queryByLabelText("leftover-map axis 1 tick 0.00 σ 0.00")).not.toBeInTheDocument();
expect(screen.queryByLabelText("leftover-map axis 1 origin tick 0.00 σ 0.00")).not.toBeInTheDocument();
expect(screen.queryByLabelText("leftover-map axis 1 tick +1.00")).not.toBeInTheDocument();
expect(screen.getByLabelText("leftover-map distance d 0.00")).toBeInTheDocument();
expect(screen.getByLabelText("leftover-map reconstruction R̂ 0.00")).toBeInTheDocument();
Expand Down Expand Up @@ -222,7 +224,7 @@ describe("LeftoverMapPlot", () => {
/>,
);
expect(screen.getByLabelText("leftover-map axis 1 tick +0.50 σ 1.84")).toBeInTheDocument();
expect(screen.getByLabelText("leftover-map axis 1 tick 0.00 σ 1.84")).toBeInTheDocument();
expect(screen.getByLabelText("leftover-map axis 1 origin tick 0.00 σ 1.84")).toBeInTheDocument();
expect(screen.getByLabelText("leftover-map axis 2 tick −0.02")).toBeInTheDocument();
expect(screen.queryByLabelText("leftover-map axis 1 tick +0.50")).not.toBeInTheDocument();
expect(screen.queryByText(/leftover-map axis 1 tick \+0\.50 \(82%\)/)).not.toBeInTheDocument();
Expand Down
4 changes: 4 additions & 0 deletions frontend/src/components/LeftoverMapPlot.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -281,6 +281,10 @@ function leftoverMapPlotPostText(
* ADR 0332 fail-closes leftover-map graphic leftover-map axis ticks leftover-map
* axis share through leftoverMapPlotTickAxisBadge independently of leftover-map
* singular values.
* ADR 0343 fail-closes leftover-map graphic leftover-map axis origin ticks through
* leftoverMapPlotTickAxisBadge independently of leftover-map axis share and leftover-map
* singular values. leftoverMapComparePlotTickAxisBadge does not name leftover-map origin
* this increment.
* Never invent a leftover score.
*/
export function LeftoverMapPlot({
Expand Down
Loading