-
Notifications
You must be signed in to change notification settings - Fork 1
feat: persist leftover interaction-map coordinates (v2.12.19) #579
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Closed
Closed
Changes from all commits
Commits
Show all changes
43 commits
Select commit
Hold shift + click to select a range
8640199
feat: persist leftover interaction-map coordinates (v2.12.19)
seonghobae 23ae402
Merge remote-tracking branch 'origin/main' into feat/persist-leftover…
seonghobae 5b4f80d
Merge origin/main into feat/persist-leftover-interaction-map-v21219 (…
seonghobae 57b6ae8
Merge remote-tracking branch 'origin/main' into HEAD
seonghobae 150e22e
Merge remote-tracking branch 'origin/main' into codex/pr579-repair
seonghobae 769095b
fix(adr): allocate coverage decision 0202
seonghobae 17cd3a1
Merge remote-tracking branch 'origin/main' into HEAD
seonghobae 1aa69d2
docs: remove leaked merge-conflict tail
seonghobae 380944d
test: count interaction-map SQL review site
seonghobae 1b02600
Merge remote-tracking branch 'origin/main' into HEAD
seonghobae 69c0507
docs(adr): fix stale leftover-map coverage citation and dedupe list
seonghobae 0855495
docs: align leftover coverage ADR references
seonghobae bfefe98
Merge remote-tracking branch 'origin/main' into HEAD
seonghobae dac509f
Merge remote-tracking branch 'origin/main' into HEAD
seonghobae 96b8896
fix: hide incomplete leftover maps
seonghobae e510b1a
Merge remote-tracking branch 'origin/main' into HEAD
seonghobae acd44df
fix: preserve validated OIDC return location
seonghobae a8e9ef9
test: align leftover_map_cross_share fixtures with 2 R̂ U / R²
seonghobae 9de161e
Merge remote-tracking branch 'origin/main' into HEAD
seonghobae dadf2cc
fix(ui): stop WorkspaceCalendar's fail-closed placeholder announcing …
seonghobae cc29572
fix(reports): filter leftover map by post scope
seonghobae c87a484
Merge remote-tracking branch 'origin/fix/calendar-placeholder-status-…
seonghobae f7dbe6f
fix(ui): preserve report metadata and Gabriel scale
seonghobae 75a8744
fix: preserve leftover map evidence and geometry
seonghobae 09d6fe9
Merge commit 'c87a4846a48eea8dd92df00133962ef69814370f' into HEAD
seonghobae b782e5f
Merge commit 'f7dbe6f7a93eedf6d13fa9ceb2c72a85f44ff4e8' into HEAD
seonghobae 090d2ae
refactor: delegate interaction-map arithmetic upstream
seonghobae d6e9929
Merge remote-tracking branch 'origin/feat/persist-leftover-interactio…
seonghobae a801134
build: pin protected fast-mlsirm interaction contract
seonghobae 7c395a0
Merge remote-tracking branch 'origin/main' into HEAD
seonghobae 39dc107
Merge origin/main and harden interaction-map evidence
seonghobae 14d7997
Merge latest origin/main into interaction-map branch
seonghobae 4352a7c
Merge remote-tracking branch 'origin/feat/persist-leftover-interactio…
seonghobae d8bba8f
Merge latest origin/main into feat/persist-leftover-interaction-map-v…
seonghobae 5a9f85c
Merge remote-tracking branch 'origin/main' into HEAD
seonghobae 1c209c8
Merge remote-tracking branch 'origin/feat/persist-leftover-interactio…
seonghobae 824f0db
fix: validate residual interaction envelopes
seonghobae f079ff1
Merge latest origin/main into feat/persist-leftover-interaction-map-v…
seonghobae eaf79e5
fix: keep SQL review reason adjacent
seonghobae c97838d
Merge latest origin/main into feat/persist-leftover-interaction-map-v…
seonghobae 762ad6d
fix: validate interaction-map owner indices
seonghobae 45769b0
fix(report): fail closed on rejected map coverage
seonghobae 689a21b
docs(math): align owner boundary with current PRD
seonghobae File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Some comments aren't visible on the classic Files Changed page.
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,11 @@ | ||
| ## 2.12.19 — Persist leftover interaction-map coordinates | ||
|
|
||
| - After IRT main effects, persist complete-case leftover-map person ξ | ||
| and item ζ coordinates (`report_leftover_map_person` / | ||
| `report_leftover_map_item`) and render the 2D Jeon / Gabriel map | ||
| above leftover pairs (ADR 0121 / 0126). Click a post node or a | ||
| leftover-pair criterion to open that post. Rank-0 and rank-1 maps | ||
| pad unused axes with zero. The Rust-backed `fast-mlsirm` contract owns | ||
| every numerical result; LineageWeave only maps identifiers, persists, | ||
| and presents it. Hidden posts stay hidden. Never invent a leftover score | ||
| or a theta. | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,78 @@ | ||
| # ADR 0121 — Persist leftover interaction-map coordinates | ||
|
|
||
| **Decision status:** Accepted | ||
| **Date:** 2026-08-24 | ||
|
|
||
| ## Context | ||
|
|
||
| ADR 0048 persists the closest and farthest leftover post–criterion | ||
| pairs after IRT main effects. Those pairs are two cells on the Jeon | ||
| et al. (2021, eq. 3) leftover interaction map `−γ‖ξ_p − ζ_i‖`. The | ||
| Gabriel (1971) biplot that produces the pairs already computes person | ||
| positions `ξ` and item positions `ζ`, then discards them. A reader | ||
| who sees only two named pairs cannot see *why* those cells sat | ||
| closest or farthest, or where the other complete-case posts and | ||
| criteria sit on the same leftover map. | ||
|
|
||
| fast-mlsirm now exposes the Rust-backed residual interaction-map contract | ||
| adopted by ADR 0211. LineageWeave must not fork that calculation, invent a | ||
| second IRT fit, or treat a missing residual cell as a zero residual. | ||
|
|
||
| ## Decision | ||
|
|
||
| After a real GRM/GPCM score, keep the complete-case Gabriel | ||
| coordinates that leftover pairs already use. Persist every complete- | ||
| case post as `report_leftover_map_person` (`axis_one`, `axis_two`) | ||
| and every complete-case criterion as `report_leftover_map_item`. | ||
| Pad unused axes with zero when residual rank is below two. Do not | ||
| invent a second component. Closest/farthest selection and persisted | ||
| distance use those same two reader-visible axes; unpersisted higher | ||
| components never silently change a highlighted map pair. Incomplete | ||
| rows and columns stay out of the factorization. | ||
|
|
||
| Cascade the rows with `report_period_score`. A leftover-map post | ||
| must also be a `report_member_score` row. A leftover-map criterion | ||
| must be a `report_item_information` item on that same report. Do not | ||
| store a second theta. A rank-0 residual still emits origin | ||
| coordinates so `make seed` is not empty; those zeros are not a | ||
| fabricated interaction. | ||
|
|
||
| Closest and farthest pairs remain ADR 0048 / ADR 0049. The map sits | ||
| **above** that pair list on the period-report group. Clicking a | ||
| person node opens that post with the same handler as a leftover | ||
| pair. Pair-member criterion nodes open that leftover-pair post | ||
| ([ADR 0126](0126-leftover-map-criterion-node.md)). Hidden posts stay hidden: leftover-map persons join | ||
| `source_post` and use the same ABAC gate as members and leftover | ||
| pairs. Missing map rows render nothing. | ||
|
|
||
| The biplot calculation lives in fast-mlsirm. `lineageweave/leftover_pairs.py` | ||
| maps returned indices and values to authorized product identifiers and selects | ||
| the closest/farthest cells; it contains no factorization or cross-term formula. | ||
|
|
||
| ## Consequences | ||
|
|
||
| Rebuild and seed write leftover-map coordinates in the same | ||
| transaction as leftover pairs. `GET /api/reports/{grouping}/{period}` | ||
| returns `leftover_map_persons` (with post title) and | ||
| `leftover_map_items`. Migration | ||
| `0172_report_leftover_interaction_map.sql` upgrades volumes that | ||
| already applied `0001` / `0012`. `migrate.sh` already replays every | ||
| four-digit `NNNN_*.sql` file (ADR 0166), so 0172 lands on existing | ||
| volumes without a new allowlist entry. | ||
|
|
||
| ## Related | ||
|
|
||
| Depends on [ADR 0048](0048-persist-lsirm-leftover-pairs.md), | ||
| [ADR 0049](0049-leftover-pair-report-ui.md), and | ||
| [ADR 0003](0003-fast-mlsirm-report-integration.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 |
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.