opencode-swarm-plugin 0.43.0 → 0.44.1
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/bin/cass.characterization.test.ts +422 -0
- package/bin/swarm.serve.test.ts +6 -4
- package/bin/swarm.test.ts +68 -0
- package/bin/swarm.ts +81 -8
- package/dist/compaction-prompt-scoring.js +139 -0
- package/dist/contributor-tools.d.ts +42 -0
- package/dist/contributor-tools.d.ts.map +1 -0
- package/dist/eval-capture.js +12811 -0
- package/dist/hive.d.ts.map +1 -1
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7728 -62590
- package/dist/plugin.js +23833 -78695
- package/dist/sessions/agent-discovery.d.ts +59 -0
- package/dist/sessions/agent-discovery.d.ts.map +1 -0
- package/dist/sessions/index.d.ts +10 -0
- package/dist/sessions/index.d.ts.map +1 -0
- package/dist/swarm-orchestrate.d.ts.map +1 -1
- package/dist/swarm-prompts.d.ts.map +1 -1
- package/dist/swarm-review.d.ts.map +1 -1
- package/package.json +17 -5
- package/.changeset/swarm-insights-data-layer.md +0 -63
- package/.hive/analysis/eval-failure-analysis-2025-12-25.md +0 -331
- package/.hive/analysis/session-data-quality-audit.md +0 -320
- package/.hive/eval-results.json +0 -483
- package/.hive/issues.jsonl +0 -138
- package/.hive/memories.jsonl +0 -729
- package/.opencode/eval-history.jsonl +0 -327
- package/.turbo/turbo-build.log +0 -9
- package/CHANGELOG.md +0 -2255
- package/SCORER-ANALYSIS.md +0 -598
- package/docs/analysis/subagent-coordination-patterns.md +0 -902
- package/docs/analysis-socratic-planner-pattern.md +0 -504
- package/docs/planning/ADR-001-monorepo-structure.md +0 -171
- package/docs/planning/ADR-002-package-extraction.md +0 -393
- package/docs/planning/ADR-003-performance-improvements.md +0 -451
- package/docs/planning/ADR-004-message-queue-features.md +0 -187
- package/docs/planning/ADR-005-devtools-observability.md +0 -202
- package/docs/planning/ADR-007-swarm-enhancements-worktree-review.md +0 -168
- package/docs/planning/ADR-008-worker-handoff-protocol.md +0 -293
- package/docs/planning/ADR-009-oh-my-opencode-patterns.md +0 -353
- package/docs/planning/ROADMAP.md +0 -368
- package/docs/semantic-memory-cli-syntax.md +0 -123
- package/docs/swarm-mail-architecture.md +0 -1147
- package/docs/testing/context-recovery-test.md +0 -470
- package/evals/ARCHITECTURE.md +0 -1189
- package/evals/README.md +0 -768
- package/evals/compaction-prompt.eval.ts +0 -149
- package/evals/compaction-resumption.eval.ts +0 -289
- package/evals/coordinator-behavior.eval.ts +0 -307
- package/evals/coordinator-session.eval.ts +0 -154
- package/evals/evalite.config.ts.bak +0 -15
- package/evals/example.eval.ts +0 -31
- package/evals/fixtures/compaction-cases.ts +0 -350
- package/evals/fixtures/compaction-prompt-cases.ts +0 -311
- package/evals/fixtures/coordinator-sessions.ts +0 -328
- package/evals/fixtures/decomposition-cases.ts +0 -105
- package/evals/lib/compaction-loader.test.ts +0 -248
- package/evals/lib/compaction-loader.ts +0 -320
- package/evals/lib/data-loader.evalite-test.ts +0 -289
- package/evals/lib/data-loader.test.ts +0 -345
- package/evals/lib/data-loader.ts +0 -281
- package/evals/lib/llm.ts +0 -115
- package/evals/scorers/compaction-prompt-scorers.ts +0 -145
- package/evals/scorers/compaction-scorers.ts +0 -305
- package/evals/scorers/coordinator-discipline.evalite-test.ts +0 -539
- package/evals/scorers/coordinator-discipline.ts +0 -325
- package/evals/scorers/index.test.ts +0 -146
- package/evals/scorers/index.ts +0 -328
- package/evals/scorers/outcome-scorers.evalite-test.ts +0 -27
- package/evals/scorers/outcome-scorers.ts +0 -349
- package/evals/swarm-decomposition.eval.ts +0 -121
- package/examples/commands/swarm.md +0 -745
- package/examples/plugin-wrapper-template.ts +0 -2426
- package/examples/skills/hive-workflow/SKILL.md +0 -212
- package/examples/skills/skill-creator/SKILL.md +0 -223
- package/examples/skills/swarm-coordination/SKILL.md +0 -292
- package/global-skills/cli-builder/SKILL.md +0 -344
- package/global-skills/cli-builder/references/advanced-patterns.md +0 -244
- package/global-skills/learning-systems/SKILL.md +0 -644
- package/global-skills/skill-creator/LICENSE.txt +0 -202
- package/global-skills/skill-creator/SKILL.md +0 -352
- package/global-skills/skill-creator/references/output-patterns.md +0 -82
- package/global-skills/skill-creator/references/workflows.md +0 -28
- package/global-skills/swarm-coordination/SKILL.md +0 -995
- package/global-skills/swarm-coordination/references/coordinator-patterns.md +0 -235
- package/global-skills/swarm-coordination/references/strategies.md +0 -138
- package/global-skills/system-design/SKILL.md +0 -213
- package/global-skills/testing-patterns/SKILL.md +0 -430
- package/global-skills/testing-patterns/references/dependency-breaking-catalog.md +0 -586
- package/opencode-swarm-plugin-0.30.7.tgz +0 -0
- package/opencode-swarm-plugin-0.31.0.tgz +0 -0
- package/scripts/cleanup-test-memories.ts +0 -346
- package/scripts/init-skill.ts +0 -222
- package/scripts/migrate-unknown-sessions.ts +0 -349
- package/scripts/validate-skill.ts +0 -204
- package/src/agent-mail.ts +0 -1724
- package/src/anti-patterns.test.ts +0 -1167
- package/src/anti-patterns.ts +0 -448
- package/src/compaction-capture.integration.test.ts +0 -257
- package/src/compaction-hook.test.ts +0 -838
- package/src/compaction-hook.ts +0 -1204
- package/src/compaction-observability.integration.test.ts +0 -139
- package/src/compaction-observability.test.ts +0 -187
- package/src/compaction-observability.ts +0 -324
- package/src/compaction-prompt-scorers.test.ts +0 -475
- package/src/compaction-prompt-scoring.ts +0 -300
- package/src/dashboard.test.ts +0 -611
- package/src/dashboard.ts +0 -462
- package/src/error-enrichment.test.ts +0 -403
- package/src/error-enrichment.ts +0 -219
- package/src/eval-capture.test.ts +0 -1015
- package/src/eval-capture.ts +0 -929
- package/src/eval-gates.test.ts +0 -306
- package/src/eval-gates.ts +0 -218
- package/src/eval-history.test.ts +0 -508
- package/src/eval-history.ts +0 -214
- package/src/eval-learning.test.ts +0 -378
- package/src/eval-learning.ts +0 -360
- package/src/eval-runner.test.ts +0 -223
- package/src/eval-runner.ts +0 -402
- package/src/export-tools.test.ts +0 -476
- package/src/export-tools.ts +0 -257
- package/src/hive.integration.test.ts +0 -2241
- package/src/hive.ts +0 -1628
- package/src/index.ts +0 -935
- package/src/learning.integration.test.ts +0 -1815
- package/src/learning.ts +0 -1079
- package/src/logger.test.ts +0 -189
- package/src/logger.ts +0 -135
- package/src/mandate-promotion.test.ts +0 -473
- package/src/mandate-promotion.ts +0 -239
- package/src/mandate-storage.integration.test.ts +0 -601
- package/src/mandate-storage.test.ts +0 -578
- package/src/mandate-storage.ts +0 -794
- package/src/mandates.ts +0 -540
- package/src/memory-tools.test.ts +0 -195
- package/src/memory-tools.ts +0 -344
- package/src/memory.integration.test.ts +0 -334
- package/src/memory.test.ts +0 -158
- package/src/memory.ts +0 -527
- package/src/model-selection.test.ts +0 -188
- package/src/model-selection.ts +0 -68
- package/src/observability-tools.test.ts +0 -359
- package/src/observability-tools.ts +0 -871
- package/src/output-guardrails.test.ts +0 -438
- package/src/output-guardrails.ts +0 -381
- package/src/pattern-maturity.test.ts +0 -1160
- package/src/pattern-maturity.ts +0 -525
- package/src/planning-guardrails.test.ts +0 -491
- package/src/planning-guardrails.ts +0 -438
- package/src/plugin.ts +0 -23
- package/src/post-compaction-tracker.test.ts +0 -251
- package/src/post-compaction-tracker.ts +0 -237
- package/src/query-tools.test.ts +0 -636
- package/src/query-tools.ts +0 -324
- package/src/rate-limiter.integration.test.ts +0 -466
- package/src/rate-limiter.ts +0 -774
- package/src/replay-tools.test.ts +0 -496
- package/src/replay-tools.ts +0 -240
- package/src/repo-crawl.integration.test.ts +0 -441
- package/src/repo-crawl.ts +0 -610
- package/src/schemas/cell-events.test.ts +0 -347
- package/src/schemas/cell-events.ts +0 -807
- package/src/schemas/cell.ts +0 -257
- package/src/schemas/evaluation.ts +0 -166
- package/src/schemas/index.test.ts +0 -199
- package/src/schemas/index.ts +0 -286
- package/src/schemas/mandate.ts +0 -232
- package/src/schemas/swarm-context.ts +0 -115
- package/src/schemas/task.ts +0 -161
- package/src/schemas/worker-handoff.test.ts +0 -302
- package/src/schemas/worker-handoff.ts +0 -131
- package/src/skills.integration.test.ts +0 -1192
- package/src/skills.test.ts +0 -643
- package/src/skills.ts +0 -1549
- package/src/storage.integration.test.ts +0 -341
- package/src/storage.ts +0 -884
- package/src/structured.integration.test.ts +0 -817
- package/src/structured.test.ts +0 -1046
- package/src/structured.ts +0 -762
- package/src/swarm-decompose.test.ts +0 -188
- package/src/swarm-decompose.ts +0 -1302
- package/src/swarm-deferred.integration.test.ts +0 -157
- package/src/swarm-deferred.test.ts +0 -38
- package/src/swarm-insights.test.ts +0 -214
- package/src/swarm-insights.ts +0 -459
- package/src/swarm-mail.integration.test.ts +0 -970
- package/src/swarm-mail.ts +0 -739
- package/src/swarm-orchestrate.integration.test.ts +0 -282
- package/src/swarm-orchestrate.test.ts +0 -548
- package/src/swarm-orchestrate.ts +0 -3084
- package/src/swarm-prompts.test.ts +0 -1270
- package/src/swarm-prompts.ts +0 -2077
- package/src/swarm-research.integration.test.ts +0 -701
- package/src/swarm-research.test.ts +0 -698
- package/src/swarm-research.ts +0 -472
- package/src/swarm-review.integration.test.ts +0 -285
- package/src/swarm-review.test.ts +0 -879
- package/src/swarm-review.ts +0 -709
- package/src/swarm-strategies.ts +0 -407
- package/src/swarm-worktree.test.ts +0 -501
- package/src/swarm-worktree.ts +0 -575
- package/src/swarm.integration.test.ts +0 -2377
- package/src/swarm.ts +0 -38
- package/src/tool-adapter.integration.test.ts +0 -1221
- package/src/tool-availability.ts +0 -461
- package/tsconfig.json +0 -28
package/src/pattern-maturity.ts
DELETED
|
@@ -1,525 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Pattern Maturity Module
|
|
3
|
-
*
|
|
4
|
-
* Tracks decomposition pattern maturity states through lifecycle:
|
|
5
|
-
* candidate → established → proven (or deprecated)
|
|
6
|
-
*
|
|
7
|
-
* Patterns start as candidates until they accumulate enough feedback.
|
|
8
|
-
* Strong positive feedback promotes to proven, strong negative deprecates.
|
|
9
|
-
*
|
|
10
|
-
* @see https://github.com/Dicklesworthstone/cass_memory_system/blob/main/src/scoring.ts#L73-L98
|
|
11
|
-
*/
|
|
12
|
-
import { z } from "zod";
|
|
13
|
-
import { calculateDecayedValue } from "./learning";
|
|
14
|
-
|
|
15
|
-
// ============================================================================
|
|
16
|
-
// Constants
|
|
17
|
-
// ============================================================================
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* Tolerance for floating-point comparisons.
|
|
21
|
-
* Used when comparing success rates to avoid floating-point precision issues.
|
|
22
|
-
*/
|
|
23
|
-
const FLOAT_EPSILON = 0.01;
|
|
24
|
-
|
|
25
|
-
// ============================================================================
|
|
26
|
-
// Schemas
|
|
27
|
-
// ============================================================================
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* Maturity state for a decomposition pattern
|
|
31
|
-
*
|
|
32
|
-
* - candidate: Not enough feedback to judge (< minFeedback events)
|
|
33
|
-
* - established: Enough feedback, neither proven nor deprecated
|
|
34
|
-
* - proven: Strong positive signal (high helpful, low harmful ratio)
|
|
35
|
-
* - deprecated: Strong negative signal (high harmful ratio)
|
|
36
|
-
*/
|
|
37
|
-
export const MaturityStateSchema = z.enum([
|
|
38
|
-
"candidate",
|
|
39
|
-
"established",
|
|
40
|
-
"proven",
|
|
41
|
-
"deprecated",
|
|
42
|
-
]);
|
|
43
|
-
export type MaturityState = z.infer<typeof MaturityStateSchema>;
|
|
44
|
-
|
|
45
|
-
/**
|
|
46
|
-
* Pattern maturity tracking
|
|
47
|
-
*
|
|
48
|
-
* Tracks feedback counts and state transitions for a decomposition pattern.
|
|
49
|
-
*/
|
|
50
|
-
export const PatternMaturitySchema = z.object({
|
|
51
|
-
/** Unique identifier for the pattern */
|
|
52
|
-
pattern_id: z.string(),
|
|
53
|
-
/** Current maturity state */
|
|
54
|
-
state: MaturityStateSchema,
|
|
55
|
-
/** Number of helpful feedback events */
|
|
56
|
-
helpful_count: z.number().int().min(0),
|
|
57
|
-
/** Number of harmful feedback events */
|
|
58
|
-
harmful_count: z.number().int().min(0),
|
|
59
|
-
/** When the pattern was last validated (ISO-8601) */
|
|
60
|
-
last_validated: z.string(),
|
|
61
|
-
/** When the pattern was promoted to proven (ISO-8601) */
|
|
62
|
-
promoted_at: z.string().optional(),
|
|
63
|
-
/** When the pattern was deprecated (ISO-8601) */
|
|
64
|
-
deprecated_at: z.string().optional(),
|
|
65
|
-
});
|
|
66
|
-
export type PatternMaturity = z.infer<typeof PatternMaturitySchema>;
|
|
67
|
-
|
|
68
|
-
/**
|
|
69
|
-
* Feedback event for maturity tracking
|
|
70
|
-
*/
|
|
71
|
-
export const MaturityFeedbackSchema = z.object({
|
|
72
|
-
/** Pattern this feedback applies to */
|
|
73
|
-
pattern_id: z.string(),
|
|
74
|
-
/** Whether the pattern was helpful or harmful */
|
|
75
|
-
type: z.enum(["helpful", "harmful"]),
|
|
76
|
-
/** When this feedback was recorded (ISO-8601) */
|
|
77
|
-
timestamp: z.string(),
|
|
78
|
-
/** Raw weight before decay (0-1) */
|
|
79
|
-
weight: z.number().min(0).max(1).default(1),
|
|
80
|
-
});
|
|
81
|
-
export type MaturityFeedback = z.infer<typeof MaturityFeedbackSchema>;
|
|
82
|
-
|
|
83
|
-
// ============================================================================
|
|
84
|
-
// Configuration
|
|
85
|
-
// ============================================================================
|
|
86
|
-
|
|
87
|
-
/**
|
|
88
|
-
* Configuration for maturity calculations
|
|
89
|
-
*/
|
|
90
|
-
export interface MaturityConfig {
|
|
91
|
-
/** Minimum feedback events before leaving candidate state */
|
|
92
|
-
minFeedback: number;
|
|
93
|
-
/** Minimum decayed helpful score to reach proven state */
|
|
94
|
-
minHelpful: number;
|
|
95
|
-
/** Maximum harmful ratio to reach/maintain proven state */
|
|
96
|
-
maxHarmful: number;
|
|
97
|
-
/** Harmful ratio threshold for deprecation */
|
|
98
|
-
deprecationThreshold: number;
|
|
99
|
-
/** Half-life for decay in days */
|
|
100
|
-
halfLifeDays: number;
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
export const DEFAULT_MATURITY_CONFIG: MaturityConfig = {
|
|
104
|
-
minFeedback: 3,
|
|
105
|
-
minHelpful: 5,
|
|
106
|
-
maxHarmful: 0.15, // 15% harmful is acceptable for proven
|
|
107
|
-
deprecationThreshold: 0.3, // 30% harmful triggers deprecation
|
|
108
|
-
halfLifeDays: 90,
|
|
109
|
-
};
|
|
110
|
-
|
|
111
|
-
// ============================================================================
|
|
112
|
-
// Core Functions
|
|
113
|
-
// ============================================================================
|
|
114
|
-
|
|
115
|
-
/**
|
|
116
|
-
* Calculate decayed feedback counts
|
|
117
|
-
*
|
|
118
|
-
* Applies half-life decay to each feedback event based on age.
|
|
119
|
-
*
|
|
120
|
-
* @param feedbackEvents - Raw feedback events
|
|
121
|
-
* @param config - Maturity configuration
|
|
122
|
-
* @param now - Current timestamp for decay calculation
|
|
123
|
-
* @returns Decayed helpful and harmful totals
|
|
124
|
-
*/
|
|
125
|
-
export function calculateDecayedCounts(
|
|
126
|
-
feedbackEvents: MaturityFeedback[],
|
|
127
|
-
config: MaturityConfig = DEFAULT_MATURITY_CONFIG,
|
|
128
|
-
now: Date = new Date(),
|
|
129
|
-
): { decayedHelpful: number; decayedHarmful: number } {
|
|
130
|
-
let decayedHelpful = 0;
|
|
131
|
-
let decayedHarmful = 0;
|
|
132
|
-
|
|
133
|
-
for (const event of feedbackEvents) {
|
|
134
|
-
const decay = calculateDecayedValue(
|
|
135
|
-
event.timestamp,
|
|
136
|
-
now,
|
|
137
|
-
config.halfLifeDays,
|
|
138
|
-
);
|
|
139
|
-
const value = event.weight * decay;
|
|
140
|
-
|
|
141
|
-
if (event.type === "helpful") {
|
|
142
|
-
decayedHelpful += value;
|
|
143
|
-
} else {
|
|
144
|
-
decayedHarmful += value;
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
return { decayedHelpful, decayedHarmful };
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
/**
|
|
152
|
-
* Calculate maturity state from feedback events
|
|
153
|
-
*
|
|
154
|
-
* State determination logic:
|
|
155
|
-
* 1. "deprecated" if harmful ratio > 0.3 AND total >= minFeedback
|
|
156
|
-
* 2. "candidate" if total < minFeedback (not enough data)
|
|
157
|
-
* 3. "proven" if decayedHelpful >= minHelpful AND harmfulRatio < maxHarmful
|
|
158
|
-
* 4. "established" otherwise (enough data but not yet proven)
|
|
159
|
-
*
|
|
160
|
-
* @param feedbackEvents - Feedback events for this pattern
|
|
161
|
-
* @param config - Maturity configuration
|
|
162
|
-
* @param now - Current timestamp for decay calculation
|
|
163
|
-
* @returns Calculated maturity state
|
|
164
|
-
*/
|
|
165
|
-
export function calculateMaturityState(
|
|
166
|
-
feedbackEvents: MaturityFeedback[],
|
|
167
|
-
config: MaturityConfig = DEFAULT_MATURITY_CONFIG,
|
|
168
|
-
now: Date = new Date(),
|
|
169
|
-
): MaturityState {
|
|
170
|
-
const { decayedHelpful, decayedHarmful } = calculateDecayedCounts(
|
|
171
|
-
feedbackEvents,
|
|
172
|
-
config,
|
|
173
|
-
now,
|
|
174
|
-
);
|
|
175
|
-
|
|
176
|
-
const total = decayedHelpful + decayedHarmful;
|
|
177
|
-
// Use FLOAT_EPSILON constant (defined at module level)
|
|
178
|
-
const safeTotal = total > FLOAT_EPSILON ? total : 0;
|
|
179
|
-
const harmfulRatio = safeTotal > 0 ? decayedHarmful / safeTotal : 0;
|
|
180
|
-
|
|
181
|
-
// Deprecated: high harmful ratio with enough feedback
|
|
182
|
-
if (
|
|
183
|
-
harmfulRatio > config.deprecationThreshold &&
|
|
184
|
-
safeTotal >= config.minFeedback - FLOAT_EPSILON
|
|
185
|
-
) {
|
|
186
|
-
return "deprecated";
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
// Candidate: not enough feedback yet
|
|
190
|
-
if (safeTotal < config.minFeedback - FLOAT_EPSILON) {
|
|
191
|
-
return "candidate";
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
// Proven: strong positive signal
|
|
195
|
-
if (
|
|
196
|
-
decayedHelpful >= config.minHelpful - FLOAT_EPSILON &&
|
|
197
|
-
harmfulRatio < config.maxHarmful
|
|
198
|
-
) {
|
|
199
|
-
return "proven";
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
// Established: enough data but not proven
|
|
203
|
-
return "established";
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
/**
|
|
207
|
-
* Create initial pattern maturity record
|
|
208
|
-
*
|
|
209
|
-
* @param patternId - Unique pattern identifier
|
|
210
|
-
* @returns New PatternMaturity in candidate state
|
|
211
|
-
*/
|
|
212
|
-
export function createPatternMaturity(patternId: string): PatternMaturity {
|
|
213
|
-
return {
|
|
214
|
-
pattern_id: patternId,
|
|
215
|
-
state: "candidate",
|
|
216
|
-
helpful_count: 0,
|
|
217
|
-
harmful_count: 0,
|
|
218
|
-
last_validated: new Date().toISOString(),
|
|
219
|
-
};
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
/**
|
|
223
|
-
* Update pattern maturity with new feedback.
|
|
224
|
-
*
|
|
225
|
-
* Side Effects:
|
|
226
|
-
* - Sets `promoted_at` timestamp on first entry into 'proven' status
|
|
227
|
-
* - Sets `deprecated_at` timestamp on first entry into 'deprecated' status
|
|
228
|
-
* - Updates `helpful_count` and `harmful_count` based on feedback events
|
|
229
|
-
* - Recalculates `state` based on decayed feedback counts
|
|
230
|
-
*
|
|
231
|
-
* State Transitions:
|
|
232
|
-
* - candidate → established: After minFeedback observations (default 3)
|
|
233
|
-
* - established → proven: When decayedHelpful >= minHelpful (5) AND harmfulRatio < maxHarmful (15%)
|
|
234
|
-
* - any → deprecated: When harmfulRatio > deprecationThreshold (30%) AND total >= minFeedback
|
|
235
|
-
*
|
|
236
|
-
* @param maturity - Current maturity record
|
|
237
|
-
* @param feedbackEvents - All feedback events for this pattern
|
|
238
|
-
* @param config - Maturity configuration
|
|
239
|
-
* @returns Updated maturity record with new state
|
|
240
|
-
*/
|
|
241
|
-
export function updatePatternMaturity(
|
|
242
|
-
maturity: PatternMaturity,
|
|
243
|
-
feedbackEvents: MaturityFeedback[],
|
|
244
|
-
config: MaturityConfig = DEFAULT_MATURITY_CONFIG,
|
|
245
|
-
): PatternMaturity {
|
|
246
|
-
const now = new Date();
|
|
247
|
-
const newState = calculateMaturityState(feedbackEvents, config, now);
|
|
248
|
-
|
|
249
|
-
// Count raw feedback (not decayed)
|
|
250
|
-
const helpfulCount = feedbackEvents.filter(
|
|
251
|
-
(e) => e.type === "helpful",
|
|
252
|
-
).length;
|
|
253
|
-
const harmfulCount = feedbackEvents.filter(
|
|
254
|
-
(e) => e.type === "harmful",
|
|
255
|
-
).length;
|
|
256
|
-
|
|
257
|
-
const updated: PatternMaturity = {
|
|
258
|
-
...maturity,
|
|
259
|
-
state: newState,
|
|
260
|
-
helpful_count: helpfulCount,
|
|
261
|
-
harmful_count: harmfulCount,
|
|
262
|
-
last_validated: now.toISOString(),
|
|
263
|
-
};
|
|
264
|
-
|
|
265
|
-
// Track state transitions
|
|
266
|
-
if (newState === "proven" && maturity.state !== "proven") {
|
|
267
|
-
updated.promoted_at = now.toISOString();
|
|
268
|
-
}
|
|
269
|
-
if (newState === "deprecated" && maturity.state !== "deprecated") {
|
|
270
|
-
updated.deprecated_at = now.toISOString();
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
return updated;
|
|
274
|
-
}
|
|
275
|
-
|
|
276
|
-
/**
|
|
277
|
-
* Promote a pattern to proven state
|
|
278
|
-
*
|
|
279
|
-
* Manually promotes a pattern regardless of feedback counts.
|
|
280
|
-
* Use when external validation confirms pattern effectiveness.
|
|
281
|
-
*
|
|
282
|
-
* @param maturity - Current maturity record
|
|
283
|
-
* @returns Updated maturity record with proven state
|
|
284
|
-
*/
|
|
285
|
-
export function promotePattern(maturity: PatternMaturity): PatternMaturity {
|
|
286
|
-
if (maturity.state === "deprecated") {
|
|
287
|
-
throw new Error("Cannot promote a deprecated pattern");
|
|
288
|
-
}
|
|
289
|
-
|
|
290
|
-
if (maturity.state === "proven") {
|
|
291
|
-
console.warn(
|
|
292
|
-
`[PatternMaturity] Pattern already proven: ${maturity.pattern_id}`,
|
|
293
|
-
);
|
|
294
|
-
return maturity; // No-op but warn
|
|
295
|
-
}
|
|
296
|
-
|
|
297
|
-
if (maturity.state === "candidate" && maturity.helpful_count < 3) {
|
|
298
|
-
console.warn(
|
|
299
|
-
`[PatternMaturity] Promoting candidate with insufficient data: ${maturity.pattern_id} (${maturity.helpful_count} helpful observations)`,
|
|
300
|
-
);
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
const now = new Date().toISOString();
|
|
304
|
-
return {
|
|
305
|
-
...maturity,
|
|
306
|
-
state: "proven",
|
|
307
|
-
promoted_at: now,
|
|
308
|
-
last_validated: now,
|
|
309
|
-
};
|
|
310
|
-
}
|
|
311
|
-
|
|
312
|
-
/**
|
|
313
|
-
* Deprecate a pattern
|
|
314
|
-
*
|
|
315
|
-
* Manually deprecates a pattern regardless of feedback counts.
|
|
316
|
-
* Use when external validation shows pattern is harmful.
|
|
317
|
-
*
|
|
318
|
-
* @param maturity - Current maturity record
|
|
319
|
-
* @param reason - Optional reason for deprecation
|
|
320
|
-
* @returns Updated maturity record with deprecated state
|
|
321
|
-
*/
|
|
322
|
-
export function deprecatePattern(
|
|
323
|
-
maturity: PatternMaturity,
|
|
324
|
-
_reason?: string,
|
|
325
|
-
): PatternMaturity {
|
|
326
|
-
if (maturity.state === "deprecated") {
|
|
327
|
-
return maturity; // Already deprecated
|
|
328
|
-
}
|
|
329
|
-
|
|
330
|
-
const now = new Date().toISOString();
|
|
331
|
-
return {
|
|
332
|
-
...maturity,
|
|
333
|
-
state: "deprecated",
|
|
334
|
-
deprecated_at: now,
|
|
335
|
-
last_validated: now,
|
|
336
|
-
};
|
|
337
|
-
}
|
|
338
|
-
|
|
339
|
-
/**
|
|
340
|
-
* Get weight multiplier based on pattern maturity status.
|
|
341
|
-
*
|
|
342
|
-
* Multipliers chosen to:
|
|
343
|
-
* - Heavily penalize deprecated patterns (0x) - never recommend
|
|
344
|
-
* - Slightly boost proven patterns (1.5x) - reward validated success
|
|
345
|
-
* - Penalize unvalidated candidates (0.5x) - reduce impact until proven
|
|
346
|
-
* - Neutral for established (1.0x) - baseline weight
|
|
347
|
-
*
|
|
348
|
-
* @param state - Pattern maturity status
|
|
349
|
-
* @returns Multiplier to apply to pattern weight
|
|
350
|
-
*/
|
|
351
|
-
export function getMaturityMultiplier(state: MaturityState): number {
|
|
352
|
-
const multipliers: Record<MaturityState, number> = {
|
|
353
|
-
candidate: 0.5,
|
|
354
|
-
established: 1.0,
|
|
355
|
-
proven: 1.5,
|
|
356
|
-
deprecated: 0,
|
|
357
|
-
};
|
|
358
|
-
return multipliers[state];
|
|
359
|
-
}
|
|
360
|
-
|
|
361
|
-
/**
|
|
362
|
-
* Format maturity state for inclusion in prompts
|
|
363
|
-
*
|
|
364
|
-
* Shows pattern reliability to help agents make informed decisions.
|
|
365
|
-
*
|
|
366
|
-
* @param maturity - Pattern maturity record
|
|
367
|
-
* @returns Formatted string describing pattern reliability
|
|
368
|
-
*/
|
|
369
|
-
export function formatMaturityForPrompt(maturity: PatternMaturity): string {
|
|
370
|
-
const total = maturity.helpful_count + maturity.harmful_count;
|
|
371
|
-
|
|
372
|
-
// Don't show percentages for insufficient data
|
|
373
|
-
if (total < 3) {
|
|
374
|
-
return `[LIMITED DATA - ${total} observation${total !== 1 ? "s" : ""}]`;
|
|
375
|
-
}
|
|
376
|
-
|
|
377
|
-
const harmfulRatio =
|
|
378
|
-
total > 0 ? Math.round((maturity.harmful_count / total) * 100) : 0;
|
|
379
|
-
const helpfulRatio =
|
|
380
|
-
total > 0 ? Math.round((maturity.helpful_count / total) * 100) : 0;
|
|
381
|
-
|
|
382
|
-
switch (maturity.state) {
|
|
383
|
-
case "candidate":
|
|
384
|
-
return `[CANDIDATE - ${total} observations, needs more data]`;
|
|
385
|
-
case "established":
|
|
386
|
-
return `[ESTABLISHED - ${helpfulRatio}% helpful, ${harmfulRatio}% harmful from ${total} observations]`;
|
|
387
|
-
case "proven":
|
|
388
|
-
return `[PROVEN - ${helpfulRatio}% helpful from ${total} observations]`;
|
|
389
|
-
case "deprecated":
|
|
390
|
-
return `[DEPRECATED - ${harmfulRatio}% harmful, avoid using]`;
|
|
391
|
-
}
|
|
392
|
-
}
|
|
393
|
-
|
|
394
|
-
/**
|
|
395
|
-
* Format multiple patterns with maturity for prompt inclusion
|
|
396
|
-
*
|
|
397
|
-
* Groups patterns by maturity state for clear presentation.
|
|
398
|
-
*
|
|
399
|
-
* @param patterns - Map of pattern content to maturity record
|
|
400
|
-
* @returns Formatted string for prompt inclusion
|
|
401
|
-
*/
|
|
402
|
-
export function formatPatternsWithMaturityForPrompt(
|
|
403
|
-
patterns: Map<string, PatternMaturity>,
|
|
404
|
-
): string {
|
|
405
|
-
const proven: string[] = [];
|
|
406
|
-
const established: string[] = [];
|
|
407
|
-
const candidates: string[] = [];
|
|
408
|
-
const deprecated: string[] = [];
|
|
409
|
-
|
|
410
|
-
for (const [content, maturity] of patterns) {
|
|
411
|
-
const formatted = `- ${content} ${formatMaturityForPrompt(maturity)}`;
|
|
412
|
-
switch (maturity.state) {
|
|
413
|
-
case "proven":
|
|
414
|
-
proven.push(formatted);
|
|
415
|
-
break;
|
|
416
|
-
case "established":
|
|
417
|
-
established.push(formatted);
|
|
418
|
-
break;
|
|
419
|
-
case "candidate":
|
|
420
|
-
candidates.push(formatted);
|
|
421
|
-
break;
|
|
422
|
-
case "deprecated":
|
|
423
|
-
deprecated.push(formatted);
|
|
424
|
-
break;
|
|
425
|
-
}
|
|
426
|
-
}
|
|
427
|
-
|
|
428
|
-
const sections: string[] = [];
|
|
429
|
-
|
|
430
|
-
if (proven.length > 0) {
|
|
431
|
-
sections.push(
|
|
432
|
-
"## Proven Patterns\n\nThese patterns consistently work well:\n\n" +
|
|
433
|
-
proven.join("\n"),
|
|
434
|
-
);
|
|
435
|
-
}
|
|
436
|
-
|
|
437
|
-
if (established.length > 0) {
|
|
438
|
-
sections.push(
|
|
439
|
-
"## Established Patterns\n\nThese patterns have track records:\n\n" +
|
|
440
|
-
established.join("\n"),
|
|
441
|
-
);
|
|
442
|
-
}
|
|
443
|
-
|
|
444
|
-
if (candidates.length > 0) {
|
|
445
|
-
sections.push(
|
|
446
|
-
"## Candidate Patterns\n\nThese patterns need more validation:\n\n" +
|
|
447
|
-
candidates.join("\n"),
|
|
448
|
-
);
|
|
449
|
-
}
|
|
450
|
-
|
|
451
|
-
if (deprecated.length > 0) {
|
|
452
|
-
sections.push(
|
|
453
|
-
"## Deprecated Patterns\n\nAVOID these patterns - they have poor track records:\n\n" +
|
|
454
|
-
deprecated.join("\n"),
|
|
455
|
-
);
|
|
456
|
-
}
|
|
457
|
-
|
|
458
|
-
return sections.join("\n\n");
|
|
459
|
-
}
|
|
460
|
-
|
|
461
|
-
// ============================================================================
|
|
462
|
-
// Storage
|
|
463
|
-
// ============================================================================
|
|
464
|
-
|
|
465
|
-
/**
|
|
466
|
-
* Storage interface for pattern maturity records
|
|
467
|
-
*/
|
|
468
|
-
export interface MaturityStorage {
|
|
469
|
-
/** Store or update a maturity record */
|
|
470
|
-
store(maturity: PatternMaturity): Promise<void>;
|
|
471
|
-
/** Get maturity record by pattern ID */
|
|
472
|
-
get(patternId: string): Promise<PatternMaturity | null>;
|
|
473
|
-
/** Get all maturity records */
|
|
474
|
-
getAll(): Promise<PatternMaturity[]>;
|
|
475
|
-
/** Get patterns by state */
|
|
476
|
-
getByState(state: MaturityState): Promise<PatternMaturity[]>;
|
|
477
|
-
/** Store a feedback event */
|
|
478
|
-
storeFeedback(feedback: MaturityFeedback): Promise<void>;
|
|
479
|
-
/** Get all feedback for a pattern */
|
|
480
|
-
getFeedback(patternId: string): Promise<MaturityFeedback[]>;
|
|
481
|
-
}
|
|
482
|
-
|
|
483
|
-
/**
|
|
484
|
-
* In-memory maturity storage (for testing and short-lived sessions)
|
|
485
|
-
*/
|
|
486
|
-
export class InMemoryMaturityStorage implements MaturityStorage {
|
|
487
|
-
private maturities: Map<string, PatternMaturity> = new Map();
|
|
488
|
-
private feedback: MaturityFeedback[] = [];
|
|
489
|
-
|
|
490
|
-
async store(maturity: PatternMaturity): Promise<void> {
|
|
491
|
-
this.maturities.set(maturity.pattern_id, maturity);
|
|
492
|
-
}
|
|
493
|
-
|
|
494
|
-
async get(patternId: string): Promise<PatternMaturity | null> {
|
|
495
|
-
return this.maturities.get(patternId) ?? null;
|
|
496
|
-
}
|
|
497
|
-
|
|
498
|
-
async getAll(): Promise<PatternMaturity[]> {
|
|
499
|
-
return Array.from(this.maturities.values());
|
|
500
|
-
}
|
|
501
|
-
|
|
502
|
-
async getByState(state: MaturityState): Promise<PatternMaturity[]> {
|
|
503
|
-
return Array.from(this.maturities.values()).filter(
|
|
504
|
-
(m) => m.state === state,
|
|
505
|
-
);
|
|
506
|
-
}
|
|
507
|
-
|
|
508
|
-
async storeFeedback(feedback: MaturityFeedback): Promise<void> {
|
|
509
|
-
this.feedback.push(feedback);
|
|
510
|
-
}
|
|
511
|
-
|
|
512
|
-
async getFeedback(patternId: string): Promise<MaturityFeedback[]> {
|
|
513
|
-
return this.feedback.filter((f) => f.pattern_id === patternId);
|
|
514
|
-
}
|
|
515
|
-
}
|
|
516
|
-
|
|
517
|
-
// ============================================================================
|
|
518
|
-
// Exports
|
|
519
|
-
// ============================================================================
|
|
520
|
-
|
|
521
|
-
export const maturitySchemas = {
|
|
522
|
-
MaturityStateSchema,
|
|
523
|
-
PatternMaturitySchema,
|
|
524
|
-
MaturityFeedbackSchema,
|
|
525
|
-
};
|