Spaces:
Sleeping
fix(constructs): resolve the review's open questions from Noor's answers
Browse filesShe replied with the source she used for each disputed item, and every
one checks out. Three of the four disagreements were about which
PRINTING of a scale is authoritative, not about who read it correctly.
MFQ Fairness: I was wrong to revert her. She read the questionnaire
printed at the end of Graham et al. (2011), which is the paper this
construct cites, and it does say "treated differently from others"
(twice). The moralfoundations.org MFQ30 handout says "than others". Her
correction is applied and source_url now points at the paper, so items,
citation, and source finally agree.
RSES and CBI work-related burnout: she used the source_url recorded on
each construct, and both mappings are exactly right against it. The
Rosenberg questionnaire at socy.umd.edu starts with "I feel that I'm a
person of worth" and its wording and reverse keys match ours item for
item, so only our ORDER was wrong. Both are reordered to the printed
order with item ids renumbered, so item_id means "source item number"
again and the sim_item_N export columns line up with the published
questionnaire. Scores are unchanged: the CCR score is the mean across
items, which is order-independent.
Team Psychological Safety: she could not reach Edmondson (1999) through
her library and said to keep the original if the paper disagreed. It
does ("risk on this team"), so the stored wording stands.
BAS-2 and CAGE had genuinely dead links (404, and 403 even from a
browser user agent). Her replacements resolve and contain the items, and
both wording corrections check out, so both are verified.
MSPSS and SHS are confirmed from the sources we had given her all along.
The append-only test now baselines on the merge-base with main rather
than HEAD. Its contract is that a PUBLISHED version is immutable; a
version still being revised on an unmerged branch is not published, and
comparing against HEAD conflated the two. It still fails on any edit to
a version that has landed on main.
88 verified (was 83), 6 unverified (was 11), and the 6 are only the two
PI wording decisions.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
- CHANGELOG.md +8 -8
- README.md +3 -4
- ROADMAP.md +12 -19
- backend/tests/test_construct_library_versions.py +18 -20
- docs/specs/0007-construct-library-verification-pass.md +42 -40
- packages/construct_library/apply_review.py +101 -58
- packages/construct_library/constructs/bas_2_v2.yaml +6 -6
- packages/construct_library/constructs/cage_questionnaire_v2.yaml +6 -6
- packages/construct_library/constructs/cbi_work_related_burnout.yaml +4 -6
- packages/construct_library/constructs/cbi_work_related_burnout_v2.yaml +43 -0
- packages/construct_library/constructs/mfq_care.yaml +5 -5
- packages/construct_library/constructs/mfq_fairness.yaml +4 -6
- packages/construct_library/constructs/mfq_fairness_v2.yaml +34 -0
- packages/construct_library/constructs/rses_v2.yaml +15 -15
- packages/construct_library/constructs/team_psychological_safety_scale.yaml +5 -5
|
@@ -7,17 +7,17 @@ Format: [Keep a Changelog](https://keepachangelog.com/). User-visible changes on
|
|
| 7 |
### Changed
|
| 8 |
- Construct library verified against the source publications. All 525 items across the
|
| 9 |
94 constructs were reviewed (wording, reverse-scoring keys, subscale grouping,
|
| 10 |
-
citations);
|
| 11 |
when, instead of the blanket "needs verification" flag every construct carried. The
|
| 12 |
review corrected 61 reverse-scoring flags across 14 constructs (the library had 35
|
| 13 |
-
flagged items, it now has 96),
|
| 14 |
-
|
|
|
|
|
|
|
| 15 |
version: the picker offers the corrected one, and runs that used the earlier version
|
| 16 |
-
still open, export, and reproduce exactly as before.
|
| 17 |
-
|
| 18 |
-
|
| 19 |
-
was kept, two with unresolved item-ordering questions, and two whose recorded source
|
| 20 |
-
document no longer resolves. (spec 0007)
|
| 21 |
|
| 22 |
### Added
|
| 23 |
- Runs now warn when every item in a construct is reverse-scored. Scores are raw
|
|
|
|
| 7 |
### Changed
|
| 8 |
- Construct library verified against the source publications. All 525 items across the
|
| 9 |
94 constructs were reviewed (wording, reverse-scoring keys, subscale grouping,
|
| 10 |
+
citations); 88 constructs are now marked verified and show who reviewed them and
|
| 11 |
when, instead of the blanket "needs verification" flag every construct carried. The
|
| 12 |
review corrected 61 reverse-scoring flags across 14 constructs (the library had 35
|
| 13 |
+
flagged items, it now has 96), 8 item wordings, the item order of two scales that did
|
| 14 |
+
not match their own source (which decides what the per-item export columns line up
|
| 15 |
+
with, though not the scores), one subscale grouping in the SCS-SF, and a batch of dead
|
| 16 |
+
or incomplete citation links. Corrected constructs ship as a new
|
| 17 |
version: the picker offers the corrected one, and runs that used the earlier version
|
| 18 |
+
still open, export, and reproduce exactly as before. Six constructs stay flagged, all
|
| 19 |
+
for the same two open wording questions: the five IPIP Big Five scales and the K10.
|
| 20 |
+
(spec 0007)
|
|
|
|
|
|
|
| 21 |
|
| 22 |
### Added
|
| 23 |
- Runs now warn when every item in a construct is reverse-scored. Scores are raw
|
|
@@ -54,10 +54,9 @@ Configuration: copy `.env.example` to `.env` and fill what you need.
|
|
| 54 |
storage is ephemeral and the instance may reset.
|
| 55 |
- The construct library ships the lab's full collection of 94 constructs. Item wording,
|
| 56 |
reverse-scoring keys, subscale grouping, and citations were reviewed against the source
|
| 57 |
-
publications in August 2026:
|
| 58 |
-
and review date. The other
|
| 59 |
-
|
| 60 |
-
unresolved item-ordering question, or no reachable source document. See
|
| 61 |
`docs/specs/0007-construct-library-verification-pass.md`.
|
| 62 |
- Tests: `cd backend && CCR_FAKE_EMBEDDINGS=1 python -m pytest -q` (137 tests, no ML
|
| 63 |
downloads needed).
|
|
|
|
| 54 |
storage is ephemeral and the instance may reset.
|
| 55 |
- The construct library ships the lab's full collection of 94 constructs. Item wording,
|
| 56 |
reverse-scoring keys, subscale grouping, and citations were reviewed against the source
|
| 57 |
+
publications in August 2026: 88 constructs are marked verified and carry the reviewer
|
| 58 |
+
and review date. The other 6 stay flagged in the interface pending two wording
|
| 59 |
+
decisions (the IPIP scales and the K10). See
|
|
|
|
| 60 |
`docs/specs/0007-construct-library-verification-pass.md`.
|
| 61 |
- Tests: `cd backend && CCR_FAKE_EMBEDDINGS=1 python -m pytest -q` (137 tests, no ML
|
| 62 |
downloads needed).
|
|
@@ -51,25 +51,18 @@ order. Detailed specs for the numbered features live in the sections below.
|
|
| 51 |
untracked drafts (a duplicate MIT and an Apache-2.0 alternative) are
|
| 52 |
removed and README now states the license and separates it from the
|
| 53 |
questionnaire items, which belong to their original authors.
|
| 54 |
-
- [x] Construct library verification pass: DONE 2026-08-
|
| 55 |
-
review of all 525 items applied
|
| 56 |
-
|
| 57 |
-
|
| 58 |
-
|
| 59 |
-
|
| 60 |
-
|
| 61 |
-
|
| 62 |
-
|
| 63 |
-
|
| 64 |
-
|
| 65 |
-
|
| 66 |
-
the sim_item_N export columns, so this is a scoring-visible change.
|
| 67 |
-
* Find a reachable source document for bas_2, cage_questionnaire,
|
| 68 |
-
mfq_care and mfq_fairness.
|
| 69 |
-
- [ ] Durable source links: the Grit-S entries now point at personal Dropbox
|
| 70 |
-
URLs, and dirty_dozen_* traded a working ResearchGate link for a
|
| 71 |
-
paywalled PsycNET one (the reviewer's link carried a session token that
|
| 72 |
-
could not be committed). Both want a stable replacement.
|
| 73 |
- [ ] Verify Dr. Chen's maintainer pre-assignment exists on /admin and that
|
| 74 |
she can sign in.
|
| 75 |
- [ ] Self-service password reset (currently admin-only; tied to the planned
|
|
|
|
| 51 |
untracked drafts (a duplicate MIT and an Apache-2.0 alternative) are
|
| 52 |
removed and README now states the license and separates it from the
|
| 53 |
questionnaire items, which belong to their original authors.
|
| 54 |
+
- [x] Construct library verification pass: DONE 2026-08-27 (spec 0007). Noor's
|
| 55 |
+
review of all 525 items applied, and her follow-up answers resolved every
|
| 56 |
+
open question except the two PI decisions; 88 of 94 constructs verified.
|
| 57 |
+
- [ ] Construct library: 6 constructs still unverified, all waiting on the PI:
|
| 58 |
+
the IPIP "I" prefix (50 items, 5 constructs) and restoring the K10 stem
|
| 59 |
+
(10 items). Everything else from the review is resolved.
|
| 60 |
+
- [ ] Durable source links: the Grit-S entries point at personal Dropbox URLs,
|
| 61 |
+
dirty_dozen_* traded a working ResearchGate link for a paywalled PsycNET
|
| 62 |
+
one (the reviewer's link carried a session token that could not be
|
| 63 |
+
committed), cage_questionnaire uses a token-style USPSTF file URL, and
|
| 64 |
+
mfq_care/mfq_fairness point at a third-party mirror of the cited paper.
|
| 65 |
+
All four want a stable replacement.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 66 |
- [ ] Verify Dr. Chen's maintainer pre-assignment exists on /admin and that
|
| 67 |
she can sign in.
|
| 68 |
- [ ] Self-service password reset (currently admin-only; tied to the planned
|
|
@@ -174,9 +174,9 @@ def test_review_applied_expected_shape():
|
|
| 174 |
for c in constructs:
|
| 175 |
by_status.setdefault(c["verification_status"], []).append(c)
|
| 176 |
|
| 177 |
-
assert len(by_status["archived"]) ==
|
| 178 |
-
assert len(by_status["verified"]) ==
|
| 179 |
-
assert len(by_status["needs_verification"]) ==
|
| 180 |
|
| 181 |
live = [c for c in constructs if c["verification_status"] != "archived"]
|
| 182 |
assert len({c["construct_id"] for c in live}) == 94, "one live version per construct"
|
|
@@ -198,14 +198,6 @@ def test_review_applied_expected_shape():
|
|
| 198 |
"ipip_50_item_big_five_factor_markers_intellect_imagination",
|
| 199 |
# PI decision: restoring the shared K10 stem onto each item
|
| 200 |
"k10",
|
| 201 |
-
# reviewer's correction contradicts the cited publication
|
| 202 |
-
"team_psychological_safety_scale",
|
| 203 |
-
# reviewer reported an item-ORDER problem that is not applied
|
| 204 |
-
"cbi_work_related_burnout",
|
| 205 |
-
"rses",
|
| 206 |
-
# no reachable source on record, so "verified" cannot be claimed
|
| 207 |
-
"bas_2",
|
| 208 |
-
"cage_questionnaire",
|
| 209 |
]
|
| 210 |
)
|
| 211 |
for c in by_status["needs_verification"]:
|
|
@@ -224,27 +216,33 @@ def test_every_live_construct_records_who_verified_it():
|
|
| 224 |
|
| 225 |
|
| 226 |
def test_superseded_files_keep_their_original_items():
|
| 227 |
-
"""Append-only means a
|
| 228 |
|
| 229 |
-
Compares each tracked construct against
|
| 230 |
-
|
| 231 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 232 |
"""
|
| 233 |
repo = CONSTRUCTS_DIR.parents[2]
|
| 234 |
base = subprocess.run(
|
| 235 |
-
["git", "
|
| 236 |
)
|
| 237 |
-
if base.returncode != 0: # not a git checkout
|
| 238 |
-
pytest.skip("not a git checkout")
|
|
|
|
| 239 |
|
| 240 |
checked = 0
|
| 241 |
for path in sorted(CONSTRUCTS_DIR.glob("*.yaml")):
|
| 242 |
rel = path.relative_to(repo)
|
| 243 |
show = subprocess.run(
|
| 244 |
-
["git", "show", f"
|
| 245 |
)
|
| 246 |
if show.returncode != 0:
|
| 247 |
-
continue # new
|
| 248 |
committed = yaml.safe_load(show.stdout)
|
| 249 |
current = yaml.safe_load(path.read_text())
|
| 250 |
if committed["version"] != current["version"]:
|
|
|
|
| 174 |
for c in constructs:
|
| 175 |
by_status.setdefault(c["verification_status"], []).append(c)
|
| 176 |
|
| 177 |
+
assert len(by_status["archived"]) == 23, "superseded v1 files"
|
| 178 |
+
assert len(by_status["verified"]) == 88
|
| 179 |
+
assert len(by_status["needs_verification"]) == 6
|
| 180 |
|
| 181 |
live = [c for c in constructs if c["verification_status"] != "archived"]
|
| 182 |
assert len({c["construct_id"] for c in live}) == 94, "one live version per construct"
|
|
|
|
| 198 |
"ipip_50_item_big_five_factor_markers_intellect_imagination",
|
| 199 |
# PI decision: restoring the shared K10 stem onto each item
|
| 200 |
"k10",
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 201 |
]
|
| 202 |
)
|
| 203 |
for c in by_status["needs_verification"]:
|
|
|
|
| 216 |
|
| 217 |
|
| 218 |
def test_superseded_files_keep_their_original_items():
|
| 219 |
+
"""Append-only means a PUBLISHED version's ITEMS are never rewritten.
|
| 220 |
|
| 221 |
+
Compares each tracked construct against git rather than against its own v2 -
|
| 222 |
+
comparing v1 to v2 would pass even if v1's items had been quietly edited,
|
| 223 |
+
which is the exact failure this guards.
|
| 224 |
+
|
| 225 |
+
"Published" means merged to the default branch, so the baseline is the
|
| 226 |
+
merge-base with main, not HEAD. A version being drafted on a feature branch
|
| 227 |
+
can still be revised (that is what review is for); once it lands on main a
|
| 228 |
+
run can have used it, and from then on this test freezes it.
|
| 229 |
"""
|
| 230 |
repo = CONSTRUCTS_DIR.parents[2]
|
| 231 |
base = subprocess.run(
|
| 232 |
+
["git", "merge-base", "HEAD", "main"], cwd=repo, capture_output=True, text=True
|
| 233 |
)
|
| 234 |
+
if base.returncode != 0: # not a git checkout, or no main (packaged install)
|
| 235 |
+
pytest.skip("not a git checkout with a main branch")
|
| 236 |
+
baseline = base.stdout.strip()
|
| 237 |
|
| 238 |
checked = 0
|
| 239 |
for path in sorted(CONSTRUCTS_DIR.glob("*.yaml")):
|
| 240 |
rel = path.relative_to(repo)
|
| 241 |
show = subprocess.run(
|
| 242 |
+
["git", "show", f"{baseline}:{rel.as_posix()}"], cwd=repo, capture_output=True, text=True
|
| 243 |
)
|
| 244 |
if show.returncode != 0:
|
| 245 |
+
continue # new since main, nothing published to compare against
|
| 246 |
committed = yaml.safe_load(show.stdout)
|
| 247 |
current = yaml.safe_load(path.read_text())
|
| 248 |
if committed["version"] != current["version"]:
|
|
@@ -34,17 +34,22 @@ because item text, item order, and reverse flags all feed `item_hash`:
|
|
| 34 |
|
| 35 |
- 61 reverse-scoring flags flipped `false -> true` across 14 constructs. No flag went
|
| 36 |
the other way; the library goes from 35 to 96 reverse-flagged items.
|
| 37 |
-
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 38 |
- 1 subscale regrouping: `scs_sf_self_judgment_1` moves to `scs_sf_over_identification`
|
| 39 |
per the SCS-SF coding key, changing the item list of both constructs.
|
| 40 |
|
| 41 |
-
|
| 42 |
append-only means old versions remain resolvable for runs that already used them.
|
| 43 |
|
| 44 |
Metadata-level changes do NOT feed `item_hash` and are therefore applied in place on
|
| 45 |
the existing version:
|
| 46 |
|
| 47 |
-
- `verification_status` promoted `needs_verification -> verified` for
|
| 48 |
- Citation and `source_url` repairs (dead links replaced with the URLs the reviewer
|
| 49 |
supplied, DOIs she supplied added).
|
| 50 |
- A `review:` provenance block on every construct recording reviewer, review date, and
|
|
@@ -91,40 +96,37 @@ construct reproduce exactly as before, because v1 rows are never mutated.
|
|
| 91 |
|
| 92 |
## Non-goals
|
| 93 |
|
| 94 |
-
|
| 95 |
-
|
| 96 |
-
|
| 97 |
-
|
| 98 |
-
|
| 99 |
-
|
| 100 |
-
|
| 101 |
-
|
| 102 |
-
|
| 103 |
-
(the
|
| 104 |
-
|
| 105 |
-
|
| 106 |
-
|
| 107 |
-
|
| 108 |
-
|
| 109 |
-
|
| 110 |
-
|
| 111 |
-
|
| 112 |
-
|
| 113 |
-
|
| 114 |
-
|
| 115 |
-
**
|
| 116 |
-
|
| 117 |
-
|
| 118 |
-
|
| 119 |
-
|
| 120 |
-
|
| 121 |
-
|
| 122 |
-
|
| 123 |
-
|
| 124 |
-
|
| 125 |
-
working source is on file. `mfq_care` and `mfq_fairness` were in this group because the
|
| 126 |
-
review sheet shipped with an EMPTY `source_url` for both - our omission, not a missing
|
| 127 |
-
document. The MFQ30 is now recorded for each and their items confirmed verbatim.
|
| 128 |
|
| 129 |
**Two findings are left pending an explicit PI decision:**
|
| 130 |
|
|
@@ -155,7 +157,7 @@ similarities plus flags; `adjustment_strategy` remains a recorded parameter).
|
|
| 155 |
updates the existing row.
|
| 156 |
- `test_sync_still_refuses_item_change_under_same_version` - the append-only guard is
|
| 157 |
intact.
|
| 158 |
-
- `test_review_applied_expected_shape` -
|
| 159 |
needs_verification, 96 reverse flags, and every unverified construct carries a recorded
|
| 160 |
reason.
|
| 161 |
- `test_superseded_files_keep_their_original_items` - compares every tracked construct
|
|
@@ -164,12 +166,12 @@ similarities plus flags; `adjustment_strategy` remains a recorded parameter).
|
|
| 164 |
- `test_all_reversed_construct_warns_about_score_direction` /
|
| 165 |
`test_normal_construct_does_not_warn_about_direction` - the direction warning fires for
|
| 166 |
an all-reversed construct and stays silent otherwise.
|
| 167 |
-
- `validate_constructs.py` passes with
|
| 168 |
warnings alongside the pre-existing `grit_s_consistency_of_interests`.
|
| 169 |
|
| 170 |
## Implementation notes
|
| 171 |
|
| 172 |
-
Files changed: `packages/construct_library/constructs/*.yaml` (
|
| 173 |
in-place metadata updates), `packages/construct_library/apply_review.py` (new),
|
| 174 |
`packages/construct_library/reviews/` (new, the returned review file),
|
| 175 |
`backend/app/construct_lib.py` (metadata sync), `backend/app/main.py` (collapse to
|
|
|
|
| 34 |
|
| 35 |
- 61 reverse-scoring flags flipped `false -> true` across 14 constructs. No flag went
|
| 36 |
the other way; the library goes from 35 to 96 reverse-flagged items.
|
| 37 |
+
- 8 verbatim wording corrections, one item each, in 8 constructs.
|
| 38 |
+
- 2 item-ORDER corrections (`rses`, `cbi_work_related_burnout`): the stored order did
|
| 39 |
+
not match the printed order of each construct's own recorded source, which mislabels
|
| 40 |
+
every `sim_item_N` export column. Item ids are renumbered by position so `item_id`
|
| 41 |
+
again means "source item number". Scores are unaffected: the CCR score is the mean
|
| 42 |
+
across items, which is order-independent.
|
| 43 |
- 1 subscale regrouping: `scs_sf_self_judgment_1` moves to `scs_sf_over_identification`
|
| 44 |
per the SCS-SF coding key, changing the item list of both constructs.
|
| 45 |
|
| 46 |
+
23 constructs get a `version: 2` file. The `version: 1` files stay exactly as they are:
|
| 47 |
append-only means old versions remain resolvable for runs that already used them.
|
| 48 |
|
| 49 |
Metadata-level changes do NOT feed `item_hash` and are therefore applied in place on
|
| 50 |
the existing version:
|
| 51 |
|
| 52 |
+
- `verification_status` promoted `needs_verification -> verified` for 88 constructs.
|
| 53 |
- Citation and `source_url` repairs (dead links replaced with the URLs the reviewer
|
| 54 |
supplied, DOIs she supplied added).
|
| 55 |
- A `review:` provenance block on every construct recording reviewer, review date, and
|
|
|
|
| 96 |
|
| 97 |
## Non-goals
|
| 98 |
|
| 99 |
+
Only 6 constructs keep `verification_status: needs_verification`, and both reasons are
|
| 100 |
+
PI decisions rather than open verification questions.
|
| 101 |
+
|
| 102 |
+
Four findings that this spec originally held back were resolved by going back to the
|
| 103 |
+
reviewer (2026-08-27). Her answers are worth recording, because in three of the four the
|
| 104 |
+
disagreement was about WHICH PRINTING of a scale is authoritative, not about who read it
|
| 105 |
+
correctly:
|
| 106 |
+
|
| 107 |
+
- **MFQ Fairness.** She read the questionnaire printed at the end of Graham et al.
|
| 108 |
+
(2011), the paper this construct cites, which reads "treated differently **from**
|
| 109 |
+
others" (twice). The moralfoundations.org MFQ30 handout reads "than others". The cited
|
| 110 |
+
paper wins, so her correction IS applied, and `source_url` now points at the paper so
|
| 111 |
+
items, citation, and source agree. An earlier draft of this spec reverted her here on
|
| 112 |
+
the strength of the handout; that was wrong.
|
| 113 |
+
- **RSES item order.** She used the `source_url` recorded on the construct
|
| 114 |
+
(socy.umd.edu, the Morris Rosenberg Foundation), whose questionnaire starts with "I
|
| 115 |
+
feel that I'm a person of worth" and whose wording and reverse keys match this
|
| 116 |
+
construct exactly. Her mapping is correct against our own recorded source, so the
|
| 117 |
+
reorder is applied.
|
| 118 |
+
- **CBI work-related burnout item order.** Same: confirmed against the recorded
|
| 119 |
+
`source_url`, mapping applied.
|
| 120 |
+
- **Team Psychological Safety.** She could not reach Edmondson (1999) through her
|
| 121 |
+
library, used a third-party questionnaire, and said to keep the original if the paper
|
| 122 |
+
disagreed. It does ("risk **on** this team"), so the stored wording stands and the
|
| 123 |
+
construct is verified.
|
| 124 |
+
|
| 125 |
+
Two constructs (`bas_2`, `cage_questionnaire`) had genuinely dead source links (404 and
|
| 126 |
+
403 even from a browser user agent). She supplied working replacements, both verified to
|
| 127 |
+
contain the items, so both are verified. `mfq_care` and `mfq_fairness` were unverifiable
|
| 128 |
+
only because the review sheet shipped with an EMPTY `source_url` for them, which was our
|
| 129 |
+
omission.
|
|
|
|
|
|
|
|
|
|
| 130 |
|
| 131 |
**Two findings are left pending an explicit PI decision:**
|
| 132 |
|
|
|
|
| 157 |
updates the existing row.
|
| 158 |
- `test_sync_still_refuses_item_change_under_same_version` - the append-only guard is
|
| 159 |
intact.
|
| 160 |
+
- `test_review_applied_expected_shape` - 23 v2 files, 88 verified, 6
|
| 161 |
needs_verification, 96 reverse flags, and every unverified construct carries a recorded
|
| 162 |
reason.
|
| 163 |
- `test_superseded_files_keep_their_original_items` - compares every tracked construct
|
|
|
|
| 166 |
- `test_all_reversed_construct_warns_about_score_direction` /
|
| 167 |
`test_normal_construct_does_not_warn_about_direction` - the direction warning fires for
|
| 168 |
an all-reversed construct and stays silent otherwise.
|
| 169 |
+
- `validate_constructs.py` passes with 117 files and reports the 4 new all-reversed
|
| 170 |
warnings alongside the pre-existing `grit_s_consistency_of_interests`.
|
| 171 |
|
| 172 |
## Implementation notes
|
| 173 |
|
| 174 |
+
Files changed: `packages/construct_library/constructs/*.yaml` (23 new v2 files, 94
|
| 175 |
in-place metadata updates), `packages/construct_library/apply_review.py` (new),
|
| 176 |
`packages/construct_library/reviews/` (new, the returned review file),
|
| 177 |
`backend/app/construct_lib.py` (metadata sync), `backend/app/main.py` (collapse to
|
|
@@ -50,17 +50,6 @@ PENDING = {
|
|
| 50 |
"ipip_50_item_big_five_factor_markers_extraversion",
|
| 51 |
"ipip_50_item_big_five_factor_markers_intellect_imagination",
|
| 52 |
"k10",
|
| 53 |
-
# Reviewer's correction disagrees with the cited publication (see below).
|
| 54 |
-
"team_psychological_safety_scale",
|
| 55 |
-
# Reviewer reported an item-ORDER problem, which is not applied here. Order
|
| 56 |
-
# feeds item_hash and decides what sim_item_N means in an export, so it is
|
| 57 |
-
# not a cosmetic change to make without a decision.
|
| 58 |
-
"rses",
|
| 59 |
-
"cbi_work_related_burnout",
|
| 60 |
-
# No reachable source on record, so "verified verbatim against the original
|
| 61 |
-
# publication" cannot honestly be claimed.
|
| 62 |
-
"bas_2",
|
| 63 |
-
"cage_questionnaire",
|
| 64 |
}
|
| 65 |
PENDING_NOTE = {
|
| 66 |
"k10": (
|
|
@@ -68,34 +57,6 @@ PENDING_NOTE = {
|
|
| 68 |
"source stem 'During the last 30 days, about how often did you feel'. Pending PI "
|
| 69 |
"decision (spec 0007)."
|
| 70 |
),
|
| 71 |
-
"team_psychological_safety_scale": (
|
| 72 |
-
"Reviewer proposed 'It is safe to take a risk in this team' from a third-party "
|
| 73 |
-
"questionnaire (novopsych TPS-7). The cited source, Edmondson (1999), reads 'It is "
|
| 74 |
-
"safe to take a risk on this team' - the wording already stored here. Kept as "
|
| 75 |
-
"published; the two sources disagree and the citation should decide."
|
| 76 |
-
),
|
| 77 |
-
"rses": (
|
| 78 |
-
"Reviewer maps stored items 1,2,3,6,7,9,10 to source item numbers 7,10,2,9,1,3,6: "
|
| 79 |
-
"the item ORDER does not match the source. Reverse-scoring corrections are applied; "
|
| 80 |
-
"the reordering is not, because order feeds item_hash and the sim_item_N export "
|
| 81 |
-
"columns. Pending a decision."
|
| 82 |
-
),
|
| 83 |
-
"cbi_work_related_burnout": (
|
| 84 |
-
"Reviewer maps stored items 7,8,9,10,11,12,13 to source item numbers "
|
| 85 |
-
"11,13,12,7,8,9,10: the item ORDER does not match the source. Not applied; order "
|
| 86 |
-
"feeds item_hash and the sim_item_N export columns. Pending a decision."
|
| 87 |
-
),
|
| 88 |
-
"bas_2": (
|
| 89 |
-
"Reviewer could not reach the recorded source URL and checked wording against the "
|
| 90 |
-
"publisher PDF; her note adds that BAS-2 has no reverse-scored items and is scored "
|
| 91 |
-
"by averaging all 10. A working source link is still needed before this can be "
|
| 92 |
-
"called verified."
|
| 93 |
-
),
|
| 94 |
-
"cage_questionnaire": (
|
| 95 |
-
"Citation is correct but the recorded source URL is no longer accessible. The "
|
| 96 |
-
"reviewer's wording correction ('ought to' -> 'should') is applied; a working "
|
| 97 |
-
"source link is still needed before this can be called verified."
|
| 98 |
-
),
|
| 99 |
}
|
| 100 |
IPIP_NOTE = (
|
| 101 |
"Reviewer confirms wording matches the source apart from the leading 'I' that CCR "
|
|
@@ -120,17 +81,43 @@ WORDING_FIX = {
|
|
| 120 |
"There is a special person with whom I can share joys and sorrows.",
|
| 121 |
"shs_2":
|
| 122 |
"Compared to most of my peers, I consider myself:",
|
| 123 |
-
#
|
| 124 |
-
#
|
| 125 |
-
#
|
| 126 |
-
#
|
| 127 |
-
|
| 128 |
-
|
| 129 |
-
#
|
| 130 |
-
#
|
| 131 |
-
#
|
|
|
|
|
|
|
| 132 |
}
|
| 133 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 134 |
# One item moves subscale per the SCS-SF coding key. It is renumbered into the
|
| 135 |
# destination construct's own id convention ({construct}_{source item number});
|
| 136 |
# it is still SCS-SF item 1, and the review file records where it came from.
|
|
@@ -170,8 +157,17 @@ SOURCE_URL_FIX = {
|
|
| 170 |
"lot_r": "https://psycnet.apa.org/fulltext/1995-07978-001.pdf",
|
| 171 |
# The sheet went out with no source_url for these two, so the reviewer had
|
| 172 |
# nothing to check against. Added afterwards and confirmed item by item.
|
| 173 |
-
|
| 174 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 175 |
"collectivism_horizontal": "https://psycnet.apa.org/fulltext/1997-38342-009.pdf",
|
| 176 |
"individualism_horizontal": "https://psycnet.apa.org/fulltext/1997-38342-009.pdf",
|
| 177 |
}
|
|
@@ -195,6 +191,16 @@ CITATION_FIX = {
|
|
| 195 |
"Triandis, H. C., & Gelfand, M. J. (1998). Converging measurement of horizontal and "
|
| 196 |
"vertical individualism and collectivism. Journal of Personality and Social "
|
| 197 |
"Psychology, 74(1). https://doi.org/10.1037/0022-3514.74.1.118",
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 198 |
}
|
| 199 |
|
| 200 |
QUESTIONNAIRE_FIX = {
|
|
@@ -207,14 +213,32 @@ QUESTIONNAIRE_FIX = {
|
|
| 207 |
REVIEW_NOTE = {
|
| 208 |
"lot_r": "The scale's 4 filler items are correctly excluded from this construct; they are "
|
| 209 |
"not scored in the source.",
|
| 210 |
-
"mfq_care": "
|
| 211 |
-
"
|
| 212 |
-
"
|
| 213 |
-
"the reviewer confirmed as correctly grouped.",
|
| 214 |
-
"mfq_fairness": "
|
| 215 |
-
"
|
| 216 |
-
"
|
| 217 |
-
"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 218 |
}
|
| 219 |
|
| 220 |
|
|
@@ -284,6 +308,25 @@ def main() -> int:
|
|
| 284 |
it["reverse_scored"] = review_flags[iid]
|
| 285 |
changed_items = True
|
| 286 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 287 |
src, dst = SUBSCALE_MOVE["from"], SUBSCALE_MOVE["to"]
|
| 288 |
move_id, new_id = SUBSCALE_MOVE["item_id"], SUBSCALE_MOVE["new_item_id"]
|
| 289 |
if cid == src and any(i["item_id"] == move_id for i in items):
|
|
|
|
| 50 |
"ipip_50_item_big_five_factor_markers_extraversion",
|
| 51 |
"ipip_50_item_big_five_factor_markers_intellect_imagination",
|
| 52 |
"k10",
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 53 |
}
|
| 54 |
PENDING_NOTE = {
|
| 55 |
"k10": (
|
|
|
|
| 57 |
"source stem 'During the last 30 days, about how often did you feel'. Pending PI "
|
| 58 |
"decision (spec 0007)."
|
| 59 |
),
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 60 |
}
|
| 61 |
IPIP_NOTE = (
|
| 62 |
"Reviewer confirms wording matches the source apart from the leading 'I' that CCR "
|
|
|
|
| 81 |
"There is a special person with whom I can share joys and sorrows.",
|
| 82 |
"shs_2":
|
| 83 |
"Compared to most of my peers, I consider myself:",
|
| 84 |
+
# The reviewer read this off the questionnaire printed in Graham et al.
|
| 85 |
+
# (2011), which is the paper this construct cites, and the paper does say
|
| 86 |
+
# "from others" (twice). The moralfoundations.org MFQ30 handout says "than
|
| 87 |
+
# others"; the cited paper wins.
|
| 88 |
+
"fair_3":
|
| 89 |
+
"Whether or not some people were treated differently from others.",
|
| 90 |
+
# NOT applied: team_psychological_safety_scale_4. The reviewer proposed "risk
|
| 91 |
+
# in this team" from a third-party questionnaire because she could not reach
|
| 92 |
+
# Edmondson (1999) through the library, and said to keep the original if the
|
| 93 |
+
# paper disagreed. It does: the recorded Edmondson PDF reads "risk on this
|
| 94 |
+
# team", so the stored wording stands.
|
| 95 |
}
|
| 96 |
|
| 97 |
+
# Item ORDER corrections. Order feeds item_hash and decides which item each
|
| 98 |
+
# sim_item_N export column refers to, so a construct whose stored order does not
|
| 99 |
+
# match its own cited source mislabels every per-item column. Values are the
|
| 100 |
+
# construct's item_ids in the source's printed order; ids are renumbered by
|
| 101 |
+
# position afterwards so item_id once again means "source item number".
|
| 102 |
+
# Both were checked against the source_url recorded on the construct.
|
| 103 |
+
ITEM_ORDER = {
|
| 104 |
+
# socy.umd.edu questionnaire image (Morris Rosenberg Foundation): item 1 is
|
| 105 |
+
# "I feel that I'm a person of worth". Wording there matches ours exactly.
|
| 106 |
+
"rses": ["rses_7", "rses_3", "rses_9", "rses_4", "rses_5",
|
| 107 |
+
"rses_10", "rses_1", "rses_8", "rses_6", "rses_2"],
|
| 108 |
+
# emerge.ucsd.edu CBI: the work-related subscale runs 7..13 starting with
|
| 109 |
+
# "Do you feel worn out at the end of the working day?".
|
| 110 |
+
"cbi_work_related_burnout": [
|
| 111 |
+
"cbi_work_related_burnout_10", "cbi_work_related_burnout_11",
|
| 112 |
+
"cbi_work_related_burnout_12", "cbi_work_related_burnout_13",
|
| 113 |
+
"cbi_work_related_burnout_7", "cbi_work_related_burnout_9",
|
| 114 |
+
"cbi_work_related_burnout_8",
|
| 115 |
+
],
|
| 116 |
+
}
|
| 117 |
+
# Source item number of the first item in each reordered construct, so renumbered
|
| 118 |
+
# ids keep matching the printed questionnaire.
|
| 119 |
+
ITEM_ORDER_START = {"rses": 1, "cbi_work_related_burnout": 7}
|
| 120 |
+
|
| 121 |
# One item moves subscale per the SCS-SF coding key. It is renumbered into the
|
| 122 |
# destination construct's own id convention ({construct}_{source item number});
|
| 123 |
# it is still SCS-SF item 1, and the review file records where it came from.
|
|
|
|
| 157 |
"lot_r": "https://psycnet.apa.org/fulltext/1995-07978-001.pdf",
|
| 158 |
# The sheet went out with no source_url for these two, so the reviewer had
|
| 159 |
# nothing to check against. Added afterwards and confirmed item by item.
|
| 160 |
+
# The reviewer read the MFQ off the questionnaire printed at the end of
|
| 161 |
+
# Graham et al. (2011), which is the paper both constructs cite. Pointing at
|
| 162 |
+
# the paper rather than the later MFQ30 handout keeps items, citation, and
|
| 163 |
+
# source in agreement (they differ on one item's wording).
|
| 164 |
+
"mfq_care": "https://www.the-brights.net/morality/statement_1_studies/14.%20Graham,%20J.,%20Nosek,%20B.%20A.,%20Haidt,%20J.,%20Iyer,%20R.,%20Koleva,%20S.,%20&%20Ditto,%20P.%20H.%20(2011).%20Mapping%20the%20moral%20domain.%20Journal%20of%20Personality%20and%20Social%20Psychology,%20101(2),%20366-385.pdf",
|
| 165 |
+
"mfq_fairness": "https://www.the-brights.net/morality/statement_1_studies/14.%20Graham,%20J.,%20Nosek,%20B.%20A.,%20Haidt,%20J.,%20Iyer,%20R.,%20Koleva,%20S.,%20&%20Ditto,%20P.%20H.%20(2011).%20Mapping%20the%20moral%20domain.%20Journal%20of%20Personality%20and%20Social%20Psychology,%20101(2),%20366-385.pdf",
|
| 166 |
+
# Replacements supplied by the reviewer after the review; both verified to
|
| 167 |
+
# resolve and to contain the items. The recorded links were dead (BAS-2 404,
|
| 168 |
+
# CAGE 403 even from a browser user agent).
|
| 169 |
+
"bas_2": "https://emerge.ucsd.edu/r_264jgxeqd35y1ox/",
|
| 170 |
+
"cage_questionnaire": "https://www.uspreventiveservicestaskforce.org/home/getfilebytoken/QETZFZLBsJbtPmVNVCgA7Z",
|
| 171 |
"collectivism_horizontal": "https://psycnet.apa.org/fulltext/1997-38342-009.pdf",
|
| 172 |
"individualism_horizontal": "https://psycnet.apa.org/fulltext/1997-38342-009.pdf",
|
| 173 |
}
|
|
|
|
| 191 |
"Triandis, H. C., & Gelfand, M. J. (1998). Converging measurement of horizontal and "
|
| 192 |
"vertical individualism and collectivism. Journal of Personality and Social "
|
| 193 |
"Psychology, 74(1). https://doi.org/10.1037/0022-3514.74.1.118",
|
| 194 |
+
# Page range and DOI are printed on the paper itself (now the recorded
|
| 195 |
+
# source_url), not looked up.
|
| 196 |
+
"mfq_care":
|
| 197 |
+
"Graham, J., Nosek, B. A., Haidt, J., Iyer, R., Koleva, S., & Ditto, P. H. (2011). "
|
| 198 |
+
"Mapping the moral domain. Journal of Personality and Social Psychology, 101(2), "
|
| 199 |
+
"366-385. https://doi.org/10.1037/a0021847",
|
| 200 |
+
"mfq_fairness":
|
| 201 |
+
"Graham, J., Nosek, B. A., Haidt, J., Iyer, R., Koleva, S., & Ditto, P. H. (2011). "
|
| 202 |
+
"Mapping the moral domain. Journal of Personality and Social Psychology, 101(2), "
|
| 203 |
+
"366-385. https://doi.org/10.1037/a0021847",
|
| 204 |
}
|
| 205 |
|
| 206 |
QUESTIONNAIRE_FIX = {
|
|
|
|
| 213 |
REVIEW_NOTE = {
|
| 214 |
"lot_r": "The scale's 4 filler items are correctly excluded from this construct; they are "
|
| 215 |
"not scored in the source.",
|
| 216 |
+
"mfq_care": "The review sheet shipped without a source_url for this construct. The "
|
| 217 |
+
"questionnaire printed in the cited paper is now recorded and all 4 items "
|
| 218 |
+
"confirmed verbatim against it. The construct uses a subset of the foundation's "
|
| 219 |
+
"items, which the reviewer confirmed as correctly grouped.",
|
| 220 |
+
"mfq_fairness": "The review sheet shipped without a source_url. The reviewer read the MFQ "
|
| 221 |
+
"off the appendix of the cited paper, which reads 'treated differently from "
|
| 222 |
+
"others'; her correction is applied and all 4 items confirmed verbatim. The "
|
| 223 |
+
"later MFQ30 handout says 'than others', so items, citation, and source_url "
|
| 224 |
+
"now all point at the paper.",
|
| 225 |
+
"team_psychological_safety_scale": "Reviewer proposed 'risk in this team' from a third-party "
|
| 226 |
+
"questionnaire because Edmondson (1999) was not reachable "
|
| 227 |
+
"through her library, and said to keep the original if the "
|
| 228 |
+
"paper disagreed. The recorded Edmondson PDF reads 'risk on "
|
| 229 |
+
"this team', so the stored wording stands.",
|
| 230 |
+
"rses": "Item order corrected to the printed order of the questionnaire at the recorded "
|
| 231 |
+
"source_url (Morris Rosenberg Foundation), per the reviewer's mapping; item ids "
|
| 232 |
+
"renumbered to match. Wording and reverse keys there match this construct exactly.",
|
| 233 |
+
"cbi_work_related_burnout": "Item order corrected to the printed order at the recorded "
|
| 234 |
+
"source_url, per the reviewer's mapping; item ids renumbered to "
|
| 235 |
+
"match the source's 7 to 13.",
|
| 236 |
+
"bas_2": "Recorded source URL was dead (404). Replacement supplied by the reviewer, and all "
|
| 237 |
+
"10 items confirmed verbatim against it. Her note that BAS-2 has no reverse-scored "
|
| 238 |
+
"items and is scored by averaging all 10 is consistent with the flags here.",
|
| 239 |
+
"cage_questionnaire": "Recorded source URL returned 403. Replacement supplied by the reviewer "
|
| 240 |
+
"and the wording correction ('ought to' -> 'should') confirmed against "
|
| 241 |
+
"it. The replacement is a token-style URL and may not be durable.",
|
| 242 |
}
|
| 243 |
|
| 244 |
|
|
|
|
| 308 |
it["reverse_scored"] = review_flags[iid]
|
| 309 |
changed_items = True
|
| 310 |
|
| 311 |
+
if cid in ITEM_ORDER:
|
| 312 |
+
wanted = ITEM_ORDER[cid]
|
| 313 |
+
by_id = {i["item_id"]: i for i in items}
|
| 314 |
+
missing = [x for x in wanted if x not in by_id]
|
| 315 |
+
assert not missing and len(wanted) == len(items), (
|
| 316 |
+
f"{cid}: ITEM_ORDER does not cover the construct exactly ({missing=})"
|
| 317 |
+
)
|
| 318 |
+
if [i["item_id"] for i in items] != wanted:
|
| 319 |
+
items = [by_id[x] for x in wanted]
|
| 320 |
+
# ids encode the source's item number, so renumber by position
|
| 321 |
+
start = ITEM_ORDER_START[cid]
|
| 322 |
+
for n, it in enumerate(items, start=start):
|
| 323 |
+
it["item_id"] = f"{cid}_{n}"
|
| 324 |
+
plan["detail"].append(
|
| 325 |
+
f" {cid}: reordered to the source's printed order, ids renumbered "
|
| 326 |
+
f"{start}..{start + len(items) - 1}"
|
| 327 |
+
)
|
| 328 |
+
changed_items = True
|
| 329 |
+
|
| 330 |
src, dst = SUBSCALE_MOVE["from"], SUBSCALE_MOVE["to"]
|
| 331 |
move_id, new_id = SUBSCALE_MOVE["item_id"], SUBSCALE_MOVE["new_item_id"]
|
| 332 |
if cid == src and any(i["item_id"] == move_id for i in items):
|
|
@@ -7,8 +7,8 @@ category: Body appreciation / body image
|
|
| 7 |
description: Body appreciation / body image - Body Appreciation Scale-2 (BAS-2).
|
| 8 |
citation: 'Tylka, T. L., & Wood-Barcalow, N. L. (2015). The Body Appreciation Scale-2: Item refinement
|
| 9 |
and psychometric evaluation. Body Image, 12, 53–67. https://doi.org/10.1016/j.bodyim.2014.09.006'
|
| 10 |
-
verification_status:
|
| 11 |
-
source_url: https://emerge.ucsd.edu/
|
| 12 |
rights_note: Research center item page; verify permission for commercial redistribution.
|
| 13 |
questionnaire: Body Appreciation Scale-2 (BAS-2)
|
| 14 |
reverse_flags_source: reviewed_2026-08-25_noor_skhiri
|
|
@@ -16,10 +16,10 @@ imported_from: lib.xlsx
|
|
| 16 |
review:
|
| 17 |
reviewer: Noor Skhiri
|
| 18 |
date: '2026-08-25'
|
| 19 |
-
outcome:
|
| 20 |
-
notes:
|
| 21 |
-
|
| 22 |
-
|
| 23 |
items:
|
| 24 |
- item_id: bas_2_1
|
| 25 |
text: I respect my body.
|
|
|
|
| 7 |
description: Body appreciation / body image - Body Appreciation Scale-2 (BAS-2).
|
| 8 |
citation: 'Tylka, T. L., & Wood-Barcalow, N. L. (2015). The Body Appreciation Scale-2: Item refinement
|
| 9 |
and psychometric evaluation. Body Image, 12, 53–67. https://doi.org/10.1016/j.bodyim.2014.09.006'
|
| 10 |
+
verification_status: verified
|
| 11 |
+
source_url: https://emerge.ucsd.edu/r_264jgxeqd35y1ox/
|
| 12 |
rights_note: Research center item page; verify permission for commercial redistribution.
|
| 13 |
questionnaire: Body Appreciation Scale-2 (BAS-2)
|
| 14 |
reverse_flags_source: reviewed_2026-08-25_noor_skhiri
|
|
|
|
| 16 |
review:
|
| 17 |
reviewer: Noor Skhiri
|
| 18 |
date: '2026-08-25'
|
| 19 |
+
outcome: verified
|
| 20 |
+
notes: Recorded source URL was dead (404). Replacement supplied by the reviewer, and all 10 items confirmed
|
| 21 |
+
verbatim against it. Her note that BAS-2 has no reverse-scored items and is scored by averaging all
|
| 22 |
+
10 is consistent with the flags here.
|
| 23 |
items:
|
| 24 |
- item_id: bas_2_1
|
| 25 |
text: I respect my body.
|
|
@@ -7,8 +7,8 @@ category: Alcohol use risk
|
|
| 7 |
description: Alcohol use risk - CAGE Questionnaire. Screening tool only; not a diagnosis.
|
| 8 |
citation: 'Ewing, J. A. (1984). Detecting alcoholism: The CAGE questionnaire. JAMA, 252(14), 1905–1907.
|
| 9 |
https://doi.org/10.1001/jama.1984.03350140051025'
|
| 10 |
-
verification_status:
|
| 11 |
-
source_url: https://www.
|
| 12 |
rights_note: Institutional clinical handout; verify permission for redistribution. Screening tool only;
|
| 13 |
not a diagnosis.
|
| 14 |
questionnaire: CAGE Questionnaire
|
|
@@ -17,10 +17,10 @@ imported_from: lib.xlsx
|
|
| 17 |
review:
|
| 18 |
reviewer: Noor Skhiri
|
| 19 |
date: '2026-08-25'
|
| 20 |
-
outcome:
|
| 21 |
-
notes:
|
| 22 |
-
|
| 23 |
-
|
| 24 |
items:
|
| 25 |
- item_id: cage_questionnaire_1
|
| 26 |
text: Have you ever felt you should Cut down on your drinking?
|
|
|
|
| 7 |
description: Alcohol use risk - CAGE Questionnaire. Screening tool only; not a diagnosis.
|
| 8 |
citation: 'Ewing, J. A. (1984). Detecting alcoholism: The CAGE questionnaire. JAMA, 252(14), 1905–1907.
|
| 9 |
https://doi.org/10.1001/jama.1984.03350140051025'
|
| 10 |
+
verification_status: verified
|
| 11 |
+
source_url: https://www.uspreventiveservicestaskforce.org/home/getfilebytoken/QETZFZLBsJbtPmVNVCgA7Z
|
| 12 |
rights_note: Institutional clinical handout; verify permission for redistribution. Screening tool only;
|
| 13 |
not a diagnosis.
|
| 14 |
questionnaire: CAGE Questionnaire
|
|
|
|
| 17 |
review:
|
| 18 |
reviewer: Noor Skhiri
|
| 19 |
date: '2026-08-25'
|
| 20 |
+
outcome: verified
|
| 21 |
+
notes: Recorded source URL returned 403. Replacement supplied by the reviewer and the wording correction
|
| 22 |
+
('ought to' -> 'should') confirmed against it. The replacement is a token-style URL and may not be
|
| 23 |
+
durable.
|
| 24 |
items:
|
| 25 |
- item_id: cage_questionnaire_1
|
| 26 |
text: Have you ever felt you should Cut down on your drinking?
|
|
@@ -1,4 +1,5 @@
|
|
| 1 |
-
#
|
|
|
|
| 2 |
construct_id: cbi_work_related_burnout
|
| 3 |
version: 1
|
| 4 |
name: Work-related burnout (CBI)
|
|
@@ -7,7 +8,7 @@ category: Burnout
|
|
| 7 |
description: Burnout - Work-related burnout dimension of the Copenhagen Burnout Inventory (CBI).
|
| 8 |
citation: 'Kristensen, T. S., Borritz, M., Villadsen, E., & Christensen, K. B. (2005). The Copenhagen
|
| 9 |
Burnout Inventory: A new tool for the assessment of burnout. Work & Stress, 19(3), 192–207. https://doi.org/10.1080/02678370500297720'
|
| 10 |
-
verification_status:
|
| 11 |
source_url: https://emerge.ucsd.edu/r_2qfb6wi4uepyugd/
|
| 12 |
rights_note: Research center item page; verify permission for commercial redistribution.
|
| 13 |
questionnaire: Copenhagen Burnout Inventory (CBI)
|
|
@@ -16,10 +17,7 @@ imported_from: lib.xlsx
|
|
| 16 |
review:
|
| 17 |
reviewer: Noor Skhiri
|
| 18 |
date: '2026-08-25'
|
| 19 |
-
outcome:
|
| 20 |
-
notes: 'Reviewer maps stored items 7,8,9,10,11,12,13 to source item numbers 11,13,12,7,8,9,10: the item
|
| 21 |
-
ORDER does not match the source. Not applied; order feeds item_hash and the sim_item_N export columns.
|
| 22 |
-
Pending a decision.'
|
| 23 |
items:
|
| 24 |
- item_id: cbi_work_related_burnout_7
|
| 25 |
text: Is your work emotionally exhausting?
|
|
|
|
| 1 |
+
# Superseded by version 2 (spec 0007). Kept so runs that used this
|
| 2 |
+
# version still resolve; never edit a published version in place.
|
| 3 |
construct_id: cbi_work_related_burnout
|
| 4 |
version: 1
|
| 5 |
name: Work-related burnout (CBI)
|
|
|
|
| 8 |
description: Burnout - Work-related burnout dimension of the Copenhagen Burnout Inventory (CBI).
|
| 9 |
citation: 'Kristensen, T. S., Borritz, M., Villadsen, E., & Christensen, K. B. (2005). The Copenhagen
|
| 10 |
Burnout Inventory: A new tool for the assessment of burnout. Work & Stress, 19(3), 192–207. https://doi.org/10.1080/02678370500297720'
|
| 11 |
+
verification_status: archived
|
| 12 |
source_url: https://emerge.ucsd.edu/r_2qfb6wi4uepyugd/
|
| 13 |
rights_note: Research center item page; verify permission for commercial redistribution.
|
| 14 |
questionnaire: Copenhagen Burnout Inventory (CBI)
|
|
|
|
| 17 |
review:
|
| 18 |
reviewer: Noor Skhiri
|
| 19 |
date: '2026-08-25'
|
| 20 |
+
outcome: superseded_by_version_2
|
|
|
|
|
|
|
|
|
|
| 21 |
items:
|
| 22 |
- item_id: cbi_work_related_burnout_7
|
| 23 |
text: Is your work emotionally exhausting?
|
|
@@ -0,0 +1,43 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Construct: versioned, append-only. Version 2 applies the 2026-08-25 library review (spec 0007).
|
| 2 |
+
construct_id: cbi_work_related_burnout
|
| 3 |
+
version: 2
|
| 4 |
+
name: Work-related burnout (CBI)
|
| 5 |
+
language: en
|
| 6 |
+
category: Burnout
|
| 7 |
+
description: Burnout - Work-related burnout dimension of the Copenhagen Burnout Inventory (CBI).
|
| 8 |
+
citation: 'Kristensen, T. S., Borritz, M., Villadsen, E., & Christensen, K. B. (2005). The Copenhagen
|
| 9 |
+
Burnout Inventory: A new tool for the assessment of burnout. Work & Stress, 19(3), 192–207. https://doi.org/10.1080/02678370500297720'
|
| 10 |
+
verification_status: verified
|
| 11 |
+
source_url: https://emerge.ucsd.edu/r_2qfb6wi4uepyugd/
|
| 12 |
+
rights_note: Research center item page; verify permission for commercial redistribution.
|
| 13 |
+
questionnaire: Copenhagen Burnout Inventory (CBI)
|
| 14 |
+
reverse_flags_source: reviewed_2026-08-25_noor_skhiri
|
| 15 |
+
imported_from: lib.xlsx
|
| 16 |
+
review:
|
| 17 |
+
reviewer: Noor Skhiri
|
| 18 |
+
date: '2026-08-25'
|
| 19 |
+
outcome: verified
|
| 20 |
+
notes: Item order corrected to the printed order at the recorded source_url, per the reviewer's mapping;
|
| 21 |
+
item ids renumbered to match the source's 7 to 13.
|
| 22 |
+
items:
|
| 23 |
+
- item_id: cbi_work_related_burnout_7
|
| 24 |
+
text: Do you feel worn out at the end of the working day?
|
| 25 |
+
reverse_scored: false
|
| 26 |
+
- item_id: cbi_work_related_burnout_8
|
| 27 |
+
text: Are you exhausted in the morning at the thought of another day at work?
|
| 28 |
+
reverse_scored: false
|
| 29 |
+
- item_id: cbi_work_related_burnout_9
|
| 30 |
+
text: Do you feel that every working hour is tiring for you?
|
| 31 |
+
reverse_scored: false
|
| 32 |
+
- item_id: cbi_work_related_burnout_10
|
| 33 |
+
text: Do you have enough energy for family and friends during leisure time?
|
| 34 |
+
reverse_scored: true
|
| 35 |
+
- item_id: cbi_work_related_burnout_11
|
| 36 |
+
text: Is your work emotionally exhausting?
|
| 37 |
+
reverse_scored: false
|
| 38 |
+
- item_id: cbi_work_related_burnout_12
|
| 39 |
+
text: Does your work frustrate you?
|
| 40 |
+
reverse_scored: false
|
| 41 |
+
- item_id: cbi_work_related_burnout_13
|
| 42 |
+
text: Do you feel burnt out because of your work?
|
| 43 |
+
reverse_scored: false
|
|
@@ -6,16 +6,16 @@ language: en
|
|
| 6 |
category: moral-foundations
|
| 7 |
description: Concern with suffering, compassion, and protection of the vulnerable (MFQ Care/Harm).
|
| 8 |
citation: Graham, J., Nosek, B. A., Haidt, J., Iyer, R., Koleva, S., & Ditto, P. H. (2011). Mapping the
|
| 9 |
-
moral domain.
|
| 10 |
verification_status: verified
|
| 11 |
review:
|
| 12 |
reviewer: Noor Skhiri
|
| 13 |
date: '2026-08-25'
|
| 14 |
outcome: verified
|
| 15 |
-
notes:
|
| 16 |
-
|
| 17 |
-
of the foundation's items, which the reviewer confirmed as correctly grouped.
|
| 18 |
-
source_url: https://
|
| 19 |
items:
|
| 20 |
- item_id: care_1
|
| 21 |
text: Compassion for those who are suffering is the most crucial virtue.
|
|
|
|
| 6 |
category: moral-foundations
|
| 7 |
description: Concern with suffering, compassion, and protection of the vulnerable (MFQ Care/Harm).
|
| 8 |
citation: Graham, J., Nosek, B. A., Haidt, J., Iyer, R., Koleva, S., & Ditto, P. H. (2011). Mapping the
|
| 9 |
+
moral domain. Journal of Personality and Social Psychology, 101(2), 366-385. https://doi.org/10.1037/a0021847
|
| 10 |
verification_status: verified
|
| 11 |
review:
|
| 12 |
reviewer: Noor Skhiri
|
| 13 |
date: '2026-08-25'
|
| 14 |
outcome: verified
|
| 15 |
+
notes: The review sheet shipped without a source_url for this construct. The questionnaire printed in
|
| 16 |
+
the cited paper is now recorded and all 4 items confirmed verbatim against it. The construct uses
|
| 17 |
+
a subset of the foundation's items, which the reviewer confirmed as correctly grouped.
|
| 18 |
+
source_url: https://www.the-brights.net/morality/statement_1_studies/14.%20Graham,%20J.,%20Nosek,%20B.%20A.,%20Haidt,%20J.,%20Iyer,%20R.,%20Koleva,%20S.,%20&%20Ditto,%20P.%20H.%20(2011).%20Mapping%20the%20moral%20domain.%20Journal%20of%20Personality%20and%20Social%20Psychology,%20101(2),%20366-385.pdf
|
| 19 |
items:
|
| 20 |
- item_id: care_1
|
| 21 |
text: Compassion for those who are suffering is the most crucial virtue.
|
|
@@ -1,4 +1,5 @@
|
|
| 1 |
-
#
|
|
|
|
| 2 |
construct_id: mfq_fairness
|
| 3 |
version: 1
|
| 4 |
name: Moral Foundations - Fairness
|
|
@@ -7,14 +8,11 @@ category: moral-foundations
|
|
| 7 |
description: Concern with justice, rights, and equal treatment (MFQ Fairness/Cheating).
|
| 8 |
citation: Graham, J., Nosek, B. A., Haidt, J., Iyer, R., Koleva, S., & Ditto, P. H. (2011). Mapping the
|
| 9 |
moral domain. JPSP, 101(2).
|
| 10 |
-
verification_status:
|
| 11 |
review:
|
| 12 |
reviewer: Noor Skhiri
|
| 13 |
date: '2026-08-25'
|
| 14 |
-
outcome:
|
| 15 |
-
notes: 'Reviewer flagged the missing source_url (the sheet shipped without one) and proposed ''treated
|
| 16 |
-
differently from others''. Source added: the published MFQ30 reads ''treated differently than others'',
|
| 17 |
-
which is the wording already stored here, so it is kept and all 4 items are confirmed verbatim.'
|
| 18 |
source_url: https://moralfoundations.org/wp-content/uploads/files/MFQ30.doc
|
| 19 |
items:
|
| 20 |
- item_id: fair_1
|
|
|
|
| 1 |
+
# Superseded by version 2 (spec 0007). Kept so runs that used this
|
| 2 |
+
# version still resolve; never edit a published version in place.
|
| 3 |
construct_id: mfq_fairness
|
| 4 |
version: 1
|
| 5 |
name: Moral Foundations - Fairness
|
|
|
|
| 8 |
description: Concern with justice, rights, and equal treatment (MFQ Fairness/Cheating).
|
| 9 |
citation: Graham, J., Nosek, B. A., Haidt, J., Iyer, R., Koleva, S., & Ditto, P. H. (2011). Mapping the
|
| 10 |
moral domain. JPSP, 101(2).
|
| 11 |
+
verification_status: archived
|
| 12 |
review:
|
| 13 |
reviewer: Noor Skhiri
|
| 14 |
date: '2026-08-25'
|
| 15 |
+
outcome: superseded_by_version_2
|
|
|
|
|
|
|
|
|
|
| 16 |
source_url: https://moralfoundations.org/wp-content/uploads/files/MFQ30.doc
|
| 17 |
items:
|
| 18 |
- item_id: fair_1
|
|
@@ -0,0 +1,34 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Construct: versioned, append-only. Version 2 applies the 2026-08-25 library review (spec 0007).
|
| 2 |
+
construct_id: mfq_fairness
|
| 3 |
+
version: 2
|
| 4 |
+
name: Moral Foundations - Fairness
|
| 5 |
+
language: en
|
| 6 |
+
category: moral-foundations
|
| 7 |
+
description: Concern with justice, rights, and equal treatment (MFQ Fairness/Cheating).
|
| 8 |
+
citation: Graham, J., Nosek, B. A., Haidt, J., Iyer, R., Koleva, S., & Ditto, P. H. (2011). Mapping the
|
| 9 |
+
moral domain. Journal of Personality and Social Psychology, 101(2), 366-385. https://doi.org/10.1037/a0021847
|
| 10 |
+
verification_status: verified
|
| 11 |
+
review:
|
| 12 |
+
reviewer: Noor Skhiri
|
| 13 |
+
date: '2026-08-25'
|
| 14 |
+
outcome: verified
|
| 15 |
+
notes: The review sheet shipped without a source_url. The reviewer read the MFQ off the appendix of
|
| 16 |
+
the cited paper, which reads 'treated differently from others'; her correction is applied and all
|
| 17 |
+
4 items confirmed verbatim. The later MFQ30 handout says 'than others', so items, citation, and source_url
|
| 18 |
+
now all point at the paper.
|
| 19 |
+
source_url: https://www.the-brights.net/morality/statement_1_studies/14.%20Graham,%20J.,%20Nosek,%20B.%20A.,%20Haidt,%20J.,%20Iyer,%20R.,%20Koleva,%20S.,%20&%20Ditto,%20P.%20H.%20(2011).%20Mapping%20the%20moral%20domain.%20Journal%20of%20Personality%20and%20Social%20Psychology,%20101(2),%20366-385.pdf
|
| 20 |
+
reverse_flags_source: reviewed_2026-08-25_noor_skhiri
|
| 21 |
+
items:
|
| 22 |
+
- item_id: fair_1
|
| 23 |
+
text: Justice is the most important requirement for a society.
|
| 24 |
+
reverse_scored: false
|
| 25 |
+
- item_id: fair_2
|
| 26 |
+
text: When the government makes laws, the number one principle should be ensuring that everyone is treated
|
| 27 |
+
fairly.
|
| 28 |
+
reverse_scored: false
|
| 29 |
+
- item_id: fair_3
|
| 30 |
+
text: Whether or not some people were treated differently from others.
|
| 31 |
+
reverse_scored: false
|
| 32 |
+
- item_id: fair_4
|
| 33 |
+
text: Whether or not someone acted unfairly.
|
| 34 |
+
reverse_scored: false
|
|
@@ -6,7 +6,7 @@ language: en
|
|
| 6 |
category: Self-esteem
|
| 7 |
description: Self-esteem - Rosenberg Self-Esteem Scale (RSES).
|
| 8 |
citation: Rosenberg, M. (1965). Society and the adolescent self-image. Princeton University Press.
|
| 9 |
-
verification_status:
|
| 10 |
source_url: https://socy.umd.edu/about-us/rosenberg-self-esteem-scale
|
| 11 |
rights_note: University of Maryland Rosenberg page states the RSES is public domain.
|
| 12 |
questionnaire: Rosenberg Self-Esteem Scale (RSES)
|
|
@@ -15,20 +15,20 @@ imported_from: lib.xlsx
|
|
| 15 |
review:
|
| 16 |
reviewer: Noor Skhiri
|
| 17 |
date: '2026-08-25'
|
| 18 |
-
outcome:
|
| 19 |
-
notes:
|
| 20 |
-
|
| 21 |
-
|
| 22 |
items:
|
| 23 |
- item_id: rses_1
|
| 24 |
-
text:
|
| 25 |
reverse_scored: false
|
| 26 |
- item_id: rses_2
|
| 27 |
-
text: At times I think I am no good at all.
|
| 28 |
-
reverse_scored: true
|
| 29 |
-
- item_id: rses_3
|
| 30 |
text: I feel that I have a number of good qualities.
|
| 31 |
reverse_scored: false
|
|
|
|
|
|
|
|
|
|
| 32 |
- item_id: rses_4
|
| 33 |
text: I am able to do things as well as most other people.
|
| 34 |
reverse_scored: false
|
|
@@ -36,17 +36,17 @@ items:
|
|
| 36 |
text: I feel I do not have much to be proud of.
|
| 37 |
reverse_scored: true
|
| 38 |
- item_id: rses_6
|
| 39 |
-
text: I
|
| 40 |
-
reverse_scored:
|
| 41 |
- item_id: rses_7
|
| 42 |
-
text:
|
| 43 |
reverse_scored: false
|
| 44 |
- item_id: rses_8
|
| 45 |
text: I wish I could have more respect for myself.
|
| 46 |
reverse_scored: true
|
| 47 |
- item_id: rses_9
|
| 48 |
-
text:
|
| 49 |
reverse_scored: true
|
| 50 |
- item_id: rses_10
|
| 51 |
-
text: I
|
| 52 |
-
reverse_scored:
|
|
|
|
| 6 |
category: Self-esteem
|
| 7 |
description: Self-esteem - Rosenberg Self-Esteem Scale (RSES).
|
| 8 |
citation: Rosenberg, M. (1965). Society and the adolescent self-image. Princeton University Press.
|
| 9 |
+
verification_status: verified
|
| 10 |
source_url: https://socy.umd.edu/about-us/rosenberg-self-esteem-scale
|
| 11 |
rights_note: University of Maryland Rosenberg page states the RSES is public domain.
|
| 12 |
questionnaire: Rosenberg Self-Esteem Scale (RSES)
|
|
|
|
| 15 |
review:
|
| 16 |
reviewer: Noor Skhiri
|
| 17 |
date: '2026-08-25'
|
| 18 |
+
outcome: verified
|
| 19 |
+
notes: Item order corrected to the printed order of the questionnaire at the recorded source_url (Morris
|
| 20 |
+
Rosenberg Foundation), per the reviewer's mapping; item ids renumbered to match. Wording and reverse
|
| 21 |
+
keys there match this construct exactly.
|
| 22 |
items:
|
| 23 |
- item_id: rses_1
|
| 24 |
+
text: I feel that I'm a person of worth, at least on an equal plane with others.
|
| 25 |
reverse_scored: false
|
| 26 |
- item_id: rses_2
|
|
|
|
|
|
|
|
|
|
| 27 |
text: I feel that I have a number of good qualities.
|
| 28 |
reverse_scored: false
|
| 29 |
+
- item_id: rses_3
|
| 30 |
+
text: All in all, I am inclined to feel that I am a failure.
|
| 31 |
+
reverse_scored: true
|
| 32 |
- item_id: rses_4
|
| 33 |
text: I am able to do things as well as most other people.
|
| 34 |
reverse_scored: false
|
|
|
|
| 36 |
text: I feel I do not have much to be proud of.
|
| 37 |
reverse_scored: true
|
| 38 |
- item_id: rses_6
|
| 39 |
+
text: I take a positive attitude toward myself.
|
| 40 |
+
reverse_scored: false
|
| 41 |
- item_id: rses_7
|
| 42 |
+
text: On the whole, I am satisfied with myself.
|
| 43 |
reverse_scored: false
|
| 44 |
- item_id: rses_8
|
| 45 |
text: I wish I could have more respect for myself.
|
| 46 |
reverse_scored: true
|
| 47 |
- item_id: rses_9
|
| 48 |
+
text: I certainly feel useless at times.
|
| 49 |
reverse_scored: true
|
| 50 |
- item_id: rses_10
|
| 51 |
+
text: At times I think I am no good at all.
|
| 52 |
+
reverse_scored: true
|
|
@@ -7,7 +7,7 @@ category: Psychological safety
|
|
| 7 |
description: Psychological safety - Team Psychological Safety Scale.
|
| 8 |
citation: Edmondson, A. (1999). Psychological safety and learning behavior in work teams. Administrative
|
| 9 |
Science Quarterly, 44(2), 350–383. https://doi.org/10.2307/2666999
|
| 10 |
-
verification_status:
|
| 11 |
source_url: https://web.mit.edu/curhan/www/docs/Articles/15341_Readings/Group_Performance/Edmondson%20Psychological%20safety.pdf
|
| 12 |
rights_note: Author paper/public PDF includes scale; verify permission for commercial redistribution.
|
| 13 |
questionnaire: Team Psychological Safety Scale
|
|
@@ -16,10 +16,10 @@ imported_from: lib.xlsx
|
|
| 16 |
review:
|
| 17 |
reviewer: Noor Skhiri
|
| 18 |
date: '2026-08-25'
|
| 19 |
-
outcome:
|
| 20 |
-
notes: Reviewer proposed '
|
| 21 |
-
|
| 22 |
-
|
| 23 |
items:
|
| 24 |
- item_id: team_psychological_safety_scale_1
|
| 25 |
text: If you make a mistake on this team, it is often held against you.
|
|
|
|
| 7 |
description: Psychological safety - Team Psychological Safety Scale.
|
| 8 |
citation: Edmondson, A. (1999). Psychological safety and learning behavior in work teams. Administrative
|
| 9 |
Science Quarterly, 44(2), 350–383. https://doi.org/10.2307/2666999
|
| 10 |
+
verification_status: verified
|
| 11 |
source_url: https://web.mit.edu/curhan/www/docs/Articles/15341_Readings/Group_Performance/Edmondson%20Psychological%20safety.pdf
|
| 12 |
rights_note: Author paper/public PDF includes scale; verify permission for commercial redistribution.
|
| 13 |
questionnaire: Team Psychological Safety Scale
|
|
|
|
| 16 |
review:
|
| 17 |
reviewer: Noor Skhiri
|
| 18 |
date: '2026-08-25'
|
| 19 |
+
outcome: verified
|
| 20 |
+
notes: Reviewer proposed 'risk in this team' from a third-party questionnaire because Edmondson (1999)
|
| 21 |
+
was not reachable through her library, and said to keep the original if the paper disagreed. The recorded
|
| 22 |
+
Edmondson PDF reads 'risk on this team', so the stored wording stands.
|
| 23 |
items:
|
| 24 |
- item_id: team_psychological_safety_scale_1
|
| 25 |
text: If you make a mistake on this team, it is often held against you.
|