devaanand Claude Opus 5 (1M context) commited on
Commit
0af19f8
·
1 Parent(s): 10425ec

fix(constructs): resolve the review's open questions from Noor's answers

Browse files

She 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 CHANGED
@@ -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); 83 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), 7 item wordings, one subscale grouping in the SCS-SF,
14
- and a batch of dead or incomplete citation links. Corrected constructs ship as a new
 
 
15
  version: the picker offers the corrected one, and runs that used the earlier version
16
- still open, export, and reproduce exactly as before. 11 constructs stay flagged, each
17
- now saying why: two open wording questions (the IPIP scales and the K10), one where the
18
- review's proposed wording disagreed with the cited publication and the published wording
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
README.md CHANGED
@@ -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: 83 constructs are marked verified and carry the reviewer
58
- and review date. The other 11 stay flagged in the interface and each records why - an
59
- open wording question, a proposed correction that disagreed with the cited paper, an
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).
ROADMAP.md CHANGED
@@ -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-26 (spec 0007). Noor's
55
- review of all 525 items applied; 81 of 94 constructs verified.
56
- - [ ] Construct library: 13 constructs still unverified, each with the reason
57
- in its review.notes. Needs decisions, roughly in priority order:
58
- * PI: the IPIP "I" prefix (50 items, 5 constructs) and restoring the K10
59
- stem (10 items).
60
- * Reconcile two reviewer corrections that contradict the cited paper -
61
- mfq_fairness ("differently than/from others", MFQ30 says "than") and
62
- team_psychological_safety_scale ("risk on/in this team", Edmondson
63
- 1999 says "on"). Published wording kept for now.
64
- * Decide the item ORDER for rses and cbi_work_related_burnout: the
65
- reviewer says both differ from the source. Order feeds item_hash and
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
backend/tests/test_construct_library_versions.py CHANGED
@@ -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"]) == 21, "superseded v1 files"
178
- assert len(by_status["verified"]) == 83
179
- assert len(by_status["needs_verification"]) == 11
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 published version's ITEMS are never rewritten.
228
 
229
- Compares each tracked construct against the committed version in git rather
230
- than against its own v2 - comparing v1 to v2 would pass even if v1's items
231
- had been quietly edited, which is the exact failure this guards.
 
 
 
 
 
232
  """
233
  repo = CONSTRUCTS_DIR.parents[2]
234
  base = subprocess.run(
235
- ["git", "rev-parse", "HEAD"], cwd=repo, capture_output=True, text=True
236
  )
237
- if base.returncode != 0: # not a git checkout (e.g. a packaged install)
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"HEAD:{rel.as_posix()}"], cwd=repo, capture_output=True, text=True
245
  )
246
  if show.returncode != 0:
247
- continue # new file in this change, nothing committed to compare against
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"]:
docs/specs/0007-construct-library-verification-pass.md CHANGED
@@ -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
- - 7 verbatim wording corrections, one item each, in 7 constructs.
 
 
 
 
 
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
- 21 constructs get a `version: 2` file. The `version: 1` files stay exactly as they are:
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 83 constructs.
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
- 11 constructs keep `verification_status: needs_verification`, each with the reason
95
- recorded in its `review.notes`.
96
-
97
- **Two of the reviewer's wording corrections are NOT applied, because each disagrees with
98
- the publication its own construct cites.** Both were checked against the source:
99
-
100
- - `mfq_fairness` item 3: she proposed "treated differently from others"; the published
101
- MFQ30 reads "treated differently **than** others", which is what the library already
102
- had. This one is resolved: the MFQ30 is now recorded as the construct's `source_url`
103
- (the review sheet shipped without one), all four items check out verbatim against it,
104
- and the construct is verified.
105
- - `team_psychological_safety_scale` item 4: she proposed "It is safe to take a risk **in**
106
- this team", sourced from a third-party questionnaire (novopsych TPS-7); Edmondson
107
- (1999), the cited paper and the recorded `source_url`, reads "on this team", which is
108
- what the library already had. Her replacement `source_url` is not applied either - the
109
- recorded Edmondson PDF resolves and contains the scale.
110
-
111
- Both keep their published wording and are held back for someone to reconcile the
112
- disagreement. Applying them would have moved a `verified` item away from its source,
113
- which is the opposite of what this pass is for.
114
-
115
- **Two item-ORDER findings are recorded but not applied.** For `rses` the reviewer maps
116
- stored items 1,2,3,6,7,9,10 to source items 7,10,2,9,1,3,6, and for
117
- `cbi_work_related_burnout` she maps stored 7..13 to source 11,13,12,7,8,9,10. Item order
118
- feeds `item_hash` and decides what each `sim_item_N` export column refers to, so
119
- reordering is a scoring-visible change that needs a decision rather than a silent fix.
120
- Their reverse-scoring corrections ARE applied.
121
-
122
- **Two constructs have no reachable source on record** (`bas_2`, whose recorded URL 404s,
123
- and `cage_questionnaire`, whose URL returns 403). "Verified verbatim against the original
124
- publication" cannot honestly be claimed without one, so they stay unverified until a
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` - 21 v2 files, 83 verified, 11
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 115 files and reports the 4 new all-reversed
168
  warnings alongside the pre-existing `grit_s_consistency_of_interests`.
169
 
170
  ## Implementation notes
171
 
172
- Files changed: `packages/construct_library/constructs/*.yaml` (21 new v2 files, 94
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
packages/construct_library/apply_review.py CHANGED
@@ -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
- # NOT applied, and deliberately so: two of the reviewer's wording corrections
124
- # disagree with the publication each construct cites, so applying them would
125
- # move a `verified` item AWAY from its source. Both are checked quotes:
126
- # fair_3 - published MFQ30 reads "treated differently than others"
127
- # (moralfoundations.org MFQ30), not "from others".
128
- # team_psychological_safety_scale_4 - Edmondson (1999), the cited paper and
129
- # the recorded source_url, reads "It is safe to take a risk on this
130
- # team"; "in this team" comes from a third-party questionnaire.
131
- # Both constructs are in PENDING with the discrepancy recorded.
 
 
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
- "mfq_care": "https://moralfoundations.org/wp-content/uploads/files/MFQ30.doc",
174
- "mfq_fairness": "https://moralfoundations.org/wp-content/uploads/files/MFQ30.doc",
 
 
 
 
 
 
 
 
 
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": "Reviewer flagged the missing source_url (the sheet shipped without one for this "
211
- "construct). Source added and all 4 items confirmed verbatim against the "
212
- "published MFQ30. The construct uses a subset of the foundation's items, which "
213
- "the reviewer confirmed as correctly grouped.",
214
- "mfq_fairness": "Reviewer flagged the missing source_url (the sheet shipped without one) and "
215
- "proposed 'treated differently from others'. Source added: the published "
216
- "MFQ30 reads 'treated differently than others', which is the wording already "
217
- "stored here, so it is kept and all 4 items are confirmed verbatim.",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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):
packages/construct_library/constructs/bas_2_v2.yaml CHANGED
@@ -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: needs_verification
11
- source_url: https://emerge.ucsd.edu/r_4dsm5/body-appreciation-scale-2/
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: pending_pi_decision
20
- notes: Reviewer could not reach the recorded source URL and checked wording against the publisher PDF;
21
- her note adds that BAS-2 has no reverse-scored items and is scored by averaging all 10. A working
22
- source link is still needed before this can be called verified.
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.
packages/construct_library/constructs/cage_questionnaire_v2.yaml CHANGED
@@ -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: needs_verification
11
- source_url: https://www.hopkinsmedicine.org/-/media/medicine/documents/cage-substance-screening-tool.pdf
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: pending_pi_decision
21
- notes: Citation is correct but the recorded source URL is no longer accessible. The reviewer's wording
22
- correction ('ought to' -> 'should') is applied; a working source link is still needed before this
23
- can be called verified.
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?
packages/construct_library/constructs/cbi_work_related_burnout.yaml CHANGED
@@ -1,4 +1,5 @@
1
- # Construct: versioned, append-only. Edits create a NEW version (see registries rule).
 
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: needs_verification
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: pending_pi_decision
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?
packages/construct_library/constructs/cbi_work_related_burnout_v2.yaml ADDED
@@ -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
packages/construct_library/constructs/mfq_care.yaml CHANGED
@@ -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. JPSP, 101(2).
10
  verification_status: verified
11
  review:
12
  reviewer: Noor Skhiri
13
  date: '2026-08-25'
14
  outcome: verified
15
- notes: Reviewer flagged the missing source_url (the sheet shipped without one for this construct). Source
16
- added and all 4 items confirmed verbatim against the published MFQ30. The construct uses a subset
17
- of the foundation's items, which the reviewer confirmed as correctly grouped.
18
- source_url: https://moralfoundations.org/wp-content/uploads/files/MFQ30.doc
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.
packages/construct_library/constructs/mfq_fairness.yaml CHANGED
@@ -1,4 +1,5 @@
1
- # Construct: versioned, append-only. Edits create a NEW version (see registries rule).
 
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: verified
11
  review:
12
  reviewer: Noor Skhiri
13
  date: '2026-08-25'
14
- outcome: verified
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
packages/construct_library/constructs/mfq_fairness_v2.yaml ADDED
@@ -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
packages/construct_library/constructs/rses_v2.yaml CHANGED
@@ -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: needs_verification
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: pending_pi_decision
19
- notes: 'Reviewer maps stored items 1,2,3,6,7,9,10 to source item numbers 7,10,2,9,1,3,6: the item ORDER
20
- does not match the source. Reverse-scoring corrections are applied; the reordering is not, because
21
- order feeds item_hash and the sim_item_N export columns. Pending a decision.'
22
  items:
23
  - item_id: rses_1
24
- text: On the whole, I am satisfied with myself.
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 certainly feel useless at times.
40
- reverse_scored: true
41
  - item_id: rses_7
42
- text: I feel that I'm a person of worth, at least on an equal plane with others.
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: All in all, I am inclined to feel that I am a failure.
49
  reverse_scored: true
50
  - item_id: rses_10
51
- text: I take a positive attitude toward myself.
52
- reverse_scored: false
 
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
packages/construct_library/constructs/team_psychological_safety_scale.yaml CHANGED
@@ -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: needs_verification
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: pending_pi_decision
20
- notes: Reviewer proposed 'It is safe to take a risk in this team' from a third-party questionnaire (novopsych
21
- TPS-7). The cited source, Edmondson (1999), reads 'It is safe to take a risk on this team' - the wording
22
- already stored here. Kept as published; the two sources disagree and the citation should decide.
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.