@alan512/experienceengine 0.2.1 → 0.3.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.
Files changed (186) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/.mcp.json +5 -6
  3. package/README.md +24 -10
  4. package/README.zh-CN.md +22 -8
  5. package/dist/adapters/codex/action-registry.d.ts +23 -1
  6. package/dist/adapters/codex/action-registry.js +73 -0
  7. package/dist/adapters/codex/action-registry.js.map +1 -1
  8. package/dist/adapters/codex/behavior-loop.d.ts +80 -0
  9. package/dist/adapters/codex/behavior-loop.js +189 -0
  10. package/dist/adapters/codex/behavior-loop.js.map +1 -0
  11. package/dist/adapters/codex/mcp-server.d.ts +27 -72
  12. package/dist/adapters/codex/mcp-server.js +36 -160
  13. package/dist/adapters/codex/mcp-server.js.map +1 -1
  14. package/dist/cli/commands/claude-hook.d.ts +4 -0
  15. package/dist/cli/commands/claude-hook.js +105 -21
  16. package/dist/cli/commands/claude-hook.js.map +1 -1
  17. package/dist/cli/commands/codex-hook.d.ts +22 -0
  18. package/dist/cli/commands/codex-hook.js +298 -0
  19. package/dist/cli/commands/codex-hook.js.map +1 -0
  20. package/dist/cli/commands/config.js +9 -1
  21. package/dist/cli/commands/config.js.map +1 -1
  22. package/dist/cli/commands/doctor.js +63 -1
  23. package/dist/cli/commands/doctor.js.map +1 -1
  24. package/dist/cli/commands/inspect.d.ts +1 -1
  25. package/dist/cli/commands/inspect.js +325 -1
  26. package/dist/cli/commands/inspect.js.map +1 -1
  27. package/dist/cli/commands/install.js +4 -1
  28. package/dist/cli/commands/install.js.map +1 -1
  29. package/dist/cli/commands/maintenance.js +4 -0
  30. package/dist/cli/commands/maintenance.js.map +1 -1
  31. package/dist/cli/commands/repair.js +35 -3
  32. package/dist/cli/commands/repair.js.map +1 -1
  33. package/dist/cli/commands/status.js +27 -0
  34. package/dist/cli/commands/status.js.map +1 -1
  35. package/dist/cli/commands/upgrade.js +2 -0
  36. package/dist/cli/commands/upgrade.js.map +1 -1
  37. package/dist/cli/dispatch.js +8 -3
  38. package/dist/cli/dispatch.js.map +1 -1
  39. package/dist/config/config-schema.d.ts +8 -0
  40. package/dist/config/config-schema.js +6 -0
  41. package/dist/config/config-schema.js.map +1 -1
  42. package/dist/config/default-config.js +1 -0
  43. package/dist/config/default-config.js.map +1 -1
  44. package/dist/config/load-config.js +3 -0
  45. package/dist/config/load-config.js.map +1 -1
  46. package/dist/controller/candidate-retriever.d.ts +4 -1
  47. package/dist/controller/candidate-retriever.js +129 -13
  48. package/dist/controller/candidate-retriever.js.map +1 -1
  49. package/dist/controller/injection-renderer.d.ts +2 -2
  50. package/dist/controller/injection-renderer.js +22 -3
  51. package/dist/controller/injection-renderer.js.map +1 -1
  52. package/dist/controller/injection-scorecard.js +3 -0
  53. package/dist/controller/injection-scorecard.js.map +1 -1
  54. package/dist/controller/intervention-controller.d.ts +2 -2
  55. package/dist/controller/intervention-controller.js +183 -25
  56. package/dist/controller/intervention-controller.js.map +1 -1
  57. package/dist/controller/model-reranker-mode.d.ts +4 -0
  58. package/dist/controller/model-reranker-mode.js +14 -0
  59. package/dist/controller/model-reranker-mode.js.map +1 -0
  60. package/dist/controller/model-reranker.d.ts +0 -1
  61. package/dist/controller/model-reranker.js +1 -13
  62. package/dist/controller/model-reranker.js.map +1 -1
  63. package/dist/controller/policy-enricher.d.ts +2 -1
  64. package/dist/controller/policy-enricher.js +71 -11
  65. package/dist/controller/policy-enricher.js.map +1 -1
  66. package/dist/evaluation/openclaw-scenarios.js +12 -5
  67. package/dist/evaluation/openclaw-scenarios.js.map +1 -1
  68. package/dist/experience-management/repo-policy.d.ts +53 -0
  69. package/dist/experience-management/repo-policy.js +175 -0
  70. package/dist/experience-management/repo-policy.js.map +1 -0
  71. package/dist/hybrid/capsule-builder.js +2 -0
  72. package/dist/hybrid/capsule-builder.js.map +1 -1
  73. package/dist/input/scope-resolver.js +16 -4
  74. package/dist/input/scope-resolver.js.map +1 -1
  75. package/dist/install/claude-cli.js +38 -21
  76. package/dist/install/claude-cli.js.map +1 -1
  77. package/dist/install/claude-code-doctor.js +8 -3
  78. package/dist/install/claude-code-doctor.js.map +1 -1
  79. package/dist/install/claude-code-installer.js +5 -2
  80. package/dist/install/claude-code-installer.js.map +1 -1
  81. package/dist/install/claude-runtime-target.d.ts +5 -0
  82. package/dist/install/claude-runtime-target.js +32 -2
  83. package/dist/install/claude-runtime-target.js.map +1 -1
  84. package/dist/install/codex-cli.d.ts +7 -0
  85. package/dist/install/codex-cli.js +43 -20
  86. package/dist/install/codex-cli.js.map +1 -1
  87. package/dist/install/codex-hooks.d.ts +42 -0
  88. package/dist/install/codex-hooks.js +280 -0
  89. package/dist/install/codex-hooks.js.map +1 -0
  90. package/dist/install/codex-installer.d.ts +21 -3
  91. package/dist/install/codex-installer.js +98 -9
  92. package/dist/install/codex-installer.js.map +1 -1
  93. package/dist/install/codex-runtime-target.d.ts +20 -0
  94. package/dist/install/codex-runtime-target.js +85 -17
  95. package/dist/install/codex-runtime-target.js.map +1 -1
  96. package/dist/install/openclaw-cli.d.ts +1 -0
  97. package/dist/install/openclaw-cli.js +52 -3
  98. package/dist/install/openclaw-cli.js.map +1 -1
  99. package/dist/install/openclaw-installer.d.ts +5 -0
  100. package/dist/install/openclaw-installer.js +24 -5
  101. package/dist/install/openclaw-installer.js.map +1 -1
  102. package/dist/install/public-install.d.ts +1 -0
  103. package/dist/install/public-install.js +5 -0
  104. package/dist/install/public-install.js.map +1 -1
  105. package/dist/interaction/repo-summary.d.ts +17 -0
  106. package/dist/interaction/repo-summary.js +33 -15
  107. package/dist/interaction/repo-summary.js.map +1 -1
  108. package/dist/interaction/retrieval-policy-inspection.d.ts +19 -0
  109. package/dist/interaction/retrieval-policy-inspection.js +33 -0
  110. package/dist/interaction/retrieval-policy-inspection.js.map +1 -0
  111. package/dist/interaction/service.d.ts +24 -1
  112. package/dist/interaction/service.js +171 -12
  113. package/dist/interaction/service.js.map +1 -1
  114. package/dist/maintenance/claude-validate-print.d.ts +8 -1
  115. package/dist/maintenance/claude-validate-print.js +52 -2
  116. package/dist/maintenance/claude-validate-print.js.map +1 -1
  117. package/dist/maintenance/experience-export-drafts.d.ts +56 -0
  118. package/dist/maintenance/experience-export-drafts.js +217 -0
  119. package/dist/maintenance/experience-export-drafts.js.map +1 -0
  120. package/dist/maintenance/experience-hygiene.d.ts +38 -0
  121. package/dist/maintenance/experience-hygiene.js +266 -0
  122. package/dist/maintenance/experience-hygiene.js.map +1 -0
  123. package/dist/maintenance/operator-review-flow.d.ts +81 -0
  124. package/dist/maintenance/operator-review-flow.js +172 -0
  125. package/dist/maintenance/operator-review-flow.js.map +1 -0
  126. package/dist/plugin/openclaw-plugin.d.ts +5 -0
  127. package/dist/plugin/runtime-helpers.js +43 -1
  128. package/dist/plugin/runtime-helpers.js.map +1 -1
  129. package/dist/runtime/prompt-service.d.ts +51 -0
  130. package/dist/runtime/prompt-service.js +209 -0
  131. package/dist/runtime/prompt-service.js.map +1 -0
  132. package/dist/runtime/service.d.ts +7 -2
  133. package/dist/runtime/service.js +176 -25
  134. package/dist/runtime/service.js.map +1 -1
  135. package/dist/store/sqlite/db.js +15 -0
  136. package/dist/store/sqlite/db.js.map +1 -1
  137. package/dist/store/sqlite/repositories/attribution-record-repo.d.ts +15 -0
  138. package/dist/store/sqlite/repositories/attribution-record-repo.js +111 -0
  139. package/dist/store/sqlite/repositories/attribution-record-repo.js.map +1 -0
  140. package/dist/store/sqlite/repositories/episode-repo.d.ts +14 -0
  141. package/dist/store/sqlite/repositories/episode-repo.js +84 -0
  142. package/dist/store/sqlite/repositories/episode-repo.js.map +1 -0
  143. package/dist/store/sqlite/repositories/injection-repo.d.ts +2 -0
  144. package/dist/store/sqlite/repositories/injection-repo.js +32 -5
  145. package/dist/store/sqlite/repositories/injection-repo.js.map +1 -1
  146. package/dist/store/sqlite/repositories/input-record-repo.d.ts +1 -0
  147. package/dist/store/sqlite/repositories/input-record-repo.js +23 -10
  148. package/dist/store/sqlite/repositories/input-record-repo.js.map +1 -1
  149. package/dist/store/sqlite/repositories/node-repo.d.ts +1 -0
  150. package/dist/store/sqlite/repositories/node-repo.js +10 -0
  151. package/dist/store/sqlite/repositories/node-repo.js.map +1 -1
  152. package/dist/store/sqlite/repositories/outcome-record-repo.d.ts +1 -0
  153. package/dist/store/sqlite/repositories/outcome-record-repo.js +11 -2
  154. package/dist/store/sqlite/repositories/outcome-record-repo.js.map +1 -1
  155. package/dist/store/sqlite/repositories/repo-policy-repo.d.ts +11 -0
  156. package/dist/store/sqlite/repositories/repo-policy-repo.js +87 -0
  157. package/dist/store/sqlite/repositories/repo-policy-repo.js.map +1 -0
  158. package/dist/store/sqlite/repositories/review-event-repo.d.ts +1 -0
  159. package/dist/store/sqlite/repositories/review-event-repo.js +11 -2
  160. package/dist/store/sqlite/repositories/review-event-repo.js.map +1 -1
  161. package/dist/store/sqlite/repositories/task-run-repo.d.ts +1 -0
  162. package/dist/store/sqlite/repositories/task-run-repo.js +11 -2
  163. package/dist/store/sqlite/repositories/task-run-repo.js.map +1 -1
  164. package/dist/store/sqlite/schema.sql +43 -0
  165. package/dist/store/vector/api-embedding-provider.js +14 -3
  166. package/dist/store/vector/api-embedding-provider.js.map +1 -1
  167. package/dist/store/vector/embeddings.js +5 -51
  168. package/dist/store/vector/embeddings.js.map +1 -1
  169. package/dist/store/vector/local-provider.js +14 -3
  170. package/dist/store/vector/local-provider.js.map +1 -1
  171. package/dist/types/domain.d.ts +89 -1
  172. package/dist/utils/text.js +5 -1
  173. package/dist/utils/text.js.map +1 -1
  174. package/docs/assets/readme/inspect-last-example.svg +37 -0
  175. package/docs/releases/v0.2.1.md +9 -0
  176. package/docs/releases/v0.3.0.md +20 -0
  177. package/docs/releases/v0.3.1.md +23 -0
  178. package/docs/user-guide.md +92 -7
  179. package/openclaw.plugin.json +1 -1
  180. package/package.json +3 -3
  181. package/plugins/claude-code-experienceengine/.claude-plugin/plugin.json +1 -1
  182. package/plugins/claude-code-experienceengine/.mcp.json +3 -9
  183. package/plugins/claude-code-experienceengine/scripts/install-deps.sh +1 -1
  184. package/plugins/claude-code-experienceengine/scripts/mcp-server.sh +43 -0
  185. package/scripts/claude-plugin/claude-hook.sh +6 -1
  186. package/scripts/claude-plugin/mcp-server.sh +45 -0
@@ -0,0 +1,38 @@
1
+ import type { AttributionRecord, ExperienceCandidate, ExperienceNode } from "../types/domain.js";
2
+ export type HygieneFindingType = "stale_experience" | "duplicate_guidance" | "conflicting_guidance" | "over_generalized_guidance" | "evidence_drift";
3
+ export type HygieneSeverity = "high" | "medium" | "low";
4
+ export type HygieneReviewFilters = {
5
+ scopeId?: string;
6
+ type?: HygieneFindingType;
7
+ severity?: HygieneSeverity;
8
+ limit?: number;
9
+ now?: string;
10
+ };
11
+ export type HygieneFinding = {
12
+ type: HygieneFindingType;
13
+ severity: HygieneSeverity;
14
+ affectedNodeIds: string[];
15
+ affectedCandidateIds: string[];
16
+ evidenceSummary: string;
17
+ recommendation: string;
18
+ evidenceRefs: string[];
19
+ createdAt: string;
20
+ };
21
+ export type HygieneReviewReport = {
22
+ scopeId?: string;
23
+ generatedAt: string;
24
+ filters: Omit<HygieneReviewFilters, "now">;
25
+ summary: {
26
+ total: number;
27
+ byType: Record<HygieneFindingType, number>;
28
+ bySeverity: Record<HygieneSeverity, number>;
29
+ };
30
+ findings: HygieneFinding[];
31
+ };
32
+ export type BuildHygieneReviewInput = {
33
+ nodes: ExperienceNode[];
34
+ candidates: ExperienceCandidate[];
35
+ attributionRecords: AttributionRecord[];
36
+ filters?: HygieneReviewFilters;
37
+ };
38
+ export declare const buildHygieneReviewReport: (input: BuildHygieneReviewInput) => HygieneReviewReport;
@@ -0,0 +1,266 @@
1
+ const FINDING_TYPES = [
2
+ "stale_experience",
3
+ "duplicate_guidance",
4
+ "conflicting_guidance",
5
+ "over_generalized_guidance",
6
+ "evidence_drift"
7
+ ];
8
+ const SEVERITIES = ["high", "medium", "low"];
9
+ const REVIEWABLE_NODE_STATES = ["candidate", "priority_candidate", "active", "cooling"];
10
+ const REVIEWABLE_CANDIDATE_STATES = ["pending", "distilled", "failed"];
11
+ const DEFAULT_LIMIT = 20;
12
+ const STALE_DAYS = 90;
13
+ const TOKEN_SIMILARITY_THRESHOLD = 0.72;
14
+ const GENERIC_TERMS = new Set([
15
+ "always",
16
+ "before",
17
+ "careful",
18
+ "check",
19
+ "debug",
20
+ "ensure",
21
+ "every",
22
+ "first",
23
+ "fix",
24
+ "follow",
25
+ "issue",
26
+ "make",
27
+ "review",
28
+ "run",
29
+ "task",
30
+ "test",
31
+ "thing",
32
+ "use",
33
+ "verify",
34
+ "when"
35
+ ]);
36
+ const emptyTypeCounts = () => Object.fromEntries(FINDING_TYPES.map((type) => [type, 0]));
37
+ const emptySeverityCounts = () => Object.fromEntries(SEVERITIES.map((severity) => [severity, 0]));
38
+ const toMillis = (value) => {
39
+ if (!value) {
40
+ return undefined;
41
+ }
42
+ const parsed = Date.parse(value);
43
+ return Number.isFinite(parsed) ? parsed : undefined;
44
+ };
45
+ const ageDays = (referenceIso, value) => {
46
+ const reference = toMillis(referenceIso);
47
+ const current = toMillis(value);
48
+ if (reference === undefined || current === undefined) {
49
+ return undefined;
50
+ }
51
+ return Math.max(0, Math.floor((reference - current) / 86_400_000));
52
+ };
53
+ const normalizeText = (value) => (value ?? "")
54
+ .toLowerCase()
55
+ .replace(/[^a-z0-9_/\-.]+/g, " ")
56
+ .split(/\s+/)
57
+ .filter((token) => token.length > 2);
58
+ const guidanceTokens = (entry) => new Set([...normalizeText(entry.trigger_pattern), ...normalizeText(entry.compact_hint), ...normalizeText(entry.retrieval_text)]);
59
+ const tokenSimilarity = (left, right) => {
60
+ if (!left.size || !right.size) {
61
+ return 0;
62
+ }
63
+ let overlap = 0;
64
+ for (const token of left) {
65
+ if (right.has(token)) {
66
+ overlap += 1;
67
+ }
68
+ }
69
+ return overlap / Math.max(left.size, right.size);
70
+ };
71
+ const hasGenericGuidance = (entry) => {
72
+ const tokens = normalizeText(`${entry.trigger_pattern} ${entry.compact_hint}`);
73
+ const hasSpecificSignal = tokens.some((token) => token.includes("/") || token.includes(".") || token.includes("_") || token.length >= 12);
74
+ if (tokens.length < 8) {
75
+ return !hasSpecificSignal;
76
+ }
77
+ const genericCount = tokens.filter((token) => GENERIC_TERMS.has(token)).length;
78
+ return genericCount / tokens.length >= 0.45;
79
+ };
80
+ const hasRecommendationConflict = (left, right) => {
81
+ const leftRecommended = new Set((left.recommended_steps ?? []).flatMap(normalizeText));
82
+ const leftAvoided = new Set((left.avoid_steps ?? []).flatMap(normalizeText));
83
+ const rightRecommended = new Set((right.recommended_steps ?? []).flatMap(normalizeText));
84
+ const rightAvoided = new Set((right.avoid_steps ?? []).flatMap(normalizeText));
85
+ const overlaps = (a, b) => {
86
+ for (const token of a) {
87
+ if (b.has(token) && !GENERIC_TERMS.has(token)) {
88
+ return true;
89
+ }
90
+ }
91
+ return false;
92
+ };
93
+ return overlaps(leftRecommended, rightAvoided) || overlaps(rightRecommended, leftAvoided);
94
+ };
95
+ const sortFindings = (findings) => {
96
+ const severityRank = { high: 0, medium: 1, low: 2 };
97
+ return findings.sort((left, right) => {
98
+ const severityDelta = severityRank[left.severity] - severityRank[right.severity];
99
+ if (severityDelta !== 0) {
100
+ return severityDelta;
101
+ }
102
+ const timeDelta = (toMillis(right.createdAt) ?? 0) - (toMillis(left.createdAt) ?? 0);
103
+ if (timeDelta !== 0) {
104
+ return timeDelta;
105
+ }
106
+ return left.type.localeCompare(right.type) || left.affectedNodeIds.join(",").localeCompare(right.affectedNodeIds.join(","));
107
+ });
108
+ };
109
+ export const buildHygieneReviewReport = (input) => {
110
+ const filters = input.filters ?? {};
111
+ const generatedAt = filters.now ?? new Date().toISOString();
112
+ const nodes = input.nodes.filter((node) => (!filters.scopeId || node.scope_id === filters.scopeId) && REVIEWABLE_NODE_STATES.includes(node.state));
113
+ const candidates = input.candidates.filter((candidate) => (!filters.scopeId || candidate.scope_id === filters.scopeId) && REVIEWABLE_CANDIDATE_STATES.includes(candidate.lifecycle_state));
114
+ const attributionByNode = new Map();
115
+ for (const record of input.attributionRecords) {
116
+ if (!filters.scopeId || nodes.some((node) => node.id === record.node_id)) {
117
+ const records = attributionByNode.get(record.node_id) ?? [];
118
+ records.push(record);
119
+ attributionByNode.set(record.node_id, records);
120
+ }
121
+ }
122
+ const findings = [];
123
+ for (const node of nodes.filter((candidate) => candidate.state === "active" || candidate.state === "cooling")) {
124
+ const lastPositive = node.last_helped_at;
125
+ const lastEvidenceAt = node.last_used_at ?? node.updated_at;
126
+ const staleAge = ageDays(generatedAt, lastEvidenceAt);
127
+ if ((staleAge ?? 0) >= STALE_DAYS && !lastPositive) {
128
+ findings.push({
129
+ type: "stale_experience",
130
+ severity: node.delivery_state === "eligible" ? "medium" : "low",
131
+ affectedNodeIds: [node.id],
132
+ affectedCandidateIds: [],
133
+ evidenceSummary: `Node has no recent helped attribution and has not been used for ${staleAge} day(s).`,
134
+ recommendation: "Inspect this node and review whether cooling or retirement should be handled through explicit lifecycle controls.",
135
+ evidenceRefs: node.origin_record_ids,
136
+ createdAt: node.last_used_at ?? node.updated_at
137
+ });
138
+ }
139
+ }
140
+ for (let i = 0; i < nodes.length; i += 1) {
141
+ for (let j = i + 1; j < nodes.length; j += 1) {
142
+ const left = nodes[i];
143
+ const right = nodes[j];
144
+ if (left.scope_id !== right.scope_id || left.task_type !== right.task_type) {
145
+ continue;
146
+ }
147
+ const similarity = tokenSimilarity(guidanceTokens(left), guidanceTokens(right));
148
+ if (similarity >= TOKEN_SIMILARITY_THRESHOLD) {
149
+ findings.push({
150
+ type: "duplicate_guidance",
151
+ severity: "medium",
152
+ affectedNodeIds: [left.id, right.id],
153
+ affectedCandidateIds: [],
154
+ evidenceSummary: `Same-scope ${left.task_type} nodes have ${similarity.toFixed(2)} lexical guidance overlap.`,
155
+ recommendation: "Review whether these nodes should stay separate or be merged through a separate explicit workflow.",
156
+ evidenceRefs: [...left.origin_record_ids, ...right.origin_record_ids],
157
+ createdAt: left.updated_at > right.updated_at ? left.updated_at : right.updated_at
158
+ });
159
+ }
160
+ if (hasRecommendationConflict(left, right)) {
161
+ findings.push({
162
+ type: "conflicting_guidance",
163
+ severity: "high",
164
+ affectedNodeIds: [left.id, right.id],
165
+ affectedCandidateIds: [],
166
+ evidenceSummary: `Same-scope ${left.task_type} nodes contain overlapping recommended and avoided paths.`,
167
+ recommendation: "Review the conflicting guidance before allowing either lesson to guide similar work.",
168
+ evidenceRefs: [...left.origin_record_ids, ...right.origin_record_ids],
169
+ createdAt: left.updated_at > right.updated_at ? left.updated_at : right.updated_at
170
+ });
171
+ }
172
+ }
173
+ }
174
+ for (const candidate of candidates) {
175
+ for (const node of nodes) {
176
+ if (candidate.scope_id !== node.scope_id || candidate.task_type !== node.task_type) {
177
+ continue;
178
+ }
179
+ const similarity = tokenSimilarity(guidanceTokens(candidate), guidanceTokens(node));
180
+ if (similarity >= TOKEN_SIMILARITY_THRESHOLD) {
181
+ findings.push({
182
+ type: "duplicate_guidance",
183
+ severity: "low",
184
+ affectedNodeIds: [node.id],
185
+ affectedCandidateIds: [candidate.id],
186
+ evidenceSummary: `Raw candidate overlaps with existing node at ${similarity.toFixed(2)} lexical guidance similarity.`,
187
+ recommendation: "Review the candidate before promotion; do not discard or merge it from the hygiene report.",
188
+ evidenceRefs: [candidate.source_record_id, ...node.origin_record_ids],
189
+ createdAt: candidate.updated_at > node.updated_at ? candidate.updated_at : node.updated_at
190
+ });
191
+ }
192
+ }
193
+ }
194
+ for (const node of nodes) {
195
+ const harmedRatio = node.harmed_count / Math.max(1, node.helped_count + node.harmed_count);
196
+ if (hasGenericGuidance(node) && (node.support_count <= 1 || harmedRatio >= 0.4)) {
197
+ findings.push({
198
+ type: "over_generalized_guidance",
199
+ severity: harmedRatio >= 0.5 ? "high" : "medium",
200
+ affectedNodeIds: [node.id],
201
+ affectedCandidateIds: [],
202
+ evidenceSummary: "Node wording is broad while support is weak or harm evidence is elevated.",
203
+ recommendation: "Review whether the lesson should be narrowed, cooled, or retired through explicit controls.",
204
+ evidenceRefs: [...node.origin_record_ids, ...node.harmed_record_ids],
205
+ createdAt: node.last_harmed_at ?? node.updated_at
206
+ });
207
+ }
208
+ }
209
+ for (const candidate of candidates) {
210
+ if (hasGenericGuidance(candidate) && candidate.lifecycle_state !== "discarded") {
211
+ findings.push({
212
+ type: "over_generalized_guidance",
213
+ severity: "low",
214
+ affectedNodeIds: [],
215
+ affectedCandidateIds: [candidate.id],
216
+ evidenceSummary: "Raw candidate wording is broad and should be checked before promotion.",
217
+ recommendation: "Review whether the candidate needs narrower trigger or hint wording before distillation.",
218
+ evidenceRefs: [candidate.source_record_id],
219
+ createdAt: candidate.updated_at
220
+ });
221
+ }
222
+ }
223
+ for (const node of nodes) {
224
+ if (node.delivery_state !== "eligible" && node.delivery_state !== "conservative_only") {
225
+ continue;
226
+ }
227
+ const recentHarm = (attributionByNode.get(node.id) ?? []).find((record) => record.attribution_verdict === "strong_harmed" || record.attribution_verdict === "weak_harmed");
228
+ if (recentHarm) {
229
+ findings.push({
230
+ type: "evidence_drift",
231
+ severity: recentHarm.attribution_verdict === "strong_harmed" ? "high" : "medium",
232
+ affectedNodeIds: [node.id],
233
+ affectedCandidateIds: [],
234
+ evidenceSummary: `Delivery-state ${node.delivery_state} node has recent ${recentHarm.attribution_verdict} attribution evidence.`,
235
+ recommendation: "Inspect the attribution evidence before relying on this node in similar live tasks.",
236
+ evidenceRefs: recentHarm.evidence_refs,
237
+ createdAt: recentHarm.created_at
238
+ });
239
+ }
240
+ }
241
+ const filtered = sortFindings(findings).filter((finding) => (!filters.type || finding.type === filters.type) && (!filters.severity || finding.severity === filters.severity));
242
+ const bounded = filtered.slice(0, filters.limit ?? DEFAULT_LIMIT);
243
+ const byType = emptyTypeCounts();
244
+ const bySeverity = emptySeverityCounts();
245
+ for (const finding of bounded) {
246
+ byType[finding.type] += 1;
247
+ bySeverity[finding.severity] += 1;
248
+ }
249
+ return {
250
+ scopeId: filters.scopeId,
251
+ generatedAt,
252
+ filters: {
253
+ scopeId: filters.scopeId,
254
+ type: filters.type,
255
+ severity: filters.severity,
256
+ limit: filters.limit ?? DEFAULT_LIMIT
257
+ },
258
+ summary: {
259
+ total: bounded.length,
260
+ byType,
261
+ bySeverity
262
+ },
263
+ findings: bounded
264
+ };
265
+ };
266
+ //# sourceMappingURL=experience-hygiene.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"experience-hygiene.js","sourceRoot":"","sources":["../../src/maintenance/experience-hygiene.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,81 @@
1
+ import type { ExperienceRepoSummary } from "../interaction/repo-summary.js";
2
+ import type { ExperienceExportDraftReport } from "./experience-export-drafts.js";
3
+ import type { HygieneReviewReport } from "./experience-hygiene.js";
4
+ export type OperatorReviewPriority = "high" | "medium" | "low";
5
+ export type OperatorReviewSource = "repo_policy" | "hygiene" | "export_drafts";
6
+ export type RepoPolicyReviewHealth = "clear" | "attention" | "tripped";
7
+ export type OperatorReviewDrillDown = {
8
+ cli: string;
9
+ mcpResource?: string;
10
+ brokerAction?: string;
11
+ };
12
+ export type OperatorReviewItem = {
13
+ priority: OperatorReviewPriority;
14
+ source: OperatorReviewSource;
15
+ title: string;
16
+ summary: string;
17
+ drillDown: OperatorReviewDrillDown;
18
+ };
19
+ export type OperatorReviewNextAction = {
20
+ priority: OperatorReviewPriority;
21
+ summary: string;
22
+ drillDown?: OperatorReviewDrillDown;
23
+ };
24
+ export type OperatorReviewReport = {
25
+ scopeId: string;
26
+ generatedAt: string;
27
+ filters: {
28
+ scopeId?: string;
29
+ limit: number;
30
+ };
31
+ sections: {
32
+ repo_policy: {
33
+ health: RepoPolicyReviewHealth;
34
+ configuredMode?: string;
35
+ effectiveMode?: string;
36
+ circuitState?: string;
37
+ circuitReason?: string;
38
+ summary: string;
39
+ drillDown: OperatorReviewDrillDown;
40
+ };
41
+ hygiene: {
42
+ total: number;
43
+ high: number;
44
+ medium: number;
45
+ low: number;
46
+ surfacedFindings: Array<{
47
+ severity: "high" | "medium" | "low";
48
+ type: string;
49
+ summary: string;
50
+ affectedNodeIds: string[];
51
+ affectedCandidateIds: string[];
52
+ }>;
53
+ drillDown: OperatorReviewDrillDown;
54
+ };
55
+ export_drafts: {
56
+ total: number;
57
+ highRisk: number;
58
+ mediumRisk: number;
59
+ lowRisk: number;
60
+ surfacedDrafts: Array<{
61
+ draftId: string;
62
+ nodeIds: string[];
63
+ risk: "high" | "medium" | "low";
64
+ suggestedTargetType: string;
65
+ summary: string;
66
+ }>;
67
+ drillDown: OperatorReviewDrillDown;
68
+ };
69
+ };
70
+ reviewItems: OperatorReviewItem[];
71
+ recommendedReviewOrder: OperatorReviewSource[];
72
+ reviewOnlyNextActions: OperatorReviewNextAction[];
73
+ };
74
+ export type BuildOperatorReviewFlowInput = {
75
+ repo: ExperienceRepoSummary;
76
+ hygiene: HygieneReviewReport;
77
+ exportDrafts: ExperienceExportDraftReport;
78
+ limit?: number;
79
+ generatedAt?: string;
80
+ };
81
+ export declare const buildOperatorReviewFlow: (input: BuildOperatorReviewFlowInput) => OperatorReviewReport;
@@ -0,0 +1,172 @@
1
+ const DEFAULT_LIMIT = 5;
2
+ const PRIORITY_RANK = { high: 0, medium: 1, low: 2 };
3
+ const SOURCE_RANK = { repo_policy: 0, hygiene: 1, export_drafts: 2 };
4
+ const drillDowns = () => ({
5
+ repo_policy: {
6
+ cli: "ee inspect repo",
7
+ mcpResource: "experienceengine://repo-summary"
8
+ },
9
+ hygiene: {
10
+ cli: "ee inspect hygiene",
11
+ mcpResource: "experienceengine://hygiene",
12
+ brokerAction: "inspect_experience_hygiene"
13
+ },
14
+ export_drafts: {
15
+ cli: "ee inspect export-drafts",
16
+ mcpResource: "experienceengine://export-drafts",
17
+ brokerAction: "inspect_export_drafts"
18
+ }
19
+ });
20
+ const policyHealth = (repo) => {
21
+ if (repo.policy?.circuitState === "tripped") {
22
+ return "tripped";
23
+ }
24
+ if (repo.benchmark.verdict === "failing" || repo.policy?.effectiveMode === "strict") {
25
+ return "attention";
26
+ }
27
+ return "clear";
28
+ };
29
+ const policySummary = (repo, health) => {
30
+ if (health === "tripped") {
31
+ return repo.policy?.circuitReason ?? "Repo policy circuit is tripped.";
32
+ }
33
+ if (health === "attention") {
34
+ return `Repo review needs attention: benchmark=${repo.benchmark.verdict}, effectiveMode=${repo.policy?.effectiveMode ?? "unknown"}.`;
35
+ }
36
+ return "Repo policy is clear for normal review.";
37
+ };
38
+ const addReviewItem = (items, item) => {
39
+ items.push(item);
40
+ };
41
+ const sortedItems = (items) => [...items].sort((left, right) => {
42
+ const priorityDelta = PRIORITY_RANK[left.priority] - PRIORITY_RANK[right.priority];
43
+ if (priorityDelta !== 0) {
44
+ return priorityDelta;
45
+ }
46
+ return SOURCE_RANK[left.source] - SOURCE_RANK[right.source] || left.title.localeCompare(right.title);
47
+ });
48
+ const reviewOrder = (items) => {
49
+ const order = [];
50
+ for (const item of sortedItems(items)) {
51
+ if (!order.includes(item.source)) {
52
+ order.push(item.source);
53
+ }
54
+ }
55
+ for (const source of ["repo_policy", "hygiene", "export_drafts"]) {
56
+ if (!order.includes(source)) {
57
+ order.push(source);
58
+ }
59
+ }
60
+ return order;
61
+ };
62
+ export const buildOperatorReviewFlow = (input) => {
63
+ const limit = input.limit ?? DEFAULT_LIMIT;
64
+ const scopeId = input.repo.scope.scopeId;
65
+ const drillDown = drillDowns();
66
+ const health = policyHealth(input.repo);
67
+ const items = [];
68
+ if (health === "tripped") {
69
+ addReviewItem(items, {
70
+ priority: "high",
71
+ source: "repo_policy",
72
+ title: "Repo policy circuit is tripped",
73
+ summary: policySummary(input.repo, health),
74
+ drillDown: drillDown.repo_policy
75
+ });
76
+ }
77
+ else if (health === "attention") {
78
+ addReviewItem(items, {
79
+ priority: "medium",
80
+ source: "repo_policy",
81
+ title: "Repo policy needs attention",
82
+ summary: policySummary(input.repo, health),
83
+ drillDown: drillDown.repo_policy
84
+ });
85
+ }
86
+ for (const finding of input.hygiene.findings.slice(0, limit)) {
87
+ addReviewItem(items, {
88
+ priority: finding.severity,
89
+ source: "hygiene",
90
+ title: `${finding.type} hygiene finding`,
91
+ summary: finding.evidenceSummary,
92
+ drillDown: drillDown.hygiene
93
+ });
94
+ }
95
+ const riskyHygiene = input.hygiene.summary.bySeverity.high > 0;
96
+ for (const draft of input.exportDrafts.drafts.slice(0, limit)) {
97
+ const priority = draft.risk === "high" ? "high" : draft.risk === "medium" || riskyHygiene ? "medium" : "low";
98
+ addReviewItem(items, {
99
+ priority,
100
+ source: "export_drafts",
101
+ title: `Export draft ${draft.draftId}`,
102
+ summary: riskyHygiene
103
+ ? `Review hygiene risk before exporting ${draft.suggestedTargetType}.`
104
+ : `Review ${draft.suggestedTargetType} candidate for ${draft.taskFamily}.`,
105
+ drillDown: drillDown.export_drafts
106
+ });
107
+ }
108
+ const reviewItems = sortedItems(items);
109
+ const nextActions = reviewItems.length
110
+ ? reviewItems.slice(0, 3).map((item) => ({
111
+ priority: item.priority,
112
+ summary: `Review ${item.source}: ${item.summary}`,
113
+ drillDown: item.drillDown
114
+ }))
115
+ : [
116
+ {
117
+ priority: "low",
118
+ summary: "No immediate review items. Keep monitoring repo policy, hygiene, and export drafts."
119
+ }
120
+ ];
121
+ return {
122
+ scopeId,
123
+ generatedAt: input.generatedAt ?? new Date().toISOString(),
124
+ filters: {
125
+ scopeId,
126
+ limit
127
+ },
128
+ sections: {
129
+ repo_policy: {
130
+ health,
131
+ configuredMode: input.repo.policy?.configuredMode,
132
+ effectiveMode: input.repo.policy?.effectiveMode,
133
+ circuitState: input.repo.policy?.circuitState,
134
+ circuitReason: input.repo.policy?.circuitReason,
135
+ summary: policySummary(input.repo, health),
136
+ drillDown: drillDown.repo_policy
137
+ },
138
+ hygiene: {
139
+ total: input.hygiene.summary.total,
140
+ high: input.hygiene.summary.bySeverity.high,
141
+ medium: input.hygiene.summary.bySeverity.medium,
142
+ low: input.hygiene.summary.bySeverity.low,
143
+ surfacedFindings: input.hygiene.findings.slice(0, limit).map((finding) => ({
144
+ severity: finding.severity,
145
+ type: finding.type,
146
+ summary: finding.evidenceSummary,
147
+ affectedNodeIds: finding.affectedNodeIds,
148
+ affectedCandidateIds: finding.affectedCandidateIds
149
+ })),
150
+ drillDown: drillDown.hygiene
151
+ },
152
+ export_drafts: {
153
+ total: input.exportDrafts.summary.total,
154
+ highRisk: input.exportDrafts.summary.byRisk.high,
155
+ mediumRisk: input.exportDrafts.summary.byRisk.medium,
156
+ lowRisk: input.exportDrafts.summary.byRisk.low,
157
+ surfacedDrafts: input.exportDrafts.drafts.slice(0, limit).map((draft) => ({
158
+ draftId: draft.draftId,
159
+ nodeIds: draft.nodeIds,
160
+ risk: draft.risk,
161
+ suggestedTargetType: draft.suggestedTargetType,
162
+ summary: draft.evidenceSummary
163
+ })),
164
+ drillDown: drillDown.export_drafts
165
+ }
166
+ },
167
+ reviewItems,
168
+ recommendedReviewOrder: reviewOrder(reviewItems),
169
+ reviewOnlyNextActions: nextActions
170
+ };
171
+ };
172
+ //# sourceMappingURL=operator-review-flow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operator-review-flow.js","sourceRoot":"","sources":["../../src/maintenance/operator-review-flow.ts"],"names":[],"mappings":"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"}
@@ -74,6 +74,11 @@ declare const plugin: {
74
74
  readonly enum: readonly ["live", "shadow", "holdout"];
75
75
  readonly description: "Controls whether ExperienceEngine delivers interventions live, suppresses them in shadow mode, or randomly withholds them for holdout evaluation.";
76
76
  };
77
+ readonly repoExperienceMode: {
78
+ readonly type: "string";
79
+ readonly enum: readonly ["safe", "fast_learning", "strict"];
80
+ readonly description: "Repo-level policy mode for diagnostic candidate aggressiveness. It does not override disabled scopes or delivery-state safety gates.";
81
+ };
77
82
  readonly holdoutRate: {
78
83
  readonly type: "number";
79
84
  readonly minimum: 0;