@higher.archi/boe 1.0.7 → 1.0.8

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.
Files changed (51) hide show
  1. package/dist/core/evaluation/decay.d.ts +60 -0
  2. package/dist/core/evaluation/decay.d.ts.map +1 -0
  3. package/dist/core/evaluation/decay.js +111 -0
  4. package/dist/core/evaluation/decay.js.map +1 -0
  5. package/dist/core/evaluation/index.d.ts +2 -0
  6. package/dist/core/evaluation/index.d.ts.map +1 -1
  7. package/dist/core/evaluation/index.js +5 -1
  8. package/dist/core/evaluation/index.js.map +1 -1
  9. package/dist/engines/bayesian/compiler.d.ts.map +1 -1
  10. package/dist/engines/bayesian/compiler.js +14 -2
  11. package/dist/engines/bayesian/compiler.js.map +1 -1
  12. package/dist/engines/bayesian/strategy.d.ts.map +1 -1
  13. package/dist/engines/bayesian/strategy.js +41 -4
  14. package/dist/engines/bayesian/strategy.js.map +1 -1
  15. package/dist/engines/bayesian/types.d.ts +16 -0
  16. package/dist/engines/bayesian/types.d.ts.map +1 -1
  17. package/dist/engines/bayesian/types.js.map +1 -1
  18. package/dist/engines/defeasible/compiler.d.ts.map +1 -1
  19. package/dist/engines/defeasible/compiler.js +16 -2
  20. package/dist/engines/defeasible/compiler.js.map +1 -1
  21. package/dist/engines/defeasible/strategy.d.ts.map +1 -1
  22. package/dist/engines/defeasible/strategy.js +47 -2
  23. package/dist/engines/defeasible/strategy.js.map +1 -1
  24. package/dist/engines/defeasible/types.d.ts +29 -1
  25. package/dist/engines/defeasible/types.d.ts.map +1 -1
  26. package/dist/engines/defeasible/types.js.map +1 -1
  27. package/dist/engines/scoring/compiler.d.ts.map +1 -1
  28. package/dist/engines/scoring/compiler.js +17 -4
  29. package/dist/engines/scoring/compiler.js.map +1 -1
  30. package/dist/engines/scoring/strategy.d.ts.map +1 -1
  31. package/dist/engines/scoring/strategy.js +49 -0
  32. package/dist/engines/scoring/strategy.js.map +1 -1
  33. package/dist/engines/scoring/types.d.ts +16 -0
  34. package/dist/engines/scoring/types.d.ts.map +1 -1
  35. package/dist/index.d.ts +2 -0
  36. package/dist/index.d.ts.map +1 -1
  37. package/dist/index.js +5 -1
  38. package/dist/index.js.map +1 -1
  39. package/package.json +1 -1
  40. package/src/core/evaluation/decay.ts +165 -0
  41. package/src/core/evaluation/index.ts +13 -0
  42. package/src/engines/bayesian/compiler.ts +15 -2
  43. package/src/engines/bayesian/strategy.ts +54 -4
  44. package/src/engines/bayesian/types.ts +17 -0
  45. package/src/engines/defeasible/compiler.ts +17 -2
  46. package/src/engines/defeasible/strategy.ts +62 -2
  47. package/src/engines/defeasible/types.ts +33 -0
  48. package/src/engines/scoring/compiler.ts +18 -4
  49. package/src/engines/scoring/strategy.ts +63 -0
  50. package/src/engines/scoring/types.ts +17 -0
  51. package/src/index.ts +12 -0
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -30,7 +30,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
30
30
  };
31
31
  Object.defineProperty(exports, "__esModule", { value: true });
32
32
  exports.compileUtilityRule = exports.compileUtilityRuleSet = exports.UtilityStrategy = exports.SEMANTIC_WEIGHTS = exports.constraintStrategy = exports.compileConstraintRuleSet = exports.ConstraintStrategy = exports.stateMachineStrategy = exports.compileStateMachineDefinition = exports.compileStateMachine = exports.StateMachineStrategy = exports.monteCarloStrategy = exports.compileMonteCarloRuleSet = exports.MonteCarloStrategy = exports.SEMANTIC_LIKELIHOODS = exports.parseLikelihood = exports.bayesianStrategy = exports.compileBayesianRule = exports.compileBayesianRuleSet = exports.BayesianStrategy = exports.autoAdjustCoverage = exports.analyzeCoverage = exports.compileFuzzyVariable = exports.fuzzyStrategy = exports.compileFuzzyRuleSet = exports.FuzzyStrategy = exports.sequentialStrategy = exports.compileSequentialRuleSet = exports.SequentialStrategy = exports.scoringStrategy = exports.compileScoringRuleSet = exports.ScoringStrategy = exports.backwardStrategy = exports.compileBackwardRuleSet = exports.BackwardChainingStrategy = exports.forwardStrategy = exports.compileForwardRule = exports.compileForwardRuleSet = exports.ForwardChainingStrategy = exports.PricingEngine = exports.UtilityEngine = exports.ConstraintEngine = exports.StateMachineEngine = exports.MonteCarloEngine = exports.BayesianEngine = exports.FuzzyEngine = exports.SequentialEngine = exports.ScoringEngine = exports.BackwardEngine = exports.ForwardEngine = void 0;
33
- exports.cosineSimilarity = exports.caverphone2 = exports.nysiis = exports.soundex = exports.getCurrencyInfo = exports.CURRENCIES = exports.applyMinMax = exports.calculateDiscount = exports.round = exports.formatPercent = exports.formatNumber = exports.formatCurrency = exports.calculateVolume = exports.calculateGraduated = exports.calculateFlat = exports.pricingEngine = exports.pricingStrategy = exports.compilePricingRule = exports.compilePricingRuleSet = exports.PricingStrategy = exports.buildAvailableRefs = exports.hasInterpolation = exports.interpolate = exports.compileTemplate = exports.expertStrategy = exports.compileExpertRuleSet = exports.ExpertStrategy = exports.ExpertEngine = exports.compileDefeasibleRuleSet = exports.DefeasibleEngine = exports.utilityStrategy = void 0;
33
+ exports.resolveDecayTimestamp = exports.calculateDecayMultiplier = exports.cosineSimilarity = exports.caverphone2 = exports.nysiis = exports.soundex = exports.getCurrencyInfo = exports.CURRENCIES = exports.applyMinMax = exports.calculateDiscount = exports.round = exports.formatPercent = exports.formatNumber = exports.formatCurrency = exports.calculateVolume = exports.calculateGraduated = exports.calculateFlat = exports.pricingEngine = exports.pricingStrategy = exports.compilePricingRule = exports.compilePricingRuleSet = exports.PricingStrategy = exports.buildAvailableRefs = exports.hasInterpolation = exports.interpolate = exports.compileTemplate = exports.expertStrategy = exports.compileExpertRuleSet = exports.ExpertStrategy = exports.ExpertEngine = exports.compileDefeasibleRuleSet = exports.DefeasibleEngine = exports.utilityStrategy = void 0;
34
34
  // ========================================
35
35
  // Engines
36
36
  // ========================================
@@ -169,6 +169,10 @@ Object.defineProperty(exports, "soundex", { enumerable: true, get: function () {
169
169
  Object.defineProperty(exports, "nysiis", { enumerable: true, get: function () { return functions_1.nysiis; } });
170
170
  Object.defineProperty(exports, "caverphone2", { enumerable: true, get: function () { return functions_1.caverphone2; } });
171
171
  Object.defineProperty(exports, "cosineSimilarity", { enumerable: true, get: function () { return functions_1.cosineSimilarity; } });
172
+ // Temporal Decay (re-exported from core for convenience)
173
+ var decay_1 = require("./core/evaluation/decay");
174
+ Object.defineProperty(exports, "calculateDecayMultiplier", { enumerable: true, get: function () { return decay_1.calculateDecayMultiplier; } });
175
+ Object.defineProperty(exports, "resolveDecayTimestamp", { enumerable: true, get: function () { return decay_1.resolveDecayTimestamp; } });
172
176
  // ========================================
173
177
  // QFacts - Probabilistic Fact Hydration
174
178
  // ========================================
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@higher.archi/boe",
3
- "version": "1.0.7",
3
+ "version": "1.0.8",
4
4
  "description": "A multi-strategy rule engine supporting forward chaining, backward chaining, scoring, sequential, fuzzy logic, and Bayesian inference",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -0,0 +1,165 @@
1
+ /**
2
+ * Temporal Decay Utilities
3
+ *
4
+ * Provides continuous decay multipliers (0→1) that degrade a rule's
5
+ * contribution based on how old its underlying data is.
6
+ *
7
+ * Complementary to temporal validity (binary gate) — validity runs first,
8
+ * decay modifies strength continuously.
9
+ */
10
+
11
+ import { BindingContext, Fact } from '../types';
12
+
13
+ // ========================================
14
+ // Types
15
+ // ========================================
16
+
17
+ /**
18
+ * Decay curve shape
19
+ * - exponential: e^(-ln(2)/halfLife * age), smooth asymptotic decay
20
+ * - linear: 1 - age/maxAge, straight-line to zero
21
+ * - step: binary cutoff at threshold age
22
+ */
23
+ export type DecayCurve = 'exponential' | 'linear' | 'step';
24
+
25
+ /**
26
+ * Time unit for decay calculations
27
+ */
28
+ export type DecayTimeUnit = 'hours' | 'days' | 'weeks' | 'months';
29
+
30
+ /**
31
+ * Configuration for temporal decay
32
+ */
33
+ export type DecayConfig = {
34
+ curve: DecayCurve;
35
+ timeUnit: DecayTimeUnit;
36
+ halfLife?: number; // exponential: age at which multiplier = 0.5
37
+ maxAge?: number; // linear: age at which multiplier = 0
38
+ threshold?: number; // step: binary cutoff age
39
+ floor?: number; // minimum multiplier (default 0)
40
+ };
41
+
42
+ /**
43
+ * Decay calculation result with audit trail
44
+ */
45
+ export type DecayInfo = {
46
+ multiplier: number;
47
+ ageInUnits: number;
48
+ curve: DecayCurve;
49
+ timestamp: string; // resolved ISO timestamp
50
+ fullyDecayed: boolean;
51
+ };
52
+
53
+ // ========================================
54
+ // Time Unit Conversion
55
+ // ========================================
56
+
57
+ const MS_PER_HOUR = 3_600_000;
58
+ const MS_PER_DAY = 86_400_000;
59
+ const MS_PER_WEEK = 604_800_000;
60
+ const MS_PER_MONTH = 2_592_000_000; // 30 days
61
+
62
+ function msPerUnit(unit: DecayTimeUnit): number {
63
+ switch (unit) {
64
+ case 'hours': return MS_PER_HOUR;
65
+ case 'days': return MS_PER_DAY;
66
+ case 'weeks': return MS_PER_WEEK;
67
+ case 'months': return MS_PER_MONTH;
68
+ }
69
+ }
70
+
71
+ // ========================================
72
+ // Core Calculation
73
+ // ========================================
74
+
75
+ /**
76
+ * Calculate a decay multiplier based on age and configuration
77
+ *
78
+ * @param dataTimestamp - When the data was collected/created
79
+ * @param now - Current time reference point
80
+ * @param config - Decay configuration
81
+ * @returns DecayInfo with multiplier and audit data
82
+ */
83
+ export function calculateDecayMultiplier(
84
+ dataTimestamp: Date,
85
+ now: Date,
86
+ config: DecayConfig
87
+ ): DecayInfo {
88
+ const ageMs = now.getTime() - dataTimestamp.getTime();
89
+ const ageInUnits = ageMs / msPerUnit(config.timeUnit);
90
+ const floor = config.floor ?? 0;
91
+
92
+ let rawMultiplier: number;
93
+
94
+ switch (config.curve) {
95
+ case 'exponential': {
96
+ const halfLife = config.halfLife ?? 1;
97
+ // e^(-ln(2)/halfLife * age)
98
+ rawMultiplier = Math.exp(-Math.LN2 / halfLife * ageInUnits);
99
+ break;
100
+ }
101
+
102
+ case 'linear': {
103
+ const maxAge = config.maxAge ?? 1;
104
+ rawMultiplier = 1 - ageInUnits / maxAge;
105
+ break;
106
+ }
107
+
108
+ case 'step': {
109
+ const threshold = config.threshold ?? 1;
110
+ rawMultiplier = ageInUnits < threshold ? 1.0 : 0.0;
111
+ break;
112
+ }
113
+ }
114
+
115
+ // Clamp to [floor, 1]
116
+ const multiplier = Math.max(floor, Math.min(1, rawMultiplier));
117
+
118
+ return {
119
+ multiplier,
120
+ ageInUnits,
121
+ curve: config.curve,
122
+ timestamp: dataTimestamp.toISOString(),
123
+ fullyDecayed: multiplier <= floor
124
+ };
125
+ }
126
+
127
+ /**
128
+ * Resolve a decay timestamp from a $-prefixed path in the binding context
129
+ *
130
+ * @param ref - A $-prefixed path like '$inspection.date'
131
+ * @param context - The current binding context
132
+ * @returns Resolved Date, or null if path is missing/invalid
133
+ */
134
+ export function resolveDecayTimestamp(ref: string, context: BindingContext): Date | null {
135
+ if (!ref.startsWith('$')) return null;
136
+
137
+ const stripped = ref.slice(1);
138
+ const parts = stripped.split('.');
139
+ const param = parts[0];
140
+ const path = parts.slice(1);
141
+
142
+ const fact = context[param] as Fact | undefined;
143
+ if (!fact) return null;
144
+
145
+ let value: any = fact.data;
146
+ for (const key of path) {
147
+ if (value === null || value === undefined) return null;
148
+ value = value[key];
149
+ }
150
+
151
+ if (value === null || value === undefined) return null;
152
+
153
+ // Accept Date objects, ISO strings, or numeric timestamps
154
+ if (value instanceof Date) return value;
155
+ if (typeof value === 'string') {
156
+ const parsed = new Date(value);
157
+ return isNaN(parsed.getTime()) ? null : parsed;
158
+ }
159
+ if (typeof value === 'number') {
160
+ const parsed = new Date(value);
161
+ return isNaN(parsed.getTime()) ? null : parsed;
162
+ }
163
+
164
+ return null;
165
+ }
@@ -18,3 +18,16 @@ export {
18
18
  getRuleTemporalInfo,
19
19
  RulesetMetadata
20
20
  } from './temporal';
21
+
22
+ // Temporal decay utilities
23
+ export {
24
+ calculateDecayMultiplier,
25
+ resolveDecayTimestamp
26
+ } from './decay';
27
+
28
+ export type {
29
+ DecayCurve,
30
+ DecayTimeUnit,
31
+ DecayConfig,
32
+ DecayInfo
33
+ } from './decay';
@@ -346,6 +346,17 @@ export function compileBayesianRule(
346
346
  const inputs = rule.inputs.map(compileInputParameter);
347
347
  const when = rule.when ? compileCondition(rule.when) : undefined;
348
348
 
349
+ // Compile decay — only pass through $-prefixed string timestamps
350
+ let compiledDecay: { timestamp: string; config?: any } | undefined;
351
+ if (rule.decay) {
352
+ const ts = rule.decay.timestamp;
353
+ if (typeof ts === 'string') {
354
+ compiledDecay = { timestamp: ts, config: rule.decay.config };
355
+ }
356
+ // Expression timestamps for Bayesian are not supported (would need runtime eval);
357
+ // only $-prefixed paths are supported
358
+ }
359
+
349
360
  return {
350
361
  id: rule.id,
351
362
  name: rule.name,
@@ -354,7 +365,8 @@ export function compileBayesianRule(
354
365
  index,
355
366
  inputs,
356
367
  when,
357
- likelihood: compileLikelihoodMap(rule.likelihood, hypothesisNames, rule.id)
368
+ likelihood: compileLikelihoodMap(rule.likelihood, hypothesisNames, rule.id),
369
+ decay: compiledDecay
358
370
  };
359
371
  }
360
372
 
@@ -370,7 +382,8 @@ export function compileBayesianRuleSet(ruleSet: BayesianRuleSet): CompiledBayesi
370
382
  const config: BayesianConfig = {
371
383
  mode: 'bayesian',
372
384
  threshold: ruleSet.config?.threshold,
373
- priorDefault: ruleSet.config?.priorDefault ?? 'uniform'
385
+ priorDefault: ruleSet.config?.priorDefault ?? 'uniform',
386
+ decay: ruleSet.config?.decay
374
387
  };
375
388
 
376
389
  // Get hypothesis names for validation
@@ -13,6 +13,12 @@ import {
13
13
  Fact
14
14
  } from '../../core';
15
15
  import { IWorkingMemory } from '../../core/memory';
16
+ import {
17
+ calculateDecayMultiplier,
18
+ resolveDecayTimestamp,
19
+ DecayConfig,
20
+ DecayInfo
21
+ } from '../../core/evaluation/decay';
16
22
 
17
23
  import {
18
24
  CompiledBayesianRuleSet,
@@ -191,6 +197,8 @@ export class BayesianStrategy {
191
197
  const fired: string[] = [];
192
198
  const evidence: EvidenceEntry[] = [];
193
199
  let thresholdExceeded: string | undefined;
200
+ const decayInfoMap: Record<string, DecayInfo> = {};
201
+ const now = new Date();
194
202
 
195
203
  // Track which hypotheses were below threshold initially
196
204
  // (so we can detect when they cross it)
@@ -213,20 +221,59 @@ export class BayesianStrategy {
213
221
  fired.push(rule.id);
214
222
  }
215
223
 
224
+ // Compute decay for this rule's evidence
225
+ let effectiveLikelihoods = rule.likelihood;
226
+ let likelihoodsBeforeDecay: CompiledLikelihoodMap | undefined;
227
+ let ruleDecayInfo: DecayInfo | undefined;
228
+
229
+ const ruleDecay = rule.decay;
230
+ const engineDecay = config.decay;
231
+
232
+ if (ruleDecay || engineDecay) {
233
+ const tsRef = ruleDecay?.timestamp ?? (engineDecay?.timestamp as string | undefined);
234
+
235
+ if (typeof tsRef === 'string') {
236
+ const dataTimestamp = resolveDecayTimestamp(tsRef, activation.facts);
237
+
238
+ if (dataTimestamp) {
239
+ const decayConfig: DecayConfig = {
240
+ ...(engineDecay?.config ?? { curve: 'exponential', timeUnit: 'days' }),
241
+ ...ruleDecay?.config
242
+ } as DecayConfig;
243
+
244
+ const info = calculateDecayMultiplier(dataTimestamp, now, decayConfig);
245
+ ruleDecayInfo = info;
246
+ decayInfoMap[rule.id] = info;
247
+
248
+ // Decay likelihoods toward 1.0 (neutral)
249
+ // decayedLikelihood = 1.0 + (originalLikelihood - 1.0) * multiplier
250
+ if (info.multiplier < 1.0) {
251
+ likelihoodsBeforeDecay = { ...rule.likelihood };
252
+ effectiveLikelihoods = {};
253
+ for (const [h, lh] of Object.entries(rule.likelihood)) {
254
+ effectiveLikelihoods[h] = 1.0 + (lh - 1.0) * info.multiplier;
255
+ }
256
+ }
257
+ }
258
+ }
259
+ }
260
+
216
261
  // Record evidence
217
262
  evidence.push({
218
263
  ruleId: rule.id,
219
264
  ruleName: rule.name,
220
- likelihoods: rule.likelihood
265
+ likelihoods: effectiveLikelihoods,
266
+ likelihoodsBeforeDecay,
267
+ decayInfo: ruleDecayInfo
221
268
  });
222
269
 
223
270
  // Callback
224
271
  if (onFire) {
225
- onFire(rule.id, activation.facts, rule.likelihood);
272
+ onFire(rule.id, activation.facts, effectiveLikelihoods);
226
273
  }
227
274
 
228
- // Update posteriors with this evidence
229
- posteriors = applyEvidence(posteriors, rule.likelihood);
275
+ // Update posteriors with this evidence (using decayed likelihoods)
276
+ posteriors = applyEvidence(posteriors, effectiveLikelihoods);
230
277
 
231
278
  // Check if any hypothesis crossed the threshold (from below to above)
232
279
  if (threshold !== undefined && thresholdExceeded === undefined) {
@@ -255,6 +302,8 @@ export class BayesianStrategy {
255
302
 
256
303
  const executionTimeMs = Math.round((performance.now() - startTime) * 100) / 100;
257
304
 
305
+ const hasDecay = Object.keys(decayInfoMap).length > 0;
306
+
258
307
  return {
259
308
  priors: normalizedPriors,
260
309
  posteriors,
@@ -263,6 +312,7 @@ export class BayesianStrategy {
263
312
  fired,
264
313
  evidence,
265
314
  thresholdExceeded,
315
+ ...(hasDecay ? { decayInfo: decayInfoMap } : {}),
266
316
  iterations: 1,
267
317
  executionTimeMs
268
318
  };
@@ -17,6 +17,8 @@ import {
17
17
  BindingContext
18
18
  } from '../../core';
19
19
 
20
+ import { DecayConfig, DecayInfo } from '../../core/evaluation/decay';
21
+
20
22
  // ========================================
21
23
  // Likelihood Value Types
22
24
  // ========================================
@@ -100,6 +102,10 @@ export type PriorDefault =
100
102
  */
101
103
  export type BayesianRule = BaseRule & {
102
104
  likelihood: LikelihoodMap; // How this evidence affects each hypothesis
105
+ decay?: {
106
+ timestamp: string | Expression; // e.g. '$sensor.readingDate'
107
+ config?: Partial<DecayConfig>; // overrides engine-level defaults
108
+ };
103
109
  };
104
110
 
105
111
  /**
@@ -109,6 +115,10 @@ export type BayesianConfig = {
109
115
  mode: 'bayesian';
110
116
  threshold?: number; // Flag if any posterior exceeds this (e.g., 0.5)
111
117
  priorDefault?: PriorDefault; // How to fill missing priors (default: 'uniform')
118
+ decay?: {
119
+ timestamp?: string | Expression; // default timestamp path for all rules
120
+ config: DecayConfig; // engine-level decay config
121
+ };
112
122
  };
113
123
 
114
124
  /**
@@ -152,6 +162,10 @@ export type CompiledLikelihoodMap = Record<string, number>;
152
162
  */
153
163
  export type CompiledBayesianRule = CompiledBaseRule & {
154
164
  likelihood: CompiledLikelihoodMap;
165
+ decay?: {
166
+ timestamp: string; // $-prefixed path
167
+ config?: Partial<DecayConfig>;
168
+ };
155
169
  };
156
170
 
157
171
  /**
@@ -176,6 +190,8 @@ export type EvidenceEntry = {
176
190
  ruleId: string;
177
191
  ruleName?: string;
178
192
  likelihoods: CompiledLikelihoodMap;
193
+ likelihoodsBeforeDecay?: CompiledLikelihoodMap; // original likelihoods before decay
194
+ decayInfo?: DecayInfo;
179
195
  };
180
196
 
181
197
  /**
@@ -197,6 +213,7 @@ export type BayesianResult = {
197
213
  fired: string[]; // Rules that matched and provided evidence
198
214
  evidence: EvidenceEntry[]; // Audit trail
199
215
  thresholdExceeded?: string; // First hypothesis to exceed threshold (if any)
216
+ decayInfo?: Record<string, DecayInfo>; // per-rule decay audit
200
217
  iterations: 1; // Bayesian is always one-pass
201
218
  executionTimeMs: number; // Processing time in milliseconds
202
219
  };
@@ -34,7 +34,8 @@ const DEFAULT_CONFIG: Required<DefeasibleConfig> = {
34
34
  aggregation: 'average',
35
35
  threshold: 0.5,
36
36
  conflictResolution: 'specificity',
37
- maxIterations: 100
37
+ maxIterations: 100,
38
+ decay: undefined as any // Optional at runtime; Required<> demands a key
38
39
  };
39
40
 
40
41
  // ========================================
@@ -198,6 +199,19 @@ function compileRule(rule: DefeasibleRule, index: number): CompiledDefeasibleRul
198
199
  const inputs = (rule.inputs || []).map(compileInputParameter);
199
200
  const when = rule.when ? compileCondition(rule.when) : undefined;
200
201
 
202
+ // Compile decay — only pass through $-prefixed string timestamps
203
+ let compiledDecay: CompiledDefeasibleRule['decay'] | undefined;
204
+ if (rule.decay) {
205
+ const ts = rule.decay.timestamp;
206
+ if (typeof ts === 'string') {
207
+ compiledDecay = {
208
+ timestamp: ts,
209
+ config: rule.decay.config,
210
+ target: rule.decay.target
211
+ };
212
+ }
213
+ }
214
+
201
215
  return {
202
216
  id: rule.id,
203
217
  name: rule.name,
@@ -210,7 +224,8 @@ function compileRule(rule: DefeasibleRule, index: number): CompiledDefeasibleRul
210
224
  credibility: normalizeCredibility(rule.credibility),
211
225
  conclusion: compileConclusion(rule.conclude),
212
226
  defeats: (rule.defeats || []).map(normalizeDefeat),
213
- specificity: countSpecificity(rule)
227
+ specificity: countSpecificity(rule),
228
+ decay: compiledDecay
214
229
  };
215
230
  }
216
231
 
@@ -7,6 +7,12 @@
7
7
 
8
8
  import { match } from '../../core/matching';
9
9
  import { IWorkingMemory } from '../../core/memory';
10
+ import {
11
+ calculateDecayMultiplier,
12
+ resolveDecayTimestamp,
13
+ DecayConfig,
14
+ DecayInfo
15
+ } from '../../core/evaluation/decay';
10
16
 
11
17
  import {
12
18
  CompiledDefeasibleRuleSet,
@@ -101,17 +107,57 @@ export class DefeasibleStrategy {
101
107
  // Phase 1: Match all rules and collect fired rules
102
108
  const firedRules: FiredRule[] = [];
103
109
  const firedRuleIds: string[] = [];
110
+ const decayInfoMap: Record<string, DecayInfo> = {};
111
+ const decayMultipliersByRule: Record<string, number> = {};
112
+ const now = new Date();
104
113
 
105
114
  for (const rule of ruleSet.rules) {
106
115
  // Match inputs against working memory (includes when clause evaluation)
107
116
  const activations = match(rule, wm);
108
117
 
109
118
  for (const activation of activations) {
119
+ // Compute decay if configured
120
+ let effectiveCredibility = rule.credibility;
121
+ let credibilityBeforeDecay: number | undefined;
122
+ let ruleDecayInfo: DecayInfo | undefined;
123
+
124
+ const ruleDecay = rule.decay;
125
+ const engineDecay = config.decay;
126
+
127
+ if (ruleDecay || engineDecay) {
128
+ const tsRef = ruleDecay?.timestamp ?? (engineDecay?.timestamp as string | undefined);
129
+ const decayTarget = ruleDecay?.target ?? engineDecay?.target ?? 'credibility';
130
+
131
+ if (typeof tsRef === 'string') {
132
+ const dataTimestamp = resolveDecayTimestamp(tsRef, activation.facts);
133
+
134
+ if (dataTimestamp) {
135
+ const decayConfig: DecayConfig = {
136
+ ...(engineDecay?.config ?? { curve: 'exponential', timeUnit: 'days' }),
137
+ ...ruleDecay?.config
138
+ } as DecayConfig;
139
+
140
+ const info = calculateDecayMultiplier(dataTimestamp, now, decayConfig);
141
+ ruleDecayInfo = info;
142
+ decayInfoMap[rule.id] = info;
143
+ decayMultipliersByRule[rule.id] = info.multiplier;
144
+
145
+ // Apply decay to credibility if target includes it
146
+ if (decayTarget === 'credibility' || decayTarget === 'both') {
147
+ credibilityBeforeDecay = rule.credibility;
148
+ effectiveCredibility = rule.credibility * info.multiplier;
149
+ }
150
+ }
151
+ }
152
+ }
153
+
110
154
  // Rule fires
111
155
  firedRules.push({
112
156
  ruleId: rule.id,
113
157
  conclusion: rule.conclusion,
114
- credibility: rule.credibility,
158
+ credibility: effectiveCredibility,
159
+ credibilityBeforeDecay,
160
+ decayInfo: ruleDecayInfo,
115
161
  bindings: activation.facts
116
162
  });
117
163
 
@@ -166,9 +212,21 @@ export class DefeasibleStrategy {
166
212
  if (!defeatsMap.has(defeat.rule)) {
167
213
  defeatsMap.set(defeat.rule, []);
168
214
  }
215
+
216
+ // Apply decay to defeat strength if target includes it
217
+ let effectiveStrength = defeat.strength;
218
+ const ruleDecay = rule.decay;
219
+ const engineDecay = config.decay;
220
+ const decayTarget = ruleDecay?.target ?? engineDecay?.target ?? 'credibility';
221
+
222
+ if ((decayTarget === 'defeat-strength' || decayTarget === 'both') &&
223
+ decayMultipliersByRule[fired.ruleId] !== undefined) {
224
+ effectiveStrength = defeat.strength * decayMultipliersByRule[fired.ruleId];
225
+ }
226
+
169
227
  defeatsMap.get(defeat.rule)!.push({
170
228
  by: fired.ruleId,
171
- strength: defeat.strength
229
+ strength: effectiveStrength
172
230
  });
173
231
  }
174
232
  }
@@ -291,6 +349,7 @@ export class DefeasibleStrategy {
291
349
  };
292
350
 
293
351
  const executionTimeMs = Math.round((performance.now() - startTime) * 100) / 100;
352
+ const hasDecay = Object.keys(decayInfoMap).length > 0;
294
353
 
295
354
  return {
296
355
  conclusions,
@@ -300,6 +359,7 @@ export class DefeasibleStrategy {
300
359
  conflicts,
301
360
  fired: firedRuleIds,
302
361
  iterations: 1, // Current implementation is single-pass
362
+ ...(hasDecay ? { decayInfo: decayInfoMap } : {}),
303
363
  executionTimeMs,
304
364
  query
305
365
  };
@@ -20,9 +20,12 @@ import {
20
20
  CompiledBaseRule,
21
21
  CompiledBaseRuleSet,
22
22
  CompiledInputParameter,
23
+ Expression,
23
24
  BindingContext
24
25
  } from '../../core';
25
26
 
27
+ import { DecayConfig, DecayInfo } from '../../core/evaluation/decay';
28
+
26
29
  // ========================================
27
30
  // Rule Strength Types
28
31
  // ========================================
@@ -167,6 +170,15 @@ export type DefeasibleRule = BaseRule & {
167
170
  * Useful for audit trails and explainability.
168
171
  */
169
172
  explanation?: string;
173
+
174
+ /**
175
+ * Temporal decay configuration for this rule
176
+ */
177
+ decay?: {
178
+ timestamp: string | Expression;
179
+ config?: Partial<DecayConfig>;
180
+ target?: 'credibility' | 'defeat-strength' | 'both'; // default: 'credibility'
181
+ };
170
182
  };
171
183
 
172
184
  /**
@@ -216,6 +228,15 @@ export type DefeasibleConfig = {
216
228
  * Maximum iterations for computing defeat cycles (default: 100)
217
229
  */
218
230
  maxIterations?: number;
231
+
232
+ /**
233
+ * Engine-level temporal decay configuration
234
+ */
235
+ decay?: {
236
+ timestamp?: string | Expression;
237
+ config: DecayConfig;
238
+ target?: 'credibility' | 'defeat-strength' | 'both';
239
+ };
219
240
  };
220
241
 
221
242
  /**
@@ -263,6 +284,11 @@ export type CompiledDefeasibleRule = CompiledBaseRule & {
263
284
  conclusion: CompiledConclusion | null; // null for pure defeaters
264
285
  defeats: CompiledDefeat[]; // Normalized defeats
265
286
  specificity: number; // Number of conditions (for tie-breaking)
287
+ decay?: {
288
+ timestamp: string; // $-prefixed path
289
+ config?: Partial<DecayConfig>;
290
+ target?: 'credibility' | 'defeat-strength' | 'both';
291
+ };
266
292
  };
267
293
 
268
294
  /**
@@ -293,6 +319,8 @@ export type FiredRule = {
293
319
  ruleId: string;
294
320
  conclusion: CompiledConclusion | null;
295
321
  credibility: number;
322
+ credibilityBeforeDecay?: number; // original credibility before decay
323
+ decayInfo?: DecayInfo;
296
324
  bindings: BindingContext;
297
325
  };
298
326
 
@@ -385,6 +413,11 @@ export type DefeasibleResult = {
385
413
  */
386
414
  iterations: number;
387
415
 
416
+ /**
417
+ * Per-rule decay audit trail
418
+ */
419
+ decayInfo?: Record<string, DecayInfo>;
420
+
388
421
  /**
389
422
  * Processing time in milliseconds
390
423
  */