@vue-skuilder/db 0.2.16 → 0.2.17
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.
- package/dist/core/index.d.cts +48 -1
- package/dist/core/index.d.ts +48 -1
- package/dist/core/index.js +112 -6
- package/dist/core/index.js.map +1 -1
- package/dist/core/index.mjs +109 -6
- package/dist/core/index.mjs.map +1 -1
- package/dist/impl/couch/index.js +106 -6
- package/dist/impl/couch/index.js.map +1 -1
- package/dist/impl/couch/index.mjs +106 -6
- package/dist/impl/couch/index.mjs.map +1 -1
- package/dist/impl/static/index.js +106 -6
- package/dist/impl/static/index.js.map +1 -1
- package/dist/impl/static/index.mjs +106 -6
- package/dist/impl/static/index.mjs.map +1 -1
- package/dist/index.d.cts +5 -3
- package/dist/index.d.ts +5 -3
- package/dist/index.js +174 -7
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +171 -7
- package/dist/index.mjs.map +1 -1
- package/package.json +3 -3
- package/src/core/navigators/StrategyPressureDebugger.ts +76 -0
- package/src/core/navigators/generators/prescribed.ts +122 -7
- package/src/core/navigators/index.ts +12 -0
- package/src/study/SessionController.ts +7 -1
- package/src/study/SessionDebugger.ts +2 -0
- package/src/study/SessionOverlay.ts +113 -0
package/dist/core/index.d.cts
CHANGED
|
@@ -37,6 +37,53 @@ declare function getSrsBacklogDebug(): SrsBacklogDebug[];
|
|
|
37
37
|
/** Drop all captured snapshots (called on session start, alongside pipeline history). */
|
|
38
38
|
declare function clearSrsBacklogDebug(): void;
|
|
39
39
|
|
|
40
|
+
/**
|
|
41
|
+
* A single named pressure reading. The common shape across strategies: a
|
|
42
|
+
* multiplier that climbs under some accumulated condition (staleness, debt,
|
|
43
|
+
* blockage), optionally clamped at a cap.
|
|
44
|
+
*/
|
|
45
|
+
interface PressureGaugeDebug {
|
|
46
|
+
/** Stable identifier within the source (e.g. 'group:intro-core:target'). */
|
|
47
|
+
id: string;
|
|
48
|
+
/** Short display label (e.g. 'intro-core targets'). */
|
|
49
|
+
label: string;
|
|
50
|
+
/** Current pressure multiplier (×1.0 = no pressure). */
|
|
51
|
+
multiplier: number;
|
|
52
|
+
/** Clamp ceiling, if the multiplier is capped. Omit for unbounded. */
|
|
53
|
+
max?: number;
|
|
54
|
+
/** One-line context for the reading (counts, mode, staleness). */
|
|
55
|
+
detail?: string;
|
|
56
|
+
/** Expandable rows (blocked target ids, per-tag debt ages, ...). */
|
|
57
|
+
items?: Array<{
|
|
58
|
+
label: string;
|
|
59
|
+
value?: string;
|
|
60
|
+
}>;
|
|
61
|
+
}
|
|
62
|
+
/** One strategy's pressure snapshot for one course, captured once per run. */
|
|
63
|
+
interface StrategyPressureDebug {
|
|
64
|
+
/** Producer identity — implementingClass name (e.g. 'prescribed'). */
|
|
65
|
+
source: string;
|
|
66
|
+
courseId: string;
|
|
67
|
+
gauges: PressureGaugeDebug[];
|
|
68
|
+
/**
|
|
69
|
+
* Highest score this strategy emitted into the candidate pool this run;
|
|
70
|
+
* null if it emitted nothing. Compare against the supplyQ head score to
|
|
71
|
+
* read how the pressure is competing for slots (same crossover read as the
|
|
72
|
+
* SRS panel's `top review`).
|
|
73
|
+
*/
|
|
74
|
+
topScore?: number | null;
|
|
75
|
+
/** Label of any one-shot hints emitted alongside the cards this run. */
|
|
76
|
+
hintsLabel?: string;
|
|
77
|
+
/** Epoch ms of capture. */
|
|
78
|
+
timestamp: number;
|
|
79
|
+
}
|
|
80
|
+
/** Called by a strategy once per run. Latest snapshot per (source, course) wins. */
|
|
81
|
+
declare function captureStrategyPressure(snapshot: StrategyPressureDebug): void;
|
|
82
|
+
/** Current pressure snapshot for every source seen, newest-first. */
|
|
83
|
+
declare function getStrategyPressureDebug(): StrategyPressureDebug[];
|
|
84
|
+
/** Drop all captured snapshots (called on session start, alongside pipeline history). */
|
|
85
|
+
declare function clearStrategyPressureDebug(): void;
|
|
86
|
+
|
|
40
87
|
/**
|
|
41
88
|
* Snapshot of the learning state for a strategy.
|
|
42
89
|
*
|
|
@@ -805,4 +852,4 @@ declare const userDBDebugAPI: {
|
|
|
805
852
|
*/
|
|
806
853
|
declare function mountUserDBDebugger(): void;
|
|
807
854
|
|
|
808
|
-
export { type BulkCardProcessorConfig, type CardFilter, type CardFilterFactory, CardHistory, CardRecord, CourseDBInterface, DIVERSITY_FLOOR, DIVERSITY_STRENGTH, type DiversityRerankOptions, DocType, DocTypePrefixes, type FilterContext, type FilterImpact, type GeneratorSummary, type GradientObservation, type GradientResult, type ImportResult, LearnableWeight, Loggable, OrchestrationContext, type PeriodUpdateInput, type PeriodUpdateResult, type PipelineForecaster, type PipelineRunReport, QuestionRecord, ReplanHints, type SignalConfig, type SrsBacklogDebug, StrategyContribution, type StrategyLearningState, type StrategyStateDoc, type StrategyStateId, UserDBInterface, UserOutcomeRecord, WeightedCard, aggregateOutcomesForGradient, areQuestionRecords, buildStrategyStateId, clearSrsBacklogDebug, computeOutcomeSignal, computeStrategyGradient, diversityRerank, docIsDeleted, getActivePipeline, getCardHistoryID, getDefaultLearnableWeight, getSrsBacklogDebug, importParsedCards, isQuestionRecord, mountPipelineDebugger, mountUserDBDebugger, parseCardHistoryID, pipelineDebugAPI, recordUserOutcome, runPeriodUpdate, scoreAccuracyInZone, updateLearningState, updateStrategyWeight, userDBDebugAPI, validateProcessorConfig };
|
|
855
|
+
export { type BulkCardProcessorConfig, type CardFilter, type CardFilterFactory, CardHistory, CardRecord, CourseDBInterface, DIVERSITY_FLOOR, DIVERSITY_STRENGTH, type DiversityRerankOptions, DocType, DocTypePrefixes, type FilterContext, type FilterImpact, type GeneratorSummary, type GradientObservation, type GradientResult, type ImportResult, LearnableWeight, Loggable, OrchestrationContext, type PeriodUpdateInput, type PeriodUpdateResult, type PipelineForecaster, type PipelineRunReport, type PressureGaugeDebug, QuestionRecord, ReplanHints, type SignalConfig, type SrsBacklogDebug, StrategyContribution, type StrategyLearningState, type StrategyPressureDebug, type StrategyStateDoc, type StrategyStateId, UserDBInterface, UserOutcomeRecord, WeightedCard, aggregateOutcomesForGradient, areQuestionRecords, buildStrategyStateId, captureStrategyPressure, clearSrsBacklogDebug, clearStrategyPressureDebug, computeOutcomeSignal, computeStrategyGradient, diversityRerank, docIsDeleted, getActivePipeline, getCardHistoryID, getDefaultLearnableWeight, getSrsBacklogDebug, getStrategyPressureDebug, importParsedCards, isQuestionRecord, mountPipelineDebugger, mountUserDBDebugger, parseCardHistoryID, pipelineDebugAPI, recordUserOutcome, runPeriodUpdate, scoreAccuracyInZone, updateLearningState, updateStrategyWeight, userDBDebugAPI, validateProcessorConfig };
|
package/dist/core/index.d.ts
CHANGED
|
@@ -37,6 +37,53 @@ declare function getSrsBacklogDebug(): SrsBacklogDebug[];
|
|
|
37
37
|
/** Drop all captured snapshots (called on session start, alongside pipeline history). */
|
|
38
38
|
declare function clearSrsBacklogDebug(): void;
|
|
39
39
|
|
|
40
|
+
/**
|
|
41
|
+
* A single named pressure reading. The common shape across strategies: a
|
|
42
|
+
* multiplier that climbs under some accumulated condition (staleness, debt,
|
|
43
|
+
* blockage), optionally clamped at a cap.
|
|
44
|
+
*/
|
|
45
|
+
interface PressureGaugeDebug {
|
|
46
|
+
/** Stable identifier within the source (e.g. 'group:intro-core:target'). */
|
|
47
|
+
id: string;
|
|
48
|
+
/** Short display label (e.g. 'intro-core targets'). */
|
|
49
|
+
label: string;
|
|
50
|
+
/** Current pressure multiplier (×1.0 = no pressure). */
|
|
51
|
+
multiplier: number;
|
|
52
|
+
/** Clamp ceiling, if the multiplier is capped. Omit for unbounded. */
|
|
53
|
+
max?: number;
|
|
54
|
+
/** One-line context for the reading (counts, mode, staleness). */
|
|
55
|
+
detail?: string;
|
|
56
|
+
/** Expandable rows (blocked target ids, per-tag debt ages, ...). */
|
|
57
|
+
items?: Array<{
|
|
58
|
+
label: string;
|
|
59
|
+
value?: string;
|
|
60
|
+
}>;
|
|
61
|
+
}
|
|
62
|
+
/** One strategy's pressure snapshot for one course, captured once per run. */
|
|
63
|
+
interface StrategyPressureDebug {
|
|
64
|
+
/** Producer identity — implementingClass name (e.g. 'prescribed'). */
|
|
65
|
+
source: string;
|
|
66
|
+
courseId: string;
|
|
67
|
+
gauges: PressureGaugeDebug[];
|
|
68
|
+
/**
|
|
69
|
+
* Highest score this strategy emitted into the candidate pool this run;
|
|
70
|
+
* null if it emitted nothing. Compare against the supplyQ head score to
|
|
71
|
+
* read how the pressure is competing for slots (same crossover read as the
|
|
72
|
+
* SRS panel's `top review`).
|
|
73
|
+
*/
|
|
74
|
+
topScore?: number | null;
|
|
75
|
+
/** Label of any one-shot hints emitted alongside the cards this run. */
|
|
76
|
+
hintsLabel?: string;
|
|
77
|
+
/** Epoch ms of capture. */
|
|
78
|
+
timestamp: number;
|
|
79
|
+
}
|
|
80
|
+
/** Called by a strategy once per run. Latest snapshot per (source, course) wins. */
|
|
81
|
+
declare function captureStrategyPressure(snapshot: StrategyPressureDebug): void;
|
|
82
|
+
/** Current pressure snapshot for every source seen, newest-first. */
|
|
83
|
+
declare function getStrategyPressureDebug(): StrategyPressureDebug[];
|
|
84
|
+
/** Drop all captured snapshots (called on session start, alongside pipeline history). */
|
|
85
|
+
declare function clearStrategyPressureDebug(): void;
|
|
86
|
+
|
|
40
87
|
/**
|
|
41
88
|
* Snapshot of the learning state for a strategy.
|
|
42
89
|
*
|
|
@@ -805,4 +852,4 @@ declare const userDBDebugAPI: {
|
|
|
805
852
|
*/
|
|
806
853
|
declare function mountUserDBDebugger(): void;
|
|
807
854
|
|
|
808
|
-
export { type BulkCardProcessorConfig, type CardFilter, type CardFilterFactory, CardHistory, CardRecord, CourseDBInterface, DIVERSITY_FLOOR, DIVERSITY_STRENGTH, type DiversityRerankOptions, DocType, DocTypePrefixes, type FilterContext, type FilterImpact, type GeneratorSummary, type GradientObservation, type GradientResult, type ImportResult, LearnableWeight, Loggable, OrchestrationContext, type PeriodUpdateInput, type PeriodUpdateResult, type PipelineForecaster, type PipelineRunReport, QuestionRecord, ReplanHints, type SignalConfig, type SrsBacklogDebug, StrategyContribution, type StrategyLearningState, type StrategyStateDoc, type StrategyStateId, UserDBInterface, UserOutcomeRecord, WeightedCard, aggregateOutcomesForGradient, areQuestionRecords, buildStrategyStateId, clearSrsBacklogDebug, computeOutcomeSignal, computeStrategyGradient, diversityRerank, docIsDeleted, getActivePipeline, getCardHistoryID, getDefaultLearnableWeight, getSrsBacklogDebug, importParsedCards, isQuestionRecord, mountPipelineDebugger, mountUserDBDebugger, parseCardHistoryID, pipelineDebugAPI, recordUserOutcome, runPeriodUpdate, scoreAccuracyInZone, updateLearningState, updateStrategyWeight, userDBDebugAPI, validateProcessorConfig };
|
|
855
|
+
export { type BulkCardProcessorConfig, type CardFilter, type CardFilterFactory, CardHistory, CardRecord, CourseDBInterface, DIVERSITY_FLOOR, DIVERSITY_STRENGTH, type DiversityRerankOptions, DocType, DocTypePrefixes, type FilterContext, type FilterImpact, type GeneratorSummary, type GradientObservation, type GradientResult, type ImportResult, LearnableWeight, Loggable, OrchestrationContext, type PeriodUpdateInput, type PeriodUpdateResult, type PipelineForecaster, type PipelineRunReport, type PressureGaugeDebug, QuestionRecord, ReplanHints, type SignalConfig, type SrsBacklogDebug, StrategyContribution, type StrategyLearningState, type StrategyPressureDebug, type StrategyStateDoc, type StrategyStateId, UserDBInterface, UserOutcomeRecord, WeightedCard, aggregateOutcomesForGradient, areQuestionRecords, buildStrategyStateId, captureStrategyPressure, clearSrsBacklogDebug, clearStrategyPressureDebug, computeOutcomeSignal, computeStrategyGradient, diversityRerank, docIsDeleted, getActivePipeline, getCardHistoryID, getDefaultLearnableWeight, getSrsBacklogDebug, getStrategyPressureDebug, importParsedCards, isQuestionRecord, mountPipelineDebugger, mountUserDBDebugger, parseCardHistoryID, pipelineDebugAPI, recordUserOutcome, runPeriodUpdate, scoreAccuracyInZone, updateLearningState, updateStrategyWeight, userDBDebugAPI, validateProcessorConfig };
|
package/dist/core/index.js
CHANGED
|
@@ -1667,6 +1667,30 @@ var init_SrsDebugger = __esm({
|
|
|
1667
1667
|
}
|
|
1668
1668
|
});
|
|
1669
1669
|
|
|
1670
|
+
// src/core/navigators/StrategyPressureDebugger.ts
|
|
1671
|
+
var StrategyPressureDebugger_exports = {};
|
|
1672
|
+
__export(StrategyPressureDebugger_exports, {
|
|
1673
|
+
captureStrategyPressure: () => captureStrategyPressure,
|
|
1674
|
+
clearStrategyPressureDebug: () => clearStrategyPressureDebug,
|
|
1675
|
+
getStrategyPressureDebug: () => getStrategyPressureDebug
|
|
1676
|
+
});
|
|
1677
|
+
function captureStrategyPressure(snapshot) {
|
|
1678
|
+
snapshots2.set(`${snapshot.source}:${snapshot.courseId}`, snapshot);
|
|
1679
|
+
}
|
|
1680
|
+
function getStrategyPressureDebug() {
|
|
1681
|
+
return [...snapshots2.values()].sort((a, b) => b.timestamp - a.timestamp);
|
|
1682
|
+
}
|
|
1683
|
+
function clearStrategyPressureDebug() {
|
|
1684
|
+
snapshots2.clear();
|
|
1685
|
+
}
|
|
1686
|
+
var snapshots2;
|
|
1687
|
+
var init_StrategyPressureDebugger = __esm({
|
|
1688
|
+
"src/core/navigators/StrategyPressureDebugger.ts"() {
|
|
1689
|
+
"use strict";
|
|
1690
|
+
snapshots2 = /* @__PURE__ */ new Map();
|
|
1691
|
+
}
|
|
1692
|
+
});
|
|
1693
|
+
|
|
1670
1694
|
// src/core/navigators/generators/CompositeGenerator.ts
|
|
1671
1695
|
var CompositeGenerator_exports = {};
|
|
1672
1696
|
__export(CompositeGenerator_exports, {
|
|
@@ -2031,6 +2055,13 @@ function shuffleInPlace(arr) {
|
|
|
2031
2055
|
[arr[i], arr[j]] = [arr[j], arr[i]];
|
|
2032
2056
|
}
|
|
2033
2057
|
}
|
|
2058
|
+
function formatAge(ms) {
|
|
2059
|
+
const minutes = Math.max(0, Math.round(ms / 6e4));
|
|
2060
|
+
if (minutes < 60) return `${minutes}m`;
|
|
2061
|
+
const hours = Math.round(minutes / 60);
|
|
2062
|
+
if (hours < 24) return `${hours}h`;
|
|
2063
|
+
return `${Math.round(hours / 24)}d`;
|
|
2064
|
+
}
|
|
2034
2065
|
function pickTopByScore(cards, limit) {
|
|
2035
2066
|
return [...cards].sort((a, b) => b.score - a.score || a.cardId.localeCompare(b.cardId)).slice(0, limit);
|
|
2036
2067
|
}
|
|
@@ -2039,6 +2070,7 @@ var init_prescribed = __esm({
|
|
|
2039
2070
|
"src/core/navigators/generators/prescribed.ts"() {
|
|
2040
2071
|
"use strict";
|
|
2041
2072
|
init_navigators();
|
|
2073
|
+
init_StrategyPressureDebugger();
|
|
2042
2074
|
init_logger();
|
|
2043
2075
|
DEFAULT_FRESHNESS_WINDOW = 3;
|
|
2044
2076
|
DEFAULT_MAX_DIRECT_PER_RUN = 3;
|
|
@@ -2115,6 +2147,7 @@ var init_prescribed = __esm({
|
|
|
2115
2147
|
const groupRuntimes = [];
|
|
2116
2148
|
const priorPracticeDebt = progress.practiceDebt ?? {};
|
|
2117
2149
|
const nextPracticeDebt = {};
|
|
2150
|
+
const practiceDebtsByGroup = /* @__PURE__ */ new Map();
|
|
2118
2151
|
for (const group of this.config.groups) {
|
|
2119
2152
|
const runtime = this.buildGroupRuntimeState({
|
|
2120
2153
|
group,
|
|
@@ -2163,7 +2196,7 @@ var init_prescribed = __esm({
|
|
|
2163
2196
|
courseId,
|
|
2164
2197
|
emittedIds
|
|
2165
2198
|
);
|
|
2166
|
-
const
|
|
2199
|
+
const practice = this.buildPracticeCards({
|
|
2167
2200
|
group,
|
|
2168
2201
|
courseId,
|
|
2169
2202
|
emittedIds,
|
|
@@ -2176,7 +2209,8 @@ var init_prescribed = __esm({
|
|
|
2176
2209
|
priorPracticeDebt,
|
|
2177
2210
|
nextPracticeDebt
|
|
2178
2211
|
});
|
|
2179
|
-
|
|
2212
|
+
practiceDebtsByGroup.set(group.id, practice.debts);
|
|
2213
|
+
emitted.push(...directCards, ...supportCards, ...discoveredSupportCards, ...practice.cards);
|
|
2180
2214
|
}
|
|
2181
2215
|
nextState.practiceDebt = nextPracticeDebt;
|
|
2182
2216
|
const hintSummary = this.buildSupportHintSummary(groupRuntimes);
|
|
@@ -2192,6 +2226,7 @@ var init_prescribed = __esm({
|
|
|
2192
2226
|
} else {
|
|
2193
2227
|
logger.info("[Prescribed] No hints to emit (no blocked targets or no support tags)");
|
|
2194
2228
|
}
|
|
2229
|
+
this.capturePressureSnapshot(courseId, groupRuntimes, practiceDebtsByGroup, emitted, hints);
|
|
2195
2230
|
if (emitted.length === 0) {
|
|
2196
2231
|
logger.info(
|
|
2197
2232
|
"[Prescribed] 0 cards emitted (all targets blocked, authored/discovered support candidates exhausted)" + (hints ? " \u2014 boost hints emitted but may not survive filters" : "")
|
|
@@ -2253,6 +2288,60 @@ var init_prescribed = __esm({
|
|
|
2253
2288
|
supportTags: [...supportTags].sort()
|
|
2254
2289
|
};
|
|
2255
2290
|
}
|
|
2291
|
+
/**
|
|
2292
|
+
* Translate this run's per-group runtimes and practice debts into gauges on
|
|
2293
|
+
* the generic strategy-pressure debug channel (rendered by the live session
|
|
2294
|
+
* overlay's "strategy backpressure" section).
|
|
2295
|
+
*/
|
|
2296
|
+
capturePressureSnapshot(courseId, groupRuntimes, practiceDebtsByGroup, emitted, hints) {
|
|
2297
|
+
const now = Date.now();
|
|
2298
|
+
const gauges = [];
|
|
2299
|
+
for (const runtime of groupRuntimes) {
|
|
2300
|
+
const group = runtime.group;
|
|
2301
|
+
const window2 = group.freshnessWindowSessions ?? DEFAULT_FRESHNESS_WINDOW;
|
|
2302
|
+
gauges.push({
|
|
2303
|
+
id: `group:${group.id}:target`,
|
|
2304
|
+
label: `${group.id} targets`,
|
|
2305
|
+
multiplier: runtime.pressureMultiplier,
|
|
2306
|
+
max: MAX_TARGET_MULTIPLIER,
|
|
2307
|
+
detail: `${runtime.pendingTargets.length} pending (${runtime.surfaceableTargets.length} surfaceable, ${runtime.blockedTargets.length} blocked) \xB7 sinceSurfaced ${runtime.sessionsSinceSurfaced}/${window2}`,
|
|
2308
|
+
items: runtime.blockedTargets.map((cardId) => ({ label: cardId, value: "blocked" }))
|
|
2309
|
+
});
|
|
2310
|
+
if (runtime.blockedTargets.length > 0) {
|
|
2311
|
+
const mode = runtime.supportCandidates.length > 0 ? "direct-support" : runtime.discoveredSupportCandidates.length > 0 ? "inserted-support" : "boost-only";
|
|
2312
|
+
gauges.push({
|
|
2313
|
+
id: `group:${group.id}:support`,
|
|
2314
|
+
label: `${group.id} support`,
|
|
2315
|
+
multiplier: runtime.supportMultiplier,
|
|
2316
|
+
max: MAX_SUPPORT_MULTIPLIER,
|
|
2317
|
+
detail: `mode=${mode} \xB7 ${runtime.supportTags.length} support tag(s)`,
|
|
2318
|
+
items: runtime.supportTags.map((tag) => ({ label: tag }))
|
|
2319
|
+
});
|
|
2320
|
+
}
|
|
2321
|
+
const debts = practiceDebtsByGroup.get(group.id) ?? [];
|
|
2322
|
+
if (debts.length > 0) {
|
|
2323
|
+
gauges.push({
|
|
2324
|
+
id: `group:${group.id}:practice-debt`,
|
|
2325
|
+
label: `${group.id} practice debt`,
|
|
2326
|
+
multiplier: Math.max(...debts.map((d) => d.multiplier)),
|
|
2327
|
+
max: MAX_PRACTICE_MULTIPLIER,
|
|
2328
|
+
detail: `${debts.length} under-practiced skill(s)`,
|
|
2329
|
+
items: debts.map((d) => ({
|
|
2330
|
+
label: d.tag,
|
|
2331
|
+
value: `\xD7${d.multiplier.toFixed(2)} \xB7 open ${formatAge(now - new Date(d.firstOwedAt).getTime())}`
|
|
2332
|
+
}))
|
|
2333
|
+
});
|
|
2334
|
+
}
|
|
2335
|
+
}
|
|
2336
|
+
captureStrategyPressure({
|
|
2337
|
+
source: "prescribed",
|
|
2338
|
+
courseId,
|
|
2339
|
+
gauges,
|
|
2340
|
+
topScore: emitted.length > 0 ? Math.max(...emitted.map((c) => c.score)) : null,
|
|
2341
|
+
hintsLabel: hints?._label,
|
|
2342
|
+
timestamp: now
|
|
2343
|
+
});
|
|
2344
|
+
}
|
|
2256
2345
|
parseConfig(serializedData) {
|
|
2257
2346
|
try {
|
|
2258
2347
|
const parsed = JSON.parse(serializedData);
|
|
@@ -2409,6 +2498,7 @@ var init_prescribed = __esm({
|
|
|
2409
2498
|
supportTags: [...supportTags],
|
|
2410
2499
|
pressureMultiplier,
|
|
2411
2500
|
supportMultiplier,
|
|
2501
|
+
sessionsSinceSurfaced,
|
|
2412
2502
|
debugVersion: PRESCRIBED_DEBUG_VERSION
|
|
2413
2503
|
};
|
|
2414
2504
|
}
|
|
@@ -2541,13 +2631,13 @@ var init_prescribed = __esm({
|
|
|
2541
2631
|
nextPracticeDebt
|
|
2542
2632
|
} = args;
|
|
2543
2633
|
const patterns = group.practiceTagPatterns ?? [];
|
|
2544
|
-
if (patterns.length === 0) return [];
|
|
2634
|
+
if (patterns.length === 0) return { cards: [], debts: [] };
|
|
2545
2635
|
const practiceMinCount = group.practiceMinCount ?? DEFAULT_PRACTICE_MIN_COUNT;
|
|
2546
2636
|
const maxPractice = group.maxPracticeCardsPerRun ?? DEFAULT_MAX_PRACTICE_PER_RUN;
|
|
2547
2637
|
const practiceTags = [...cardsByTag.keys()].filter(
|
|
2548
2638
|
(tag) => patterns.some((p) => matchesTagPattern(tag, p)) && this.isUnlockedGatedSkill(tag, hierarchyConfigs, userTagElo, userGlobalElo) && (userTagElo[tag]?.count ?? 0) < practiceMinCount
|
|
2549
2639
|
);
|
|
2550
|
-
if (practiceTags.length === 0) return [];
|
|
2640
|
+
if (practiceTags.length === 0) return { cards: [], debts: [] };
|
|
2551
2641
|
const now = Date.now();
|
|
2552
2642
|
const DAY_MS = 24 * 60 * 60 * 1e3;
|
|
2553
2643
|
const tagMultiplier = /* @__PURE__ */ new Map();
|
|
@@ -2562,6 +2652,11 @@ var init_prescribed = __esm({
|
|
|
2562
2652
|
);
|
|
2563
2653
|
tagMultiplier.set(tag, mult);
|
|
2564
2654
|
}
|
|
2655
|
+
const debts = practiceTags.map((tag) => ({
|
|
2656
|
+
tag,
|
|
2657
|
+
multiplier: tagMultiplier.get(tag) ?? PRACTICE_BASE_MULT,
|
|
2658
|
+
firstOwedAt: nextPracticeDebt[tag]
|
|
2659
|
+
})).sort((a, b) => b.multiplier - a.multiplier || a.tag.localeCompare(b.tag));
|
|
2565
2660
|
const practiceCardIds = this.findDiscoveredSupportCards({
|
|
2566
2661
|
supportTags: practiceTags,
|
|
2567
2662
|
cardsByTag,
|
|
@@ -2570,7 +2665,7 @@ var init_prescribed = __esm({
|
|
|
2570
2665
|
excludedIds: emittedIds,
|
|
2571
2666
|
limit: maxPractice
|
|
2572
2667
|
});
|
|
2573
|
-
if (practiceCardIds.length === 0) return [];
|
|
2668
|
+
if (practiceCardIds.length === 0) return { cards: [], debts };
|
|
2574
2669
|
logger.info(
|
|
2575
2670
|
`[Prescribed] Group '${group.id}' practice: ${practiceTags.length} unlocked under-practiced skill(s), emitting ${practiceCardIds.length} drill card(s)`
|
|
2576
2671
|
);
|
|
@@ -2600,7 +2695,7 @@ var init_prescribed = __esm({
|
|
|
2600
2695
|
]
|
|
2601
2696
|
});
|
|
2602
2697
|
}
|
|
2603
|
-
return cards;
|
|
2698
|
+
return { cards, debts };
|
|
2604
2699
|
}
|
|
2605
2700
|
/**
|
|
2606
2701
|
* True for a skill that was *gated and is now reached*: it has at least one
|
|
@@ -5277,6 +5372,7 @@ var init_3 = __esm({
|
|
|
5277
5372
|
"./PipelineAssembler.ts": () => Promise.resolve().then(() => (init_PipelineAssembler(), PipelineAssembler_exports)),
|
|
5278
5373
|
"./PipelineDebugger.ts": () => Promise.resolve().then(() => (init_PipelineDebugger(), PipelineDebugger_exports)),
|
|
5279
5374
|
"./SrsDebugger.ts": () => Promise.resolve().then(() => (init_SrsDebugger(), SrsDebugger_exports)),
|
|
5375
|
+
"./StrategyPressureDebugger.ts": () => Promise.resolve().then(() => (init_StrategyPressureDebugger(), StrategyPressureDebugger_exports)),
|
|
5280
5376
|
"./defaults.ts": () => Promise.resolve().then(() => (init_defaults(), defaults_exports)),
|
|
5281
5377
|
"./diversityRerank.ts": () => Promise.resolve().then(() => (init_diversityRerank(), diversityRerank_exports)),
|
|
5282
5378
|
"./filters/WeightedFilter.ts": () => Promise.resolve().then(() => (init_WeightedFilter(), WeightedFilter_exports)),
|
|
@@ -5309,7 +5405,9 @@ __export(navigators_exports, {
|
|
|
5309
5405
|
NavigatorRole: () => NavigatorRole,
|
|
5310
5406
|
NavigatorRoles: () => NavigatorRoles,
|
|
5311
5407
|
Navigators: () => Navigators,
|
|
5408
|
+
captureStrategyPressure: () => captureStrategyPressure,
|
|
5312
5409
|
clearSrsBacklogDebug: () => clearSrsBacklogDebug,
|
|
5410
|
+
clearStrategyPressureDebug: () => clearStrategyPressureDebug,
|
|
5313
5411
|
diversityRerank: () => diversityRerank,
|
|
5314
5412
|
getActivePipeline: () => getActivePipeline,
|
|
5315
5413
|
getCardOrigin: () => getCardOrigin,
|
|
@@ -5317,6 +5415,7 @@ __export(navigators_exports, {
|
|
|
5317
5415
|
getRegisteredNavigatorNames: () => getRegisteredNavigatorNames,
|
|
5318
5416
|
getRegisteredNavigatorRole: () => getRegisteredNavigatorRole,
|
|
5319
5417
|
getSrsBacklogDebug: () => getSrsBacklogDebug,
|
|
5418
|
+
getStrategyPressureDebug: () => getStrategyPressureDebug,
|
|
5320
5419
|
hasRegisteredNavigator: () => hasRegisteredNavigator,
|
|
5321
5420
|
initializeNavigatorRegistry: () => initializeNavigatorRegistry,
|
|
5322
5421
|
isFilter: () => isFilter,
|
|
@@ -5399,6 +5498,7 @@ var init_navigators = __esm({
|
|
|
5399
5498
|
init_diversityRerank();
|
|
5400
5499
|
init_PipelineDebugger();
|
|
5401
5500
|
init_SrsDebugger();
|
|
5501
|
+
init_StrategyPressureDebugger();
|
|
5402
5502
|
init_logger();
|
|
5403
5503
|
init_();
|
|
5404
5504
|
init_2();
|
|
@@ -8423,7 +8523,9 @@ __export(core_exports, {
|
|
|
8423
8523
|
aggregateOutcomesForGradient: () => aggregateOutcomesForGradient,
|
|
8424
8524
|
areQuestionRecords: () => areQuestionRecords,
|
|
8425
8525
|
buildStrategyStateId: () => buildStrategyStateId,
|
|
8526
|
+
captureStrategyPressure: () => captureStrategyPressure,
|
|
8426
8527
|
clearSrsBacklogDebug: () => clearSrsBacklogDebug,
|
|
8528
|
+
clearStrategyPressureDebug: () => clearStrategyPressureDebug,
|
|
8427
8529
|
computeDeviation: () => computeDeviation,
|
|
8428
8530
|
computeEffectiveWeight: () => computeEffectiveWeight,
|
|
8429
8531
|
computeOutcomeSignal: () => computeOutcomeSignal,
|
|
@@ -8440,6 +8542,7 @@ __export(core_exports, {
|
|
|
8440
8542
|
getRegisteredNavigatorNames: () => getRegisteredNavigatorNames,
|
|
8441
8543
|
getRegisteredNavigatorRole: () => getRegisteredNavigatorRole,
|
|
8442
8544
|
getSrsBacklogDebug: () => getSrsBacklogDebug,
|
|
8545
|
+
getStrategyPressureDebug: () => getStrategyPressureDebug,
|
|
8443
8546
|
getStudySource: () => getStudySource,
|
|
8444
8547
|
hasRegisteredNavigator: () => hasRegisteredNavigator,
|
|
8445
8548
|
importParsedCards: () => importParsedCards,
|
|
@@ -8494,7 +8597,9 @@ init_core();
|
|
|
8494
8597
|
aggregateOutcomesForGradient,
|
|
8495
8598
|
areQuestionRecords,
|
|
8496
8599
|
buildStrategyStateId,
|
|
8600
|
+
captureStrategyPressure,
|
|
8497
8601
|
clearSrsBacklogDebug,
|
|
8602
|
+
clearStrategyPressureDebug,
|
|
8498
8603
|
computeDeviation,
|
|
8499
8604
|
computeEffectiveWeight,
|
|
8500
8605
|
computeOutcomeSignal,
|
|
@@ -8511,6 +8616,7 @@ init_core();
|
|
|
8511
8616
|
getRegisteredNavigatorNames,
|
|
8512
8617
|
getRegisteredNavigatorRole,
|
|
8513
8618
|
getSrsBacklogDebug,
|
|
8619
|
+
getStrategyPressureDebug,
|
|
8514
8620
|
getStudySource,
|
|
8515
8621
|
hasRegisteredNavigator,
|
|
8516
8622
|
importParsedCards,
|