Skip to content
Open
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
11 changes: 10 additions & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -273,7 +273,7 @@ stops startup instead of leaving a healthy-looking partial schema, and
application code must not compensate for a missing table.

Period leftover pairs (ADR 0017 / 0018 / 0048 / 0049 / 0119 / 0158 / 0162 /
0163 / 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) are computed in `lineageweave/leftover_pairs.py` from the
0163 / 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) are computed in `lineageweave/leftover_pairs.py` from the
residual after a real GRM/GPCM score, never invented. Distances are
Euclidean on the two-dimensional Gabriel leftover map; missing cells stay
out of the factorization. Closest and farthest post–criterion pairs
Expand Down Expand Up @@ -646,6 +646,12 @@ distance, leftover-map rank, leftover expected, leftover observed, leftover resi
leftover-map unexplained leftover, leftover-map reconstruction, leftover-map post coverage,
leftover-map item coverage, leftover-map incomplete post coverage, leftover-map incomplete
item coverage, leftover pair count, or the count of unused axes.
ADR 0322 captions leftover-axis report badges with persisted leftover-map singular
values `σ_k` when leftoverMapAxisBadgeSingular returns a usable finite non-negative
value; a missing, non-finite, or negative singular value omits that `σ` badge and
keeps `leftover axis {k} {share}%`. Do not invent leftover-map singular values from
leftover-map axis share. The grouping comparison strip does not gain leftover-axis
report badges with a distinct comparison-strip name.
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 @@ -744,6 +750,9 @@ ticks at the origin and at each unique finite `ξ` / `ζ` projection.
Grouping comparison leftover-map singular values (ADR 0321) captions
that grouping comparison leftover-map graphic with persisted leftover-map singular
values `σ_k` when leftoverSingularForAxis returns a usable finite non-negative value.
Leftover-axis report badge leftover-map singular values (ADR 0322) captions leftover-axis
report badges with persisted leftover-map singular values `σ_k` when leftoverMapAxisBadgeSingular
returns a usable finite non-negative value.
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
5 changes: 4 additions & 1 deletion ARCHITECTURE.md
Original file line number Diff line number Diff line change
Expand Up @@ -750,6 +750,8 @@ ADR 0320 captions leftover-map coordinate ticks on that grouping
comparison leftover-map graphic from already-named leftover-map coordinates.
ADR 0321 captions leftover-map singular values on that grouping
comparison leftover-map graphic from already-named leftover-map axes.
ADR 0322 captions leftover-axis report badges with persisted leftover-map
singular values `σ_k`.
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 Expand Up @@ -800,7 +802,8 @@ graphic (ADR 0317), leftover-map rank on the grouping comparison leftover-map
graphic (ADR 0318), leftover-map distance on the grouping comparison leftover-map
graphic (ADR 0319), leftover-map coordinate ticks on the grouping comparison leftover-map
graphic (ADR 0320), leftover-map singular values on the grouping comparison leftover-map
graphic (ADR 0321);
graphic (ADR 0321), leftover-map singular values on leftover-axis report badges
(ADR 0322);
`POST .../rebuild` scores every grouping kind (post_admin). `make seed`
folds A-100/B-200 Event Lineage fixtures (and the Riverbend calendar
post) that already have constructed IRT cells into the same shared
Expand Down
17 changes: 17 additions & 0 deletions CHANGELOG.d/2.79.0-leftover-map-axis-singular.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
## 2.79.0 — Leftover-map singular values on leftover-axis report badges

- Caption leftover-axis report badges with persisted leftover-map singular
values `σ_k` (ADR 0322). After `make seed`, leftover-axis badges name
persisted leftover-map singular values when finite together with persisted
leftover-map axis share; click a leftover pair opens that post. A missing,
non-finite, or negative singular value omits that `σ` badge and keeps
`leftover axis {k} {share}%`. Rank-0 unused axes still name `σ 0.00`.
Pair-list leftover-axis badges stay `leftover axis {k} σ {value} {share}%`
so they stay distinct from hyphen `leftover-map axis {k} σ {value} ({share}%)`
and from comparison copy
`leftover map comparison graphic leftover-map axis {k} σ {value} ({share}%)`.
Do not invent `σ_k` from leftover-map axis share. This increment does not
caption leftover-map singular values on leftover-axis badges on the grouping
comparison strip with a distinct name. A finite negative leftover is shown,
never clamped. Never invent a leftover score. Never invent a theta. No new
columns.
18 changes: 17 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,21 @@ All notable changes to this project are documented here. Format follows

### Added

- Period leftover pairs now caption leftover-axis report badges with persisted
leftover-map singular values `σ_k` (ADR 0322 / v2.79.0). After `make seed`,
leftover-axis badges name persisted leftover-map singular values when finite
together with persisted leftover-map axis share; click a leftover pair opens
that post. A missing, non-finite, or negative singular value omits that `σ`
badge and keeps `leftover axis {k} {share}%`. Rank-0 unused axes still name
`σ 0.00`. Pair-list leftover-axis badges stay
`leftover axis {k} σ {value} {share}%` so they stay distinct from hyphen
`leftover-map axis {k} σ {value} ({share}%)` and from comparison copy
`leftover map comparison graphic leftover-map axis {k} σ {value} ({share}%)`.
Do not invent `σ_k` from leftover-map axis share. This increment does not
caption leftover-map singular values on leftover-axis badges on the grouping
comparison strip with a distinct name. A finite negative leftover is shown,
never clamped. Never invent a leftover score or a theta. No new columns.

- Period leftover pairs now name leftover-map singular values on the grouping
comparison leftover-map graphic (ADR 0321 / v2.78.0). After `make seed`,
closest and farthest leftover pairs sit above the member list with leftover-map
Expand All @@ -22,7 +37,8 @@ All notable changes to this project are documented here. Format follows
`leftover map comparison graphic leftover-map axis {axis} tick {value}`.
Share and singular value omit independently. Do not invent `σ_k` from
leftover-map axis share. This increment does not caption leftover-map
singular values on leftover-axis report badges with a distinct name.
singular values on leftover-axis report badges with a distinct name
(ADR 0322).
A finite negative leftover is shown, never clamped. Never invent a leftover
score or a theta. No new columns.

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), 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), 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
4 changes: 3 additions & 1 deletion docs/adr/0148-leftover-map-axis-share.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,9 @@
**Decision status:** Accepted
**Date:** 2026-08-24
**Amended by:** [ADR 0269](0269-leftover-map-axis-share-plot.md)
(leftover-map axis share on the graphic display)
(leftover-map axis share on the graphic display);
[ADR 0322](0322-leftover-map-axis-singular.md)
(leftover-map singular values on leftover-axis report badges)

## Context

Expand Down
9 changes: 6 additions & 3 deletions docs/adr/0321-leftover-map-compare-plot-singular.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@ graphic display on the grouping comparison strip
([ADR 0304](0304-leftover-map-compare-graphic.md)), leftover-map axis share
persistence ([ADR 0148](0148-leftover-map-axis-share.md)), leftover-map
coordinates ([ADR 0267](0267-leftover-map-coordinates.md)). Independent of
leftover-map singular values on leftover-axis report badges.
leftover-map singular values on leftover-axis report badges
([ADR 0322](0322-leftover-map-axis-singular.md)).

## Context

Expand Down Expand Up @@ -76,7 +77,8 @@ leftover-map unexplained leftover `U`, leftover-map reconstruction `R̂`,
and leftover-map comparison graphic coverage notes.

This increment does not caption leftover-map singular values on leftover-axis
report badges with a distinct comparison-strip name. Those leftover singular
report badges with a distinct comparison-strip name. Those leftover-axis report
badges are ADR 0322. Those leftover singular
values already persist on leftover-map axes through ADR 0148. This increment
does not persist leftover-map inner product, cosine, or length.

Expand All @@ -97,7 +99,8 @@ leftover-map axis share is `σ_k² / Σ_j σ_j²`.

## Related

Independent of leftover-map singular values on leftover-axis report badges.
Independent of leftover-map singular values on leftover-axis report badges
([ADR 0322](0322-leftover-map-axis-singular.md)).

## References

Expand Down
98 changes: 98 additions & 0 deletions docs/adr/0322-leftover-map-axis-singular.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
# ADR 0322 — Name leftover-map singular values on leftover-axis report badges

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

Amends leftover-map axis share persistence
([ADR 0148](0148-leftover-map-axis-share.md)). Independent of leftover-map
singular values on the grouping comparison leftover-map graphic
([ADR 0321](0321-leftover-map-compare-plot-singular.md)), leftover-map
coordinate ticks on that comparison graphic
([ADR 0320](0320-leftover-map-compare-plot-ticks.md)), leftover-map
axis share on that comparison graphic
([ADR 0305](0305-leftover-map-compare-plot-axis-share.md)), leftover-map
graphic display on the grouping comparison strip
([ADR 0304](0304-leftover-map-compare-graphic.md)), leftover-map
coordinates ([ADR 0267](0267-leftover-map-coordinates.md)), leftover-map
graphic display ([ADR 0268](0268-leftover-map-graphic-display.md)), and
leftover-map axis share on the graphic display
([ADR 0269](0269-leftover-map-axis-share-plot.md)).

## Context

ADR 0148 already persists leftover-map singular values `σ_k` and leftover-map
axis share `σ_k² / Σ_j σ_j²` and captions leftover-axis report badges with
share only. ADR 0321 already captions the grouping comparison leftover-map
graphic with persisted `σ_k`. Those leftover-axis badges still hide `σ_k`, so
Gabriel (1971) singular values appear on the comparison graphic and never on
the report-level leftover-axis badges that name the same axes. Hiding `σ_k` on
the badges lets leftover-map axis share be read as leftover-map structure even
when the buyer cannot tell whether axis 1 is large because `σ_1` is large or
because axis 2 collapsed. A missing, non-finite, or negative singular value is
not a leftover score and must omit independently of leftover-map axis share.
Rank-0 unused axes still persist `σ_k = 0`. A finite negative leftover is
shown, never clamped. Do not invent `σ_k` from leftover-map axis share.

This increment captions leftover-axis report badges with already persisted
leftover-map singular values. Pair-list leftover-axis badges stay
`leftover axis {k} σ {value} {share}%` so they stay distinct from hyphen
`leftover-map axis {k} σ {value} ({share}%)` and from comparison copy
`leftover map comparison graphic leftover-map axis {k} σ {value} ({share}%)`.
It does not add columns. Do not invent a leftover score. Do not invent a
theta.

This protected increment uses **0322** so it does not collide with leftover-map
singular values on the grouping comparison leftover-map graphic (0321),
leftover-map coordinate ticks on that graphic (0320), leftover-map axis share
on that graphic (0305), leftover-map graphic display on the grouping
comparison strip (0304), leftover-map axis share persistence (0148), or the
dashboard stacks.

## Decision

On leftover-axis report badges, caption leftover-map axis `k` with persisted
leftover-map singular value `σ_k` when that singular value is finite and
non-negative, including rank-0 zero singular values. Pair-list labels stay
distinct from graphic labels: leftover-axis badges stay
`leftover axis {k} σ {value} {share}%`; leftover-map graphic axes stay
`leftover-map axis {k} ({share}%)` until a later increment captions `σ_k`
there; grouping comparison leftover-map graphic axes stay
`leftover map comparison graphic leftover-map axis {k} σ {value} ({share}%)`.
A missing, non-finite, or negative singular value omits that `σ` badge and
keeps the existing `leftover axis {k} {share}%` text. Do not invent `σ_k`
from leftover-map axis share. Axis 1 and axis 2 stay independently named.
Click a leftover pair to open that post. The grouping comparison strip
(ADR 0149) stays on its reduced leftover payload and does not gain leftover-axis
report badges with a distinct comparison-strip name.

Do not add SQL. Do not edit shipped migrations. Do not persist inner
product, cosine, or length as separate columns. Do not invent a leftover
score. Do not invent a theta.

## Consequences

After `make seed`, leftover-axis report badges name persisted leftover-map
singular values when finite together with persisted leftover-map axis share;
click a leftover pair opens that post. Hidden posts stay hidden. Rank-0 unused
axes still name `σ 0.00`. Grouping comparison leftover-map graphic leftover-map
singular values (ADR 0321) remain.

## Related

Independent of leftover-map singular values on the grouping comparison
leftover-map graphic. This increment does not caption leftover-map singular
values on leftover-axis badges on the grouping comparison strip with a
distinct name.

## 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.)
19 changes: 19 additions & 0 deletions docs/product-technical-gap-baseline.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,24 @@
# Product & Technical Gap Baseline

> Exact-head loop overlay: 2026-08-31 10:35 KST. Protected `main` is
> `cb187cadee5fb6c46d8a944815ccc154a1e028d1`. Writes work. Do not
> self-approve. #861 leftover-map singular values on the grouping comparison leftover-map
> graphic (v2.78.0 / ADR 0321) is `3aac452`, stacked on #860 @ `40fa5bd`. Independent
> APPROVE is missing. Next buyer increment on this
> cycle: leftover-map singular values on leftover-axis report badges
> (ADR 0322 / v2.79.0) delivered locally on
> `feat/leftover-map-axis-singular-v2790`. Caption persisted leftover-map
> singular values `σ_k` on leftover-axis report badges from already-named leftover-map
> axes. Distinct accessible name `leftover axis {axis} σ {value} {share}%`.
> Rank-0 unused axes still name `σ 0.00`. A missing, non-finite, or negative
> singular value omits that `σ` badge and keeps `leftover axis {k} {share}%`.
> Do not invent `σ_k` from leftover-map axis share. Do not caption leftover-map
> singular values on leftover-axis badges on the grouping comparison strip with
> a distinct name this increment. Stack onto #861.
> 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.
> Never self-approve.

> Exact-head loop overlay: 2026-08-31 10:20 KST. Protected `main` is
> `cb187cadee5fb6c46d8a944815ccc154a1e028d1`. Writes work. Do not
> self-approve. #860 leftover-map coordinate ticks on the grouping comparison 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.78.0",
"version": "2.79.0",
"type": "module",
"scripts": {
"dev": "vite",
Expand Down
10 changes: 8 additions & 2 deletions frontend/src/App.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4177,8 +4177,8 @@ describe("App, authenticated", () => {
expect(screen.getByText(/TEST-PU-REPORT/)).toBeInTheDocument();
expect(screen.getAllByText("shared metric").length).toBeGreaterThan(0);
expect(screen.getAllByText(/CAT: sales-lead I=0\.70/).length).toBeGreaterThan(0);
expect(screen.getAllByText(/leftover axis 1 82%/).length).toBeGreaterThan(0);
expect(screen.getAllByText(/leftover axis 2 18%/).length).toBeGreaterThan(0);
expect(screen.getAllByText(/leftover axis 1 σ 1\.84 82%/).length).toBeGreaterThan(0);
expect(screen.getAllByText(/leftover axis 2 σ 0\.86 18%/).length).toBeGreaterThan(0);
expect(screen.getByLabelText("Leftover-map axis share")).toHaveTextContent(
"Open a leftover pair to read the post–criterion cell",
);
Expand Down Expand Up @@ -4336,6 +4336,12 @@ describe("App, authenticated", () => {
expect(
within(screen.getByLabelText("Grouping comparison")).queryByText("leftover-map axis 2 (18%)"),
).not.toBeInTheDocument();
expect(
within(screen.getByLabelText("Grouping comparison")).queryByText("leftover axis 1 σ 1.84 82%"),
).not.toBeInTheDocument();
expect(
within(screen.getByLabelText("Grouping comparison")).queryByText("leftover axis 2 σ 0.86 18%"),
).not.toBeInTheDocument();
expect(
within(screen.getByLabelText("Grouping comparison")).getByRole("button", {
name: "Open leftover-map post Public post at ξ (+0.50, +0.10)",
Expand Down
Loading
Loading