@intellectif/lk-core 0.17.0 → 0.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,3 +1,3 @@
1
- import './activity-BmjBjXVJ.cjs';
2
- export { A as AiPermissionsSchema, B as BlankConfigSchema, D as DictationDataSchema, a as DictationEquivalenceSchema, b as DictationSlowMediaSchema, c as DictationToleranceSchema, F as FeedbackSchema, d as FillInTheBlanksDataSchema, G as GapSelectBankSchema, e as GapSelectChoiceSchema, f as GapSelectDataSchema, g as GapSelectGapSchema, h as ItemGroupSchema, M as MediaPlaybackSchema, j as MediaSchema, l as MediaTimelineSchema, m as MediaTrackSchema, n as MediaUrlSchema, o as MultipleChoiceDataSchema, p as MultipleChoiceOptionMediaSchema, q as MultipleChoiceOptionSchema, N as NativeControlHintSchema, R as ReadAloudDataSchema, r as ReadAloudSlowMediaSchema, s as RedactedActivity, t as RedactedBlankConfig, u as RedactedBlankConfigSchema, v as RedactedDictationData, w as RedactedDictationDataSchema, x as RedactedDictationSlowMedia, y as RedactedDictationSlowMediaSchema, z as RedactedFillInTheBlanksData, C as RedactedFillInTheBlanksDataSchema, E as RedactedGapSelectBank, H as RedactedGapSelectBankSchema, J as RedactedGapSelectChoice, K as RedactedGapSelectChoiceSchema, L as RedactedGapSelectData, O as RedactedGapSelectDataSchema, P as RedactedGapSelectGap, Q as RedactedGapSelectGapSchema, S as RedactedItemGroupSchema, T as RedactedMediaSchema, U as RedactedMultipleChoiceData, V as RedactedMultipleChoiceDataSchema, W as RedactedMultipleChoiceOption, X as RedactedMultipleChoiceOptionMedia, Y as RedactedMultipleChoiceOptionMediaSchema, Z as RedactedMultipleChoiceOptionSchema, _ as RedactedReadAloudData, $ as RedactedReadAloudDataSchema, a0 as RedactedStimulus, a1 as RedactedStimulusSchema, a2 as RedactedWrittenResponseData, a3 as RedactedWrittenResponseDataSchema, a9 as StimulusSchema, aa as TextMatchPolicySchema, ac as TimelineChapterSchema, ae as TimelineCueSchema, af as WrittenResponseDataSchema, ag as WrittenResponseRubricCriterionSchema, ah as WrittenResponseRubricSchema, ai as dictationJsonSchema, aj as fillInTheBlanksJsonSchema, ak as gapSelectJsonSchema, al as itemGroupJsonSchema, am as jsonSchemaFor, an as multipleChoiceJsonSchema, ao as readAloudJsonSchema, ap as stimulusJsonSchema, aq as validateActivity, ar as validateItemGroup, as as writtenResponseJsonSchema } from './index-CvfeD_cU.cjs';
1
+ import './activity-HH8dxN1v.cjs';
2
+ export { A as AiPermissionsSchema, B as BlankConfigSchema, D as DictationDataSchema, a as DictationEquivalenceSchema, b as DictationSlowMediaSchema, c as DictationToleranceSchema, F as FeedbackSchema, d as FillInTheBlanksDataSchema, G as GapSelectBankSchema, e as GapSelectChoiceSchema, f as GapSelectDataSchema, g as GapSelectGapSchema, h as ItemGroupSchema, M as MediaPlaybackSchema, j as MediaSchema, l as MediaTimelineSchema, m as MediaTrackSchema, n as MediaUrlSchema, o as MultipleChoiceDataSchema, p as MultipleChoiceOptionMediaSchema, q as MultipleChoiceOptionSchema, N as NativeControlHintSchema, R as ReadAloudDataSchema, r as ReadAloudSlowMediaSchema, s as RedactedActivity, t as RedactedBlankConfig, u as RedactedBlankConfigSchema, v as RedactedDictationData, w as RedactedDictationDataSchema, x as RedactedDictationSlowMedia, y as RedactedDictationSlowMediaSchema, z as RedactedFillInTheBlanksData, C as RedactedFillInTheBlanksDataSchema, E as RedactedGapSelectBank, H as RedactedGapSelectBankSchema, J as RedactedGapSelectChoice, K as RedactedGapSelectChoiceSchema, L as RedactedGapSelectData, O as RedactedGapSelectDataSchema, P as RedactedGapSelectGap, Q as RedactedGapSelectGapSchema, S as RedactedItemGroupSchema, T as RedactedMediaSchema, U as RedactedMultipleChoiceData, V as RedactedMultipleChoiceDataSchema, W as RedactedMultipleChoiceOption, X as RedactedMultipleChoiceOptionMedia, Y as RedactedMultipleChoiceOptionMediaSchema, Z as RedactedMultipleChoiceOptionSchema, _ as RedactedReadAloudData, $ as RedactedReadAloudDataSchema, a0 as RedactedStimulus, a1 as RedactedStimulusSchema, a2 as RedactedWrittenResponseData, a3 as RedactedWrittenResponseDataSchema, a9 as StimulusSchema, aa as TextMatchPolicySchema, ac as TimelineChapterSchema, ae as TimelineCueSchema, af as WrittenResponseDataSchema, ag as WrittenResponseRubricCriterionSchema, ah as WrittenResponseRubricSchema, ai as dictationJsonSchema, aj as fillInTheBlanksJsonSchema, ak as gapSelectJsonSchema, al as itemGroupJsonSchema, am as jsonSchemaFor, an as multipleChoiceJsonSchema, ao as readAloudJsonSchema, ap as stimulusJsonSchema, aq as validateActivity, ar as validateItemGroup, as as writtenResponseJsonSchema } from './index-DejnxQpK.cjs';
3
3
  import 'zod/v4';
package/dist/schemas.d.ts CHANGED
@@ -1,3 +1,3 @@
1
- import './activity-BmjBjXVJ.js';
2
- export { A as AiPermissionsSchema, B as BlankConfigSchema, D as DictationDataSchema, a as DictationEquivalenceSchema, b as DictationSlowMediaSchema, c as DictationToleranceSchema, F as FeedbackSchema, d as FillInTheBlanksDataSchema, G as GapSelectBankSchema, e as GapSelectChoiceSchema, f as GapSelectDataSchema, g as GapSelectGapSchema, h as ItemGroupSchema, M as MediaPlaybackSchema, j as MediaSchema, l as MediaTimelineSchema, m as MediaTrackSchema, n as MediaUrlSchema, o as MultipleChoiceDataSchema, p as MultipleChoiceOptionMediaSchema, q as MultipleChoiceOptionSchema, N as NativeControlHintSchema, R as ReadAloudDataSchema, r as ReadAloudSlowMediaSchema, s as RedactedActivity, t as RedactedBlankConfig, u as RedactedBlankConfigSchema, v as RedactedDictationData, w as RedactedDictationDataSchema, x as RedactedDictationSlowMedia, y as RedactedDictationSlowMediaSchema, z as RedactedFillInTheBlanksData, C as RedactedFillInTheBlanksDataSchema, E as RedactedGapSelectBank, H as RedactedGapSelectBankSchema, J as RedactedGapSelectChoice, K as RedactedGapSelectChoiceSchema, L as RedactedGapSelectData, O as RedactedGapSelectDataSchema, P as RedactedGapSelectGap, Q as RedactedGapSelectGapSchema, S as RedactedItemGroupSchema, T as RedactedMediaSchema, U as RedactedMultipleChoiceData, V as RedactedMultipleChoiceDataSchema, W as RedactedMultipleChoiceOption, X as RedactedMultipleChoiceOptionMedia, Y as RedactedMultipleChoiceOptionMediaSchema, Z as RedactedMultipleChoiceOptionSchema, _ as RedactedReadAloudData, $ as RedactedReadAloudDataSchema, a0 as RedactedStimulus, a1 as RedactedStimulusSchema, a2 as RedactedWrittenResponseData, a3 as RedactedWrittenResponseDataSchema, a9 as StimulusSchema, aa as TextMatchPolicySchema, ac as TimelineChapterSchema, ae as TimelineCueSchema, af as WrittenResponseDataSchema, ag as WrittenResponseRubricCriterionSchema, ah as WrittenResponseRubricSchema, ai as dictationJsonSchema, aj as fillInTheBlanksJsonSchema, ak as gapSelectJsonSchema, al as itemGroupJsonSchema, am as jsonSchemaFor, an as multipleChoiceJsonSchema, ao as readAloudJsonSchema, ap as stimulusJsonSchema, aq as validateActivity, ar as validateItemGroup, as as writtenResponseJsonSchema } from './index-G_KusUcK.js';
1
+ import './activity-HH8dxN1v.js';
2
+ export { A as AiPermissionsSchema, B as BlankConfigSchema, D as DictationDataSchema, a as DictationEquivalenceSchema, b as DictationSlowMediaSchema, c as DictationToleranceSchema, F as FeedbackSchema, d as FillInTheBlanksDataSchema, G as GapSelectBankSchema, e as GapSelectChoiceSchema, f as GapSelectDataSchema, g as GapSelectGapSchema, h as ItemGroupSchema, M as MediaPlaybackSchema, j as MediaSchema, l as MediaTimelineSchema, m as MediaTrackSchema, n as MediaUrlSchema, o as MultipleChoiceDataSchema, p as MultipleChoiceOptionMediaSchema, q as MultipleChoiceOptionSchema, N as NativeControlHintSchema, R as ReadAloudDataSchema, r as ReadAloudSlowMediaSchema, s as RedactedActivity, t as RedactedBlankConfig, u as RedactedBlankConfigSchema, v as RedactedDictationData, w as RedactedDictationDataSchema, x as RedactedDictationSlowMedia, y as RedactedDictationSlowMediaSchema, z as RedactedFillInTheBlanksData, C as RedactedFillInTheBlanksDataSchema, E as RedactedGapSelectBank, H as RedactedGapSelectBankSchema, J as RedactedGapSelectChoice, K as RedactedGapSelectChoiceSchema, L as RedactedGapSelectData, O as RedactedGapSelectDataSchema, P as RedactedGapSelectGap, Q as RedactedGapSelectGapSchema, S as RedactedItemGroupSchema, T as RedactedMediaSchema, U as RedactedMultipleChoiceData, V as RedactedMultipleChoiceDataSchema, W as RedactedMultipleChoiceOption, X as RedactedMultipleChoiceOptionMedia, Y as RedactedMultipleChoiceOptionMediaSchema, Z as RedactedMultipleChoiceOptionSchema, _ as RedactedReadAloudData, $ as RedactedReadAloudDataSchema, a0 as RedactedStimulus, a1 as RedactedStimulusSchema, a2 as RedactedWrittenResponseData, a3 as RedactedWrittenResponseDataSchema, a9 as StimulusSchema, aa as TextMatchPolicySchema, ac as TimelineChapterSchema, ae as TimelineCueSchema, af as WrittenResponseDataSchema, ag as WrittenResponseRubricCriterionSchema, ah as WrittenResponseRubricSchema, ai as dictationJsonSchema, aj as fillInTheBlanksJsonSchema, ak as gapSelectJsonSchema, al as itemGroupJsonSchema, am as jsonSchemaFor, an as multipleChoiceJsonSchema, ao as readAloudJsonSchema, ap as stimulusJsonSchema, aq as validateActivity, ar as validateItemGroup, as as writtenResponseJsonSchema } from './index-BrBBUb1i.js';
3
3
  import 'zod/v4';
package/dist/scoring.cjs CHANGED
@@ -13,7 +13,7 @@
13
13
 
14
14
 
15
15
 
16
- var _chunkXNMKDFPWcjs = require('./chunk-XNMKDFPW.cjs');
16
+ var _chunkCOBK2RUXcjs = require('./chunk-COBK2RUX.cjs');
17
17
 
18
18
 
19
19
 
@@ -59,5 +59,5 @@ var _chunkD4TOPSHVcjs = require('./chunk-D4TOPSHV.cjs');
59
59
 
60
60
 
61
61
 
62
- exports.DEFAULT_PASS_THRESHOLD = _chunkXNMKDFPWcjs.DEFAULT_PASS_THRESHOLD; exports.DICTATION_MAX_ACCEPTED_TRANSCRIPTS = _chunkD4TOPSHVcjs.DICTATION_MAX_ACCEPTED_TRANSCRIPTS; exports.DICTATION_MAX_EQUIVALENCES = _chunkD4TOPSHVcjs.DICTATION_MAX_EQUIVALENCES; exports.DICTATION_MAX_EQUIVALENCE_LENGTH = _chunkD4TOPSHVcjs.DICTATION_MAX_EQUIVALENCE_LENGTH; exports.DICTATION_MAX_TEXT_LENGTH = _chunkD4TOPSHVcjs.DICTATION_MAX_TEXT_LENGTH; exports.DICTATION_MAX_TRANSCRIPT_LENGTH = _chunkD4TOPSHVcjs.DICTATION_MAX_TRANSCRIPT_LENGTH; exports.READ_ALOUD_MAX_DIMENSION_WEIGHT = _chunkD4TOPSHVcjs.READ_ALOUD_MAX_DIMENSION_WEIGHT; exports.READ_ALOUD_MAX_REFERENCE_LENGTH = _chunkD4TOPSHVcjs.READ_ALOUD_MAX_REFERENCE_LENGTH; exports.READ_ALOUD_MAX_SECONDS = _chunkD4TOPSHVcjs.READ_ALOUD_MAX_SECONDS; exports.READ_ALOUD_MAX_TAKES = _chunkD4TOPSHVcjs.READ_ALOUD_MAX_TAKES; exports.SPEECH_ASSESSMENT_MAX_WORDS = _chunkD4TOPSHVcjs.SPEECH_ASSESSMENT_MAX_WORDS; exports.alignDictation = _chunkD4TOPSHVcjs.alignDictation; exports.alignReadAloud = _chunkXNMKDFPWcjs.alignReadAloud; exports.classifyBand = _chunkXNMKDFPWcjs.classifyBand; exports.composeAssessmentScore = _chunkXNMKDFPWcjs.composeAssessmentScore; exports.computePassThreshold = _chunkXNMKDFPWcjs.computePassThreshold; exports.dictationReferenceWords = _chunkD4TOPSHVcjs.dictationReferenceWords; exports.diffDictationChars = _chunkXNMKDFPWcjs.diffDictationChars; exports.evaluate = _chunkXNMKDFPWcjs.evaluate; exports.gradeReadAloud = _chunkXNMKDFPWcjs.gradeReadAloud; exports.gte = _chunkXNMKDFPWcjs.gte; exports.inspectWav = _chunkXNMKDFPWcjs.inspectWav; exports.levenshteinDistance = _chunkD4TOPSHVcjs.levenshteinDistance; exports.matchText = _chunkD4TOPSHVcjs.matchText; exports.outcomeFromUnscorable = _chunkXNMKDFPWcjs.outcomeFromUnscorable; exports.roundGrade = _chunkXNMKDFPWcjs.roundGrade; exports.score = _chunkXNMKDFPWcjs.score; exports.validateSpeechAssessment = _chunkXNMKDFPWcjs.validateSpeechAssessment;
62
+ exports.DEFAULT_PASS_THRESHOLD = _chunkCOBK2RUXcjs.DEFAULT_PASS_THRESHOLD; exports.DICTATION_MAX_ACCEPTED_TRANSCRIPTS = _chunkD4TOPSHVcjs.DICTATION_MAX_ACCEPTED_TRANSCRIPTS; exports.DICTATION_MAX_EQUIVALENCES = _chunkD4TOPSHVcjs.DICTATION_MAX_EQUIVALENCES; exports.DICTATION_MAX_EQUIVALENCE_LENGTH = _chunkD4TOPSHVcjs.DICTATION_MAX_EQUIVALENCE_LENGTH; exports.DICTATION_MAX_TEXT_LENGTH = _chunkD4TOPSHVcjs.DICTATION_MAX_TEXT_LENGTH; exports.DICTATION_MAX_TRANSCRIPT_LENGTH = _chunkD4TOPSHVcjs.DICTATION_MAX_TRANSCRIPT_LENGTH; exports.READ_ALOUD_MAX_DIMENSION_WEIGHT = _chunkD4TOPSHVcjs.READ_ALOUD_MAX_DIMENSION_WEIGHT; exports.READ_ALOUD_MAX_REFERENCE_LENGTH = _chunkD4TOPSHVcjs.READ_ALOUD_MAX_REFERENCE_LENGTH; exports.READ_ALOUD_MAX_SECONDS = _chunkD4TOPSHVcjs.READ_ALOUD_MAX_SECONDS; exports.READ_ALOUD_MAX_TAKES = _chunkD4TOPSHVcjs.READ_ALOUD_MAX_TAKES; exports.SPEECH_ASSESSMENT_MAX_WORDS = _chunkD4TOPSHVcjs.SPEECH_ASSESSMENT_MAX_WORDS; exports.alignDictation = _chunkD4TOPSHVcjs.alignDictation; exports.alignReadAloud = _chunkCOBK2RUXcjs.alignReadAloud; exports.classifyBand = _chunkCOBK2RUXcjs.classifyBand; exports.composeAssessmentScore = _chunkCOBK2RUXcjs.composeAssessmentScore; exports.computePassThreshold = _chunkCOBK2RUXcjs.computePassThreshold; exports.dictationReferenceWords = _chunkD4TOPSHVcjs.dictationReferenceWords; exports.diffDictationChars = _chunkCOBK2RUXcjs.diffDictationChars; exports.evaluate = _chunkCOBK2RUXcjs.evaluate; exports.gradeReadAloud = _chunkCOBK2RUXcjs.gradeReadAloud; exports.gte = _chunkCOBK2RUXcjs.gte; exports.inspectWav = _chunkCOBK2RUXcjs.inspectWav; exports.levenshteinDistance = _chunkD4TOPSHVcjs.levenshteinDistance; exports.matchText = _chunkD4TOPSHVcjs.matchText; exports.outcomeFromUnscorable = _chunkCOBK2RUXcjs.outcomeFromUnscorable; exports.roundGrade = _chunkCOBK2RUXcjs.roundGrade; exports.score = _chunkCOBK2RUXcjs.score; exports.validateSpeechAssessment = _chunkCOBK2RUXcjs.validateSpeechAssessment;
63
63
  //# sourceMappingURL=scoring.cjs.map
@@ -1,5 +1,5 @@
1
- import { Y as ItemOutcome, R as Grader, E as DictationData, a as ActivityData, a6 as ReadAloudData, aj as ValidationResult, a9 as ReadAloudLearnerResponse, Q as GradeRecord, Z as LearnerResponse, f as ActivityType, af as ScoringResult } from './activity-BmjBjXVJ.cjs';
2
- export { ac as RecordingRef, ag as TextMatchPolicy, ah as TextMatchResult, ay as levenshteinDistance, az as matchText } from './activity-BmjBjXVJ.cjs';
1
+ import { Y as ItemOutcome, R as Grader, E as DictationData, a as ActivityData, a6 as ReadAloudData, aj as ValidationResult, a9 as ReadAloudLearnerResponse, Q as GradeRecord, Z as LearnerResponse, f as ActivityType, af as ScoringResult } from './activity-HH8dxN1v.cjs';
2
+ export { ac as RecordingRef, ag as TextMatchPolicy, ah as TextMatchResult, ay as levenshteinDistance, az as matchText } from './activity-HH8dxN1v.cjs';
3
3
 
4
4
  /**
5
5
  * Rounding for assessment scores.
@@ -144,8 +144,13 @@ interface SectionScore {
144
144
  passed: boolean;
145
145
  /** Threshold this section was judged against, after any override. */
146
146
  appliedThreshold: number | null;
147
- /** Slots still awaiting a grade. */
147
+ /**
148
+ * Slots still awaiting a grade — including any in {@link rejectedSlotIds},
149
+ * whose grade came back unusable and is still owed.
150
+ */
148
151
  pendingSlotIds: string[];
152
+ /** See {@link AssessmentScore.rejectedSlotIds}; this section's share of them. */
153
+ rejectedSlotIds?: string[];
149
154
  /** Slots that can never be graded, excluded from the denominator. */
150
155
  unscorableSlotIds: string[];
151
156
  }
@@ -169,10 +174,31 @@ interface AssessmentScore {
169
174
  * `provisional` while any item is still awaiting a grade — the total is
170
175
  * computed over what HAS been graded, so it can still move. Do not record a
171
176
  * provisional score as final. Items that can NEVER be graded
172
- * (`unscorableSlotIds`) do not hold the result provisional.
177
+ * (`unscorableSlotIds`) do not hold the result provisional; items whose
178
+ * grade was rejected (`rejectedSlotIds`) do.
173
179
  */
174
180
  status: 'final' | 'provisional';
181
+ /**
182
+ * Slots still awaiting a grade, excluded from the denominator. `status` is
183
+ * `provisional` exactly when this is not empty. Includes every slot in
184
+ * {@link rejectedSlotIds}.
185
+ */
175
186
  pendingSlotIds: string[];
187
+ /**
188
+ * Slots whose outcome claimed a grade that cannot be one: a `score` or
189
+ * `maxScore` that is not a finite number, a `maxScore` of 0 or less, or a
190
+ * score below 0 or above its `maxScore` (beyond float noise of one part in a
191
+ * billion) — and deferred outcomes `outcomeFromGrade` returned for such a
192
+ * record (`reason: 'grade_rejected'`). Each is also in
193
+ * {@link pendingSlotIds}: its real grade is still owed, so it holds the
194
+ * result `provisional` with `passed: null` rather than being counted (NaN or
195
+ * 4300% on the record) or dropped (a failing grade vanishing into a final
196
+ * pass). Re-grade these slots; waiting will not fix them.
197
+ *
198
+ * Present only when at least one slot was rejected, so a result without one
199
+ * is exactly what earlier versions returned.
200
+ */
201
+ rejectedSlotIds?: string[];
176
202
  /** Slots that can never be graded. Excluded from the denominator. */
177
203
  unscorableSlotIds: string[];
178
204
  }
@@ -184,7 +210,9 @@ interface AssessmentScore {
184
210
  * comparison, so the number a learner is shown is the number that decides the
185
211
  * outcome. Items still awaiting a grade are excluded from the denominator
186
212
  * rather than counted as zero, and the result is reported as `provisional`
187
- * until every item has a grade.
213
+ * until every item has a grade. An outcome whose score cannot be a grade out of
214
+ * its `maxScore` is not a grade either: it is held the same way and named in
215
+ * `rejectedSlotIds`.
188
216
  */
189
217
  declare function composeAssessmentScore(sections: readonly AssessmentSectionInput[], policy: CompositionPolicy): AssessmentScore;
190
218
 
package/dist/scoring.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { Y as ItemOutcome, R as Grader, E as DictationData, a as ActivityData, a6 as ReadAloudData, aj as ValidationResult, a9 as ReadAloudLearnerResponse, Q as GradeRecord, Z as LearnerResponse, f as ActivityType, af as ScoringResult } from './activity-BmjBjXVJ.js';
2
- export { ac as RecordingRef, ag as TextMatchPolicy, ah as TextMatchResult, ay as levenshteinDistance, az as matchText } from './activity-BmjBjXVJ.js';
1
+ import { Y as ItemOutcome, R as Grader, E as DictationData, a as ActivityData, a6 as ReadAloudData, aj as ValidationResult, a9 as ReadAloudLearnerResponse, Q as GradeRecord, Z as LearnerResponse, f as ActivityType, af as ScoringResult } from './activity-HH8dxN1v.js';
2
+ export { ac as RecordingRef, ag as TextMatchPolicy, ah as TextMatchResult, ay as levenshteinDistance, az as matchText } from './activity-HH8dxN1v.js';
3
3
 
4
4
  /**
5
5
  * Rounding for assessment scores.
@@ -144,8 +144,13 @@ interface SectionScore {
144
144
  passed: boolean;
145
145
  /** Threshold this section was judged against, after any override. */
146
146
  appliedThreshold: number | null;
147
- /** Slots still awaiting a grade. */
147
+ /**
148
+ * Slots still awaiting a grade — including any in {@link rejectedSlotIds},
149
+ * whose grade came back unusable and is still owed.
150
+ */
148
151
  pendingSlotIds: string[];
152
+ /** See {@link AssessmentScore.rejectedSlotIds}; this section's share of them. */
153
+ rejectedSlotIds?: string[];
149
154
  /** Slots that can never be graded, excluded from the denominator. */
150
155
  unscorableSlotIds: string[];
151
156
  }
@@ -169,10 +174,31 @@ interface AssessmentScore {
169
174
  * `provisional` while any item is still awaiting a grade — the total is
170
175
  * computed over what HAS been graded, so it can still move. Do not record a
171
176
  * provisional score as final. Items that can NEVER be graded
172
- * (`unscorableSlotIds`) do not hold the result provisional.
177
+ * (`unscorableSlotIds`) do not hold the result provisional; items whose
178
+ * grade was rejected (`rejectedSlotIds`) do.
173
179
  */
174
180
  status: 'final' | 'provisional';
181
+ /**
182
+ * Slots still awaiting a grade, excluded from the denominator. `status` is
183
+ * `provisional` exactly when this is not empty. Includes every slot in
184
+ * {@link rejectedSlotIds}.
185
+ */
175
186
  pendingSlotIds: string[];
187
+ /**
188
+ * Slots whose outcome claimed a grade that cannot be one: a `score` or
189
+ * `maxScore` that is not a finite number, a `maxScore` of 0 or less, or a
190
+ * score below 0 or above its `maxScore` (beyond float noise of one part in a
191
+ * billion) — and deferred outcomes `outcomeFromGrade` returned for such a
192
+ * record (`reason: 'grade_rejected'`). Each is also in
193
+ * {@link pendingSlotIds}: its real grade is still owed, so it holds the
194
+ * result `provisional` with `passed: null` rather than being counted (NaN or
195
+ * 4300% on the record) or dropped (a failing grade vanishing into a final
196
+ * pass). Re-grade these slots; waiting will not fix them.
197
+ *
198
+ * Present only when at least one slot was rejected, so a result without one
199
+ * is exactly what earlier versions returned.
200
+ */
201
+ rejectedSlotIds?: string[];
176
202
  /** Slots that can never be graded. Excluded from the denominator. */
177
203
  unscorableSlotIds: string[];
178
204
  }
@@ -184,7 +210,9 @@ interface AssessmentScore {
184
210
  * comparison, so the number a learner is shown is the number that decides the
185
211
  * outcome. Items still awaiting a grade are excluded from the denominator
186
212
  * rather than counted as zero, and the result is reported as `provisional`
187
- * until every item has a grade.
213
+ * until every item has a grade. An outcome whose score cannot be a grade out of
214
+ * its `maxScore` is not a grade either: it is held the same way and named in
215
+ * `rejectedSlotIds`.
188
216
  */
189
217
  declare function composeAssessmentScore(sections: readonly AssessmentSectionInput[], policy: CompositionPolicy): AssessmentScore;
190
218
 
package/dist/scoring.js CHANGED
@@ -13,7 +13,7 @@ import {
13
13
  roundGrade,
14
14
  score,
15
15
  validateSpeechAssessment
16
- } from "./chunk-WXS5EB65.js";
16
+ } from "./chunk-MMEQKFFQ.js";
17
17
  import {
18
18
  DICTATION_MAX_ACCEPTED_TRANSCRIPTS,
19
19
  DICTATION_MAX_EQUIVALENCES,
package/dist/xapi.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- import { ao as XAPIActor, af as ScoringResult, aq as XAPIContext, au as XAPIResult, aw as XAPIStatement } from './activity-BmjBjXVJ.cjs';
1
+ import { ao as XAPIActor, af as ScoringResult, aq as XAPIContext, au as XAPIResult, aw as XAPIStatement } from './activity-HH8dxN1v.cjs';
2
2
 
3
3
  /**
4
4
  * The set of xAPI verbs emitted by SDK activities, keyed by a stable
package/dist/xapi.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { ao as XAPIActor, af as ScoringResult, aq as XAPIContext, au as XAPIResult, aw as XAPIStatement } from './activity-BmjBjXVJ.js';
1
+ import { ao as XAPIActor, af as ScoringResult, aq as XAPIContext, au as XAPIResult, aw as XAPIStatement } from './activity-HH8dxN1v.js';
2
2
 
3
3
  /**
4
4
  * The set of xAPI verbs emitted by SDK activities, keyed by a stable
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@intellectif/lk-core",
3
- "version": "0.17.0",
3
+ "version": "0.18.0",
4
4
  "description": "Framework-free assessment core: Zod activity schemas, pure scoring, rubric & deferred grading, weighted assessment composition, exam attempt plans, and xAPI 1.0.3.",
5
5
  "keywords": [
6
6
  "assessment",
package/vectors/README.md CHANGED
@@ -70,8 +70,12 @@ a known hazard carry a `note` saying why they exist.
70
70
  edges, negative zero, half-even ties and near-ties, and bands that share a
71
71
  minimum.
72
72
  - **`countWords`**, **`seededShuffle`** in both versions, **`gradeFromRubric`**
73
- including its unscorable paths, its opt-in `rounding` option on each of the
74
- three ways a pass is decided, and **`outcomeFromGrade`**.
73
+ including its unscorable paths (a negative weight and an overflowing weight
74
+ sum among them), its opt-in `rounding` option on each of the three ways a pass
75
+ is decided, and **`outcomeFromGrade`**: a record lifted as a grade, and each
76
+ kind of record it refuses as `grade_rejected` — `NaN`, `Infinity`, a negative,
77
+ raw points against `maxScore` 1, a numeric string, a `maxScore` of 0 or less
78
+ or not finite — beside the float noise it accepts, up to the exact edge.
75
79
  - **`gradeReadAloud`**: every reason a pronunciation assessment is refused
76
80
  rather than scored — each `unscorable` code — the weighted total over the
77
81
  authored dimensions, a blank take, a dimension scored `0` against one that was
@@ -97,7 +101,9 @@ a known hazard carry a `note` saying why they exist.
97
101
  are reported unread instead of guessed at.
98
102
  - **`scoredItemsFromPlan`**, which decides what a stored paper's denominator is
99
103
  when an outcome is missing, and **`composeAssessmentScore`** across weights,
100
- points, provisional and unscorable items, and section thresholds.
104
+ points, provisional, rejected and unscorable items, and section thresholds —
105
+ including the outcomes earlier releases stored for a grade that was never
106
+ one, which now hold a result provisional instead of finalising it.
101
107
 
102
108
  ## What it does not cover
103
109