@evomap/evolver-core 2.0.0-beta.8 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (147) hide show
  1. package/dist/algo/candidateAssembly.d.ts +7 -2
  2. package/dist/algo/candidateAssembly.js +81 -13
  3. package/dist/algo/capabilityCandidates.js +10 -0
  4. package/dist/algo/conversationSniffer.js +20 -7
  5. package/dist/algo/cycleEngine.d.ts +23 -2
  6. package/dist/algo/cycleEngine.js +236 -36
  7. package/dist/algo/exploration.d.ts +7 -0
  8. package/dist/algo/exploration.js +16 -3
  9. package/dist/algo/geneHealth.d.ts +2 -2
  10. package/dist/algo/geneHealth.js +5 -4
  11. package/dist/algo/geneSelection.d.ts +63 -5
  12. package/dist/algo/geneSelection.js +330 -30
  13. package/dist/algo/index.d.ts +2 -0
  14. package/dist/algo/index.js +2 -0
  15. package/dist/algo/orchestrator.d.ts +8 -1
  16. package/dist/algo/orchestrator.js +15 -3
  17. package/dist/algo/publishEligibility.d.ts +34 -0
  18. package/dist/algo/publishEligibility.js +52 -0
  19. package/dist/algo/ucb1.d.ts +53 -0
  20. package/dist/algo/ucb1.js +156 -0
  21. package/dist/assetstore/assetSidecarRecords.d.ts +7 -2
  22. package/dist/assetstore/assetSidecarRecords.js +238 -0
  23. package/dist/assetstore/assetSidecarRecovery.js +2 -2
  24. package/dist/assetstore/assetStoreHealth.d.ts +6 -0
  25. package/dist/assetstore/assetStoreHealth.js +56 -14
  26. package/dist/assetstore/assetStoreStorage.d.ts +1 -1
  27. package/dist/assetstore/assetStoreStorage.js +27 -9
  28. package/dist/assetstore/assetSyncLedger.d.ts +86 -0
  29. package/dist/assetstore/assetSyncLedger.js +683 -4
  30. package/dist/assetstore/index.d.ts +1 -0
  31. package/dist/assetstore/index.js +1 -0
  32. package/dist/assetstore/localAssetStoreSnapshot.d.ts +51 -0
  33. package/dist/assetstore/localAssetStoreSnapshot.js +329 -0
  34. package/dist/assetstore/localJsonl.d.ts +4 -2
  35. package/dist/assetstore/localJsonl.js +91 -11
  36. package/dist/assetstore/provenance.d.ts +80 -4
  37. package/dist/assetstore/provenance.js +313 -5
  38. package/dist/assetstore/provider.d.ts +58 -1
  39. package/dist/assetstore/provider.js +97 -6
  40. package/dist/benchmark/antiGeneBenchmark.d.ts +2 -0
  41. package/dist/benchmark/antiGeneBenchmark.js +4 -3
  42. package/dist/benchmark/antiGeneRollout.d.ts +2 -0
  43. package/dist/benchmark/antiGeneRollout.js +4 -3
  44. package/dist/benchmark/index.d.ts +2 -1
  45. package/dist/benchmark/index.js +2 -1
  46. package/dist/benchmark/selectionFlatAbstention.d.ts +152 -0
  47. package/dist/benchmark/selectionFlatAbstention.js +481 -0
  48. package/dist/bootstrap/envFingerprint.d.ts +9 -0
  49. package/dist/bootstrap/envFingerprint.js +5 -0
  50. package/dist/bootstrap/index.d.ts +2 -1
  51. package/dist/bootstrap/index.js +2 -1
  52. package/dist/bootstrap/v1EnvCompat.d.ts +111 -0
  53. package/dist/bootstrap/v1EnvCompat.js +280 -0
  54. package/dist/events/eventArchive.d.ts +2 -0
  55. package/dist/events/eventArchive.js +13 -3
  56. package/dist/events/eventSchema.d.ts +7 -7
  57. package/dist/events/eventStore.d.ts +2 -0
  58. package/dist/events/eventStore.js +5 -1
  59. package/dist/events/ingest.d.ts +1 -0
  60. package/dist/events/ingest.js +1 -0
  61. package/dist/events/paths.d.ts +3 -1
  62. package/dist/events/paths.js +4 -0
  63. package/dist/events/public.d.ts +2 -2
  64. package/dist/events/public.js +2 -2
  65. package/dist/events/reports.d.ts +2 -0
  66. package/dist/events/reports.js +4 -0
  67. package/dist/exec/autoExec.d.ts +43 -2
  68. package/dist/exec/autoExec.js +76 -9
  69. package/dist/exec/autonomousCycle.d.ts +22 -4
  70. package/dist/exec/autonomousCycle.js +64 -13
  71. package/dist/exec/claudeBridge.d.ts +32 -7
  72. package/dist/exec/claudeBridge.js +281 -29
  73. package/dist/exec/prompt.js +5 -1
  74. package/dist/exec/runnerRegistry.d.ts +68 -26
  75. package/dist/exec/runnerRegistry.js +307 -72
  76. package/dist/exec/selfPr.js +1 -7
  77. package/dist/feedback/envelope.d.ts +61 -0
  78. package/dist/feedback/envelope.js +168 -0
  79. package/dist/feedback/index.d.ts +1 -0
  80. package/dist/feedback/index.js +1 -0
  81. package/dist/hooks/hooks.js +1 -0
  82. package/dist/hub/assetCallLog.d.ts +35 -1
  83. package/dist/hub/assetCallLog.js +124 -1
  84. package/dist/hub/bindings.d.ts +8 -1
  85. package/dist/hub/bindings.js +17 -6
  86. package/dist/hub/capability.d.ts +90 -3
  87. package/dist/hub/fake.d.ts +2 -2
  88. package/dist/hub/fake.js +1 -1
  89. package/dist/hub/questionGenerator.d.ts +5 -1
  90. package/dist/hub/questionGenerator.js +8 -6
  91. package/dist/hub/sanitize.js +3 -2
  92. package/dist/index.d.ts +3 -1
  93. package/dist/index.js +4 -1
  94. package/dist/mailbox/dispatch.d.ts +1 -1
  95. package/dist/mailbox/dispatch.js +22 -6
  96. package/dist/mailbox/envelope.d.ts +7 -1
  97. package/dist/mailbox/envelope.js +9 -2
  98. package/dist/mailbox/ipcServer.d.ts +10 -2
  99. package/dist/mailbox/ipcServer.js +163 -13
  100. package/dist/mailbox/store.d.ts +89 -3
  101. package/dist/mailbox/store.js +895 -41
  102. package/dist/ops/evolutionGraphProjection.d.ts +20 -0
  103. package/dist/ops/evolutionGraphProjection.js +315 -0
  104. package/dist/ops/index.d.ts +2 -1
  105. package/dist/ops/index.js +2 -1
  106. package/dist/ops/selfUpdate.d.ts +8 -0
  107. package/dist/ops/selfUpdate.js +24 -8
  108. package/dist/personality/schema.d.ts +16 -16
  109. package/dist/schema/evolutionGraph.d.ts +784 -0
  110. package/dist/schema/evolutionGraph.js +187 -0
  111. package/dist/schema/index.d.ts +1 -0
  112. package/dist/schema/index.js +1 -0
  113. package/dist/schema/signal.d.ts +3 -3
  114. package/dist/schema/signal.js +1 -1
  115. package/dist/signals/curriculum.d.ts +55 -0
  116. package/dist/signals/curriculum.js +202 -0
  117. package/dist/signals/cycleHistoryFromEvents.js +17 -8
  118. package/dist/signals/expand.d.ts +15 -1
  119. package/dist/signals/expand.js +169 -1
  120. package/dist/signals/extractor.d.ts +2 -2
  121. package/dist/signals/extractor.js +31 -6
  122. package/dist/signals/index.d.ts +3 -1
  123. package/dist/signals/index.js +3 -1
  124. package/dist/signals/metaSignals.d.ts +4 -0
  125. package/dist/signals/metaSignals.js +42 -0
  126. package/dist/signals/signalGate.js +1 -1
  127. package/dist/signals/taskDomain.d.ts +22 -0
  128. package/dist/signals/taskDomain.js +43 -0
  129. package/dist/strategy/constraintAblation.d.ts +64 -0
  130. package/dist/strategy/constraintAblation.js +2820 -0
  131. package/dist/strategy/constraintAblationPredicates.d.ts +31 -0
  132. package/dist/strategy/constraintAblationPredicates.js +339 -0
  133. package/dist/strategy/index.d.ts +2 -1
  134. package/dist/strategy/index.js +2 -1
  135. package/dist/trace/index.d.ts +3 -1
  136. package/dist/trace/index.js +3 -1
  137. package/dist/trace/learningTrace.d.ts +209 -0
  138. package/dist/trace/learningTrace.js +276 -0
  139. package/dist/trace/proxyTurns.d.ts +31 -0
  140. package/dist/trace/proxyTurns.js +137 -0
  141. package/dist/verify/sandboxRunner.d.ts +28 -0
  142. package/dist/verify/sandboxRunner.js +218 -19
  143. package/dist/verify/sandboxedValidation.d.ts +9 -0
  144. package/dist/verify/sandboxedValidation.js +113 -13
  145. package/dist/verify/validation.d.ts +11 -1
  146. package/dist/verify/validation.js +31 -0
  147. package/package.json +5 -2
@@ -0,0 +1,31 @@
1
+ type ProvidedPrefixKind = 'conditional' | 'factual' | 'none';
2
+ interface PredicateTokenStream {
3
+ tokens: readonly {
4
+ value: string;
5
+ }[];
6
+ }
7
+ interface ProvidedPrefixLexicon {
8
+ commaDelimitedPrepositions: ReadonlySet<string>;
9
+ conditionalMarkers: ReadonlySet<string>;
10
+ irregularPastParticiples: ReadonlySet<string>;
11
+ irregularSimplePast: ReadonlySet<string>;
12
+ leadingClauseModifiers: ReadonlySet<string>;
13
+ passiveAuxiliaries: ReadonlySet<string>;
14
+ subjectArticles: ReadonlySet<string>;
15
+ }
16
+ interface ProvidedPrefixPredicates {
17
+ finiteClauseSubjectPolarity(source: string): 'absent' | 'negative' | 'positive';
18
+ hasIndependentAffirmativeAction(source: string, actionForms: ReadonlySet<string>): boolean;
19
+ isAttributiveTargetModifier(term: string): boolean;
20
+ isFinitePredicateTerm(term: string): boolean;
21
+ tokenize(source: string): PredicateTokenStream;
22
+ }
23
+ interface ProvidedPrefixInput {
24
+ actionForms: ReadonlySet<string>;
25
+ lexicon: ProvidedPrefixLexicon;
26
+ objectForms: readonly ReadonlySet<string>[];
27
+ predicates: ProvidedPrefixPredicates;
28
+ source: string;
29
+ }
30
+ export declare function classifyProvidedTargetPrefix(input: ProvidedPrefixInput): ProvidedPrefixKind;
31
+ export {};
@@ -0,0 +1,339 @@
1
+ const FACTUAL_TAIL_PREFIX_TERMS = new Set([
2
+ 'after', 'although', 'as', 'because', 'before', 'however', 'since', 'than', 'though',
3
+ 'whereas', 'yet',
4
+ ]);
5
+ const RELATIVE_TERMS = new Set(['that', 'which', 'who']);
6
+ const SUBORDINATOR_TERMS = new Set(['after', 'as', 'before']);
7
+ const NOMINAL_MODIFIER_TERMS = new Set([
8
+ 'access', 'audit', 'backup', 'cold', 'data', 'offline', 'ongoing',
9
+ 'policy', 'remote', 'secure', 'security', 'token',
10
+ ]);
11
+ const NOMINAL_HEAD_TERMS = new Set([
12
+ 'access', 'approval', 'archive', 'audit', 'auditor', 'credentials', 'data', 'details',
13
+ 'leak', 'leaks', 'metadata', 'policy', 'receipt', 'records', 'request', 'review', 'server',
14
+ 'storage', 'system', 'transit',
15
+ ]);
16
+ const MATRIX_NOMINAL_COLLOCATIONS = new Set(['access:policy']);
17
+ const OBJECT_COORDINATOR_TERMS = new Set(['and', 'or', 'then']);
18
+ const FACTUAL_COORDINATOR_TERMS = new Set(['and', 'but', 'then']);
19
+ const TRAILING_MODIFIER_TERMS = new Set([
20
+ 'earlier', 'here', 'now', 'soon', 'today', 'tonight', 'there', 'yesterday',
21
+ ]);
22
+ const MATRIX_PREDICATE_TERMS = new Set([
23
+ 'arrive', 'arrives', 'become', 'becomes', 'exist', 'exists', 'expire', 'expires',
24
+ 'leak', 'leaks', 'match', 'matches', 'pass', 'passes', 'remain', 'remains', 'trigger', 'triggers',
25
+ ]);
26
+ class ProvidedTargetPrefixClassifier {
27
+ input;
28
+ tokens;
29
+ matchedObjectForms = new Set();
30
+ matchedObjectIndexes = new Set();
31
+ constructor(input) {
32
+ this.input = input;
33
+ this.tokens = input.predicates.tokenize(input.source).tokens;
34
+ }
35
+ classify() {
36
+ const objectPrefixEnd = this.matchObjectPrefix();
37
+ if (objectPrefixEnd < 0)
38
+ return 'none';
39
+ if (this.hasFiniteNonObjectPrefix(objectPrefixEnd))
40
+ return 'conditional';
41
+ const tailStart = this.consumeRemainingObjectTerms(objectPrefixEnd + 1);
42
+ return this.classifyObjectTail(tailStart);
43
+ }
44
+ matchObjectPrefix() {
45
+ const requiredMatches = Math.min(2, this.input.objectForms.length);
46
+ const deferredOverlaps = [];
47
+ for (let tokenIndex = 0; tokenIndex < this.tokens.length; tokenIndex += 1) {
48
+ const [formIndex, ...overlaps] = this.unmatchedObjectFormIndexes(this.valueAt(tokenIndex));
49
+ if (formIndex === undefined)
50
+ continue;
51
+ this.matchedObjectForms.add(formIndex);
52
+ this.matchedObjectIndexes.add(tokenIndex);
53
+ deferredOverlaps.push(...overlaps.map((overlap) => ({ formIndex: overlap, tokenIndex })));
54
+ if (this.matchedObjectForms.size >= requiredMatches)
55
+ return tokenIndex;
56
+ }
57
+ for (const { formIndex, tokenIndex } of deferredOverlaps) {
58
+ if (this.matchedObjectForms.has(formIndex))
59
+ continue;
60
+ this.matchedObjectForms.add(formIndex);
61
+ this.matchedObjectIndexes.add(tokenIndex);
62
+ if (this.matchedObjectForms.size >= requiredMatches) {
63
+ return Math.max(...this.matchedObjectIndexes);
64
+ }
65
+ }
66
+ return -1;
67
+ }
68
+ unmatchedObjectFormIndexes(value) {
69
+ return this.input.objectForms.flatMap((forms, candidateIndex) => (!this.matchedObjectForms.has(candidateIndex) && forms.has(value) ? [candidateIndex] : []));
70
+ }
71
+ hasFiniteNonObjectPrefix(objectPrefixEnd) {
72
+ const prefix = this.tokens
73
+ .slice(0, objectPrefixEnd + 1)
74
+ .filter((_, index) => !this.matchedObjectIndexes.has(index))
75
+ .map((token) => token.value)
76
+ .join(' ');
77
+ return this.input.predicates.finiteClauseSubjectPolarity(prefix) !== 'absent'
78
+ || this.input.predicates.hasIndependentAffirmativeAction(prefix, this.input.actionForms);
79
+ }
80
+ skipModifiers(initialIndex) {
81
+ let index = initialIndex;
82
+ while (index < this.tokens.length && this.isSkippableModifier(this.valueAt(index)))
83
+ index += 1;
84
+ return index;
85
+ }
86
+ isSkippableModifier(term) {
87
+ return this.input.lexicon.leadingClauseModifiers.has(term)
88
+ || TRAILING_MODIFIER_TERMS.has(term)
89
+ || /ly$/u.test(term);
90
+ }
91
+ consumeRemainingObjectTerms(initialIndex) {
92
+ let index = this.skipModifiers(initialIndex);
93
+ const remaining = new Set(this.input.objectForms.keys());
94
+ for (const matched of this.matchedObjectForms)
95
+ remaining.delete(matched);
96
+ while (index < this.tokens.length) {
97
+ const candidate = [...remaining].find((formIndex) => (this.input.objectForms[formIndex]?.has(this.valueAt(index))));
98
+ if (candidate === undefined)
99
+ break;
100
+ remaining.delete(candidate);
101
+ index = this.skipModifiers(index + 1);
102
+ }
103
+ return index;
104
+ }
105
+ isPastPredicate(term) {
106
+ return term.endsWith('ed')
107
+ || this.input.lexicon.irregularSimplePast.has(term)
108
+ || this.input.lexicon.irregularPastParticiples.has(term);
109
+ }
110
+ consumeNominal(initialIndex) {
111
+ let index = this.skipModifiers(initialIndex);
112
+ if (this.input.lexicon.subjectArticles.has(this.valueAt(index)))
113
+ index += 1;
114
+ while (index + 1 < this.tokens.length && this.isSimpleNominalModifier(this.valueAt(index)))
115
+ index += 1;
116
+ if (index < this.tokens.length)
117
+ index += 1;
118
+ return this.skipModifiers(index);
119
+ }
120
+ isSimpleNominalModifier(term) {
121
+ return this.input.predicates.isAttributiveTargetModifier(term) || NOMINAL_MODIFIER_TERMS.has(term);
122
+ }
123
+ isObjectForm(term) {
124
+ return this.input.objectForms.some((forms) => forms.has(term));
125
+ }
126
+ isMatrixPredicate(term) {
127
+ return MATRIX_PREDICATE_TERMS.has(term)
128
+ || this.input.predicates.isFinitePredicateTerm(term)
129
+ || (this.input.actionForms.has(term) && !this.isObjectForm(term));
130
+ }
131
+ isNominalHead(term) {
132
+ return NOMINAL_HEAD_TERMS.has(term) || this.isObjectForm(term);
133
+ }
134
+ isNominalModifier(term) {
135
+ return this.input.predicates.isAttributiveTargetModifier(term)
136
+ || NOMINAL_MODIFIER_TERMS.has(term)
137
+ || this.isObjectForm(term);
138
+ }
139
+ reachesKnownNominalHead(initialIndex, genericModifierBudget) {
140
+ let index = initialIndex;
141
+ let remainingBudget = genericModifierBudget;
142
+ while (index < this.tokens.length) {
143
+ const term = this.valueAt(index);
144
+ if (this.isNominalHead(term))
145
+ return true;
146
+ if (!this.isNominalModifier(term)) {
147
+ if (remainingBudget <= 0)
148
+ return false;
149
+ remainingBudget -= 1;
150
+ }
151
+ index = this.skipModifiers(index + 1);
152
+ }
153
+ return false;
154
+ }
155
+ isMatrixNominalCollocation(initialIndex) {
156
+ const modifier = this.valueAt(initialIndex);
157
+ let index = this.skipModifiers(initialIndex + 1);
158
+ while (index < this.tokens.length) {
159
+ const term = this.valueAt(index);
160
+ if (this.isNominalHead(term))
161
+ return MATRIX_NOMINAL_COLLOCATIONS.has(`${modifier}:${term}`);
162
+ if (!this.isNominalModifier(term))
163
+ return false;
164
+ index = this.skipModifiers(index + 1);
165
+ }
166
+ return false;
167
+ }
168
+ consumeNominalPhrase(initialIndex) {
169
+ let index = this.skipModifiers(initialIndex);
170
+ const hadArticle = this.input.lexicon.subjectArticles.has(this.valueAt(index));
171
+ if (hadArticle)
172
+ index += 1;
173
+ const prenominal = this.consumePrenominalModifiers(index, hadArticle ? 2 : 1);
174
+ index = prenominal.index;
175
+ const head = this.valueAt(index);
176
+ if (!this.isValidNominalHead(head, prenominal.sawModifier))
177
+ return index;
178
+ return this.consumeGerundComplements(this.skipModifiers(index + 1));
179
+ }
180
+ consumePrenominalModifiers(initialIndex, genericLimit) {
181
+ let index = initialIndex;
182
+ let genericModifiers = 0;
183
+ let sawModifier = false;
184
+ while (index + 1 < this.tokens.length) {
185
+ const nextIndex = this.skipModifiers(index + 1);
186
+ const term = this.valueAt(index);
187
+ if (this.isPrenominalBoundary(nextIndex))
188
+ break;
189
+ const knownModifier = this.isNominalModifier(term);
190
+ const genericModifier = !knownModifier
191
+ && !this.isNominalHead(term)
192
+ && genericModifiers < genericLimit
193
+ && this.reachesKnownNominalHead(nextIndex, genericLimit - genericModifiers - 1);
194
+ if (!knownModifier && !genericModifier)
195
+ break;
196
+ if (genericModifier)
197
+ genericModifiers += 1;
198
+ sawModifier = true;
199
+ index = nextIndex;
200
+ }
201
+ return { index, sawModifier };
202
+ }
203
+ isPrenominalBoundary(nextIndex) {
204
+ const next = this.valueAt(nextIndex);
205
+ return nextIndex >= this.tokens.length
206
+ || RELATIVE_TERMS.has(next)
207
+ || this.input.lexicon.conditionalMarkers.has(next)
208
+ || this.isFactualTailPrefix(next)
209
+ || this.input.lexicon.subjectArticles.has(next)
210
+ || (this.isMatrixPredicate(next) && !this.isMatrixNominalCollocation(nextIndex));
211
+ }
212
+ isValidNominalHead(head, sawPrenominalModifier) {
213
+ return Boolean(head)
214
+ && !RELATIVE_TERMS.has(head)
215
+ && !this.input.lexicon.conditionalMarkers.has(head)
216
+ && !this.isFactualTailPrefix(head)
217
+ && !this.input.lexicon.subjectArticles.has(head)
218
+ && !this.isMatrixPredicate(head)
219
+ && (!sawPrenominalModifier || this.isNominalHead(head));
220
+ }
221
+ consumeGerundComplements(initialIndex) {
222
+ let index = initialIndex;
223
+ while (this.valueAt(index).endsWith('ing')) {
224
+ const complementStart = this.skipModifiers(index + 1);
225
+ const complementEnd = this.consumeNominalPhrase(complementStart);
226
+ if (complementEnd <= complementStart)
227
+ break;
228
+ index = complementEnd;
229
+ }
230
+ return index;
231
+ }
232
+ consumeTerminalNominal(initialIndex) {
233
+ const nominalEnd = this.consumeNominalPhrase(initialIndex);
234
+ if (nominalEnd >= this.tokens.length)
235
+ return nominalEnd;
236
+ const prefixHead = this.firstNominalHead(initialIndex, nominalEnd);
237
+ return this.isNominalHead(this.valueAt(nominalEnd))
238
+ && prefixHead === nominalEnd
239
+ && this.skipModifiers(nominalEnd + 1) >= this.tokens.length
240
+ ? this.tokens.length
241
+ : nominalEnd;
242
+ }
243
+ firstNominalHead(initialIndex, nominalEnd) {
244
+ let index = this.skipModifiers(initialIndex);
245
+ if (this.input.lexicon.subjectArticles.has(this.valueAt(index))) {
246
+ index = this.skipModifiers(index + 1);
247
+ }
248
+ while (index < nominalEnd && !this.isNominalHead(this.valueAt(index))) {
249
+ index = this.skipModifiers(index + 1);
250
+ }
251
+ return index;
252
+ }
253
+ classifyRelativeTail(initialIndex) {
254
+ let index = this.skipModifiers(initialIndex);
255
+ const first = this.valueAt(index);
256
+ if (this.input.lexicon.subjectArticles.has(first)) {
257
+ index = this.consumeNominal(index);
258
+ }
259
+ else if (this.hasElidedPastSubject(index)) {
260
+ index = this.skipModifiers(index + 1);
261
+ }
262
+ while (this.input.lexicon.passiveAuxiliaries.has(this.valueAt(index))) {
263
+ index = this.skipModifiers(index + 1);
264
+ }
265
+ if (!this.isPastPredicate(this.valueAt(index)))
266
+ return 'conditional';
267
+ index = this.skipModifiers(index + 1);
268
+ return this.isFactualTerminalNominal(index);
269
+ }
270
+ hasElidedPastSubject(index) {
271
+ const first = this.valueAt(index);
272
+ return !this.isPastPredicate(first)
273
+ && !this.input.lexicon.passiveAuxiliaries.has(first)
274
+ && this.isPastPredicate(this.valueAt(index + 1));
275
+ }
276
+ classifySubordinateTail(initialIndex) {
277
+ let index = this.skipModifiers(initialIndex);
278
+ if (index >= this.tokens.length)
279
+ return 'factual';
280
+ if (this.isPastPredicate(this.valueAt(index)))
281
+ index = this.skipModifiers(index + 1);
282
+ return this.isFactualTerminalNominal(index);
283
+ }
284
+ isFactualTerminalNominal(index) {
285
+ if (index >= this.tokens.length)
286
+ return 'factual';
287
+ return this.consumeTerminalNominal(index) >= this.tokens.length ? 'factual' : 'conditional';
288
+ }
289
+ classifyObjectTail(initialIndex) {
290
+ const index = this.skipModifiers(initialIndex);
291
+ if (index >= this.tokens.length)
292
+ return 'factual';
293
+ const term = this.valueAt(index);
294
+ if (OBJECT_COORDINATOR_TERMS.has(term))
295
+ return this.classifyCoordinatedTail(index + 1);
296
+ if (RELATIVE_TERMS.has(term))
297
+ return this.classifyRelativeTail(index + 1);
298
+ if (this.input.lexicon.commaDelimitedPrepositions.has(term)) {
299
+ return this.classifyObjectTail(this.consumeTerminalNominal(index + 1));
300
+ }
301
+ if (this.input.lexicon.conditionalMarkers.has(term))
302
+ return 'conditional';
303
+ if (SUBORDINATOR_TERMS.has(term))
304
+ return this.classifySubordinateTail(index + 1);
305
+ if (this.isFactualTailPrefix(term))
306
+ return 'factual';
307
+ if (term.endsWith('ing'))
308
+ return this.classifyObjectTail(this.consumeTerminalNominal(index + 1));
309
+ return 'conditional';
310
+ }
311
+ classifyCoordinatedTail(initialIndex) {
312
+ let index = this.skipModifiers(initialIndex);
313
+ if (index >= this.tokens.length)
314
+ return 'factual';
315
+ const coordinatedTerm = this.valueAt(index);
316
+ if (this.input.actionForms.has(coordinatedTerm) && this.isPastPredicate(coordinatedTerm)) {
317
+ index = this.skipModifiers(index + 1);
318
+ if (index >= this.tokens.length)
319
+ return 'factual';
320
+ if (this.input.lexicon.commaDelimitedPrepositions.has(this.valueAt(index))) {
321
+ return this.classifyObjectTail(index);
322
+ }
323
+ }
324
+ return this.classifyObjectTail(this.consumeTerminalNominal(index));
325
+ }
326
+ isFactualTailPrefix(term) {
327
+ return FACTUAL_TAIL_PREFIX_TERMS.has(term)
328
+ || this.input.lexicon.commaDelimitedPrepositions.has(term)
329
+ || FACTUAL_COORDINATOR_TERMS.has(term);
330
+ }
331
+ valueAt(index) {
332
+ return this.tokens[index]?.value ?? '';
333
+ }
334
+ }
335
+ export function classifyProvidedTargetPrefix(input) {
336
+ if (!input.source || input.objectForms.length === 0)
337
+ return 'none';
338
+ return new ProvidedTargetPrefixClassifier(input).classify();
339
+ }
@@ -1,2 +1,3 @@
1
1
  export * from './strategyPoint.js';
2
- export * from './experiment.js';
2
+ export * from './experiment.js';
3
+ export * from './constraintAblation.js';
@@ -1,2 +1,3 @@
1
1
  export * from './strategyPoint.js';
2
- export * from './experiment.js';
2
+ export * from './experiment.js';
3
+ export * from './constraintAblation.js';
@@ -1,2 +1,4 @@
1
1
  export * from './trajectory.js';
2
- export * from './trajectoryExport.js';
2
+ export * from './trajectoryExport.js';
3
+ export * from './learningTrace.js';
4
+ export * from './proxyTurns.js';
@@ -1,2 +1,4 @@
1
1
  export * from './trajectory.js';
2
- export * from './trajectoryExport.js';
2
+ export * from './trajectoryExport.js';
3
+ export * from './learningTrace.js';
4
+ export * from './proxyTurns.js';
@@ -0,0 +1,209 @@
1
+ import type { Observer } from '../observers/observerBus.js';
2
+ import type { TraceTurnDraft } from './trajectory.js';
3
+ export declare const TRACE_EVENT_SCHEMA = "trace_event.v0";
4
+ export declare const LEARNING_PACKET_SCHEMA = "learning_packet.v0";
5
+ /** Lifecycle vocabulary for slice 1. Kept flat + closed so hub-side eventType stays queryable. */
6
+ export declare const TRACE_EVENT_TYPES: readonly ["run.started", "run.completed", "model.called", "tool.called", "tool.failed", "retry.attempted", "reflection.recorded", "intervention.received"];
7
+ export type TraceEventType = (typeof TRACE_EVENT_TYPES)[number];
8
+ /** Mirrors hub LearningOpsTraceEvent columns (eventId/eventType/traceId/sessionId/taskId/sequence/occurredAt/payload/metadata). */
9
+ export interface TraceEvent {
10
+ schemaVersion: typeof TRACE_EVENT_SCHEMA;
11
+ eventId: string;
12
+ eventType: TraceEventType;
13
+ /** Run-scoped trace id; every event of one agent run shares it. */
14
+ traceId: string;
15
+ sessionId?: string;
16
+ taskId?: string;
17
+ /** 1-based, strictly increasing per run — hub-side ordering key. */
18
+ sequence: number;
19
+ occurredAt: string;
20
+ payload: Record<string, unknown>;
21
+ metadata: Record<string, unknown>;
22
+ }
23
+ export interface TraceSink {
24
+ emit(event: TraceEvent): void;
25
+ }
26
+ export declare class InMemoryTraceSink implements TraceSink {
27
+ readonly events: TraceEvent[];
28
+ emit(event: TraceEvent): void;
29
+ }
30
+ /** JSONL append sink for local inspection / offline replay. */
31
+ export declare class FileTraceSink implements TraceSink {
32
+ private readonly path;
33
+ constructor(path: string);
34
+ emit(event: TraceEvent): void;
35
+ }
36
+ export declare class ConsoleTraceSink implements TraceSink {
37
+ private readonly log;
38
+ constructor(log?: (line: string) => void);
39
+ emit(event: TraceEvent): void;
40
+ }
41
+ export interface AgentRunTraceRecorderOptions {
42
+ /** Stable run identity; becomes traceId and the packet sourceRun. */
43
+ runId: string;
44
+ sessionId?: string;
45
+ taskId?: string;
46
+ sink?: TraceSink;
47
+ /** Injected clock for deterministic tests. */
48
+ now?: () => number;
49
+ /** Injected id factory for deterministic tests. */
50
+ eventIdFactory?: (sequence: number) => string;
51
+ }
52
+ export interface RunStartedInput {
53
+ taskSummary?: string;
54
+ signals?: readonly string[];
55
+ geneId?: string;
56
+ metadata?: Record<string, unknown>;
57
+ }
58
+ export interface RunCompletedInput {
59
+ status: 'success' | 'failed';
60
+ score?: number;
61
+ reason?: string;
62
+ producedValue?: boolean;
63
+ failureKind?: string;
64
+ }
65
+ export interface ModelCalledInput {
66
+ provider?: string;
67
+ model?: string;
68
+ requestId?: string;
69
+ latencyMs?: number;
70
+ usage?: Record<string, unknown>;
71
+ stopReason?: string;
72
+ }
73
+ export interface ToolCalledInput {
74
+ toolName: string;
75
+ callId?: string;
76
+ durationMs?: number;
77
+ metadata?: Record<string, unknown>;
78
+ }
79
+ export interface ToolFailedInput {
80
+ toolName: string;
81
+ callId?: string;
82
+ error: string;
83
+ }
84
+ export interface RetryInput {
85
+ attempt: number;
86
+ reason?: string;
87
+ target?: string;
88
+ }
89
+ export interface ReflectionInput {
90
+ outcome: string;
91
+ action?: string;
92
+ summary?: string;
93
+ }
94
+ export interface InterventionInput {
95
+ kind: string;
96
+ actorId?: string;
97
+ detail?: string;
98
+ }
99
+ /**
100
+ * Per-run trace recorder: the single hook surface the runtime calls at lifecycle points.
101
+ * Sequence numbers are assigned here (monotonic per run), so downstream ordering never depends on
102
+ * sink latency or clock resolution.
103
+ */
104
+ export declare class AgentRunTraceRecorder {
105
+ private readonly opts;
106
+ private sequence;
107
+ private readonly recorded;
108
+ constructor(opts: AgentRunTraceRecorderOptions);
109
+ get events(): readonly TraceEvent[];
110
+ runStarted(input?: RunStartedInput): TraceEvent;
111
+ modelCalled(input?: ModelCalledInput): TraceEvent;
112
+ toolCalled(input: ToolCalledInput): TraceEvent;
113
+ toolFailed(input: ToolFailedInput): TraceEvent;
114
+ retryAttempted(input: RetryInput): TraceEvent;
115
+ reflectionRecorded(input: ReflectionInput): TraceEvent;
116
+ interventionReceived(input: InterventionInput): TraceEvent;
117
+ runCompleted(input: RunCompletedInput): TraceEvent;
118
+ /** Fold one normalized llm_turn (trace/trajectory.ts) into model.called + tool.called/tool.failed events. */
119
+ recordLlmTurn(turn: TraceTurnDraft): TraceEvent[];
120
+ private record;
121
+ }
122
+ /**
123
+ * Bypass-side bridge (never blocks the write path): maps the engine's existing root events onto the
124
+ * run's TraceEvent stream, so CycleEngine needs no code change for run start/completion, reflection,
125
+ * or human intervention coverage.
126
+ */
127
+ export declare function learningTraceObserver(deps: {
128
+ recorder: AgentRunTraceRecorder;
129
+ timeoutMs?: number;
130
+ }): Observer;
131
+ /**
132
+ * Externally-verified run evidence (Learning Ops slice 6): the runtime's validate hook (sandboxed
133
+ * validation commands) is an `automated_test` verifier in the hub VERIFIERS vocabulary. Only a hook
134
+ * that actually RAN produces one of these — agent self-report never fills evaluation.
135
+ */
136
+ export interface LearningPacketVerification {
137
+ verifier: 'automated_test';
138
+ passed: boolean;
139
+ score?: number;
140
+ }
141
+ export interface LearningPacketDraftInput {
142
+ /** e.g. 'evolver-v2'. Hub column sourceRepo. */
143
+ sourceRepo: string;
144
+ taskSummary?: string;
145
+ signals?: readonly string[];
146
+ environment?: Record<string, unknown>;
147
+ /** When present, fills evaluation (placeholder → false). Omit when no external verifier ran. */
148
+ verification?: LearningPacketVerification;
149
+ }
150
+ /** Local draft aligned with hub LearningOpsPacket ingest fields; placeholders are explicit, not implied. */
151
+ export interface LearningPacketDraft {
152
+ schemaVersion: typeof LEARNING_PACKET_SCHEMA;
153
+ status: 'draft';
154
+ source: {
155
+ repo: string;
156
+ run: string;
157
+ type: 'agent_run';
158
+ id: string;
159
+ };
160
+ task: {
161
+ taskId: string | null;
162
+ summary: string | null;
163
+ signals: string[];
164
+ };
165
+ context: {
166
+ sessionId: string | null;
167
+ traceId: string;
168
+ environment: Record<string, unknown>;
169
+ };
170
+ trajectory: TraceEvent[];
171
+ artifacts: {
172
+ placeholder: true;
173
+ items: never[];
174
+ };
175
+ /** placeholder:false ⇔ an external verifier ran (verification input) — then verifier/verifierPassed are set. */
176
+ evaluation: {
177
+ placeholder: boolean;
178
+ outcomeStatus: 'success' | 'failed' | 'unknown';
179
+ verifier: 'automated_test' | null;
180
+ verifierPassed?: boolean;
181
+ verifierScore?: number;
182
+ failureCategory: string | null;
183
+ };
184
+ governance: {
185
+ placeholder: true;
186
+ redactionStatus: 'metadata_only';
187
+ consentStatus: 'unknown';
188
+ trainingEligible: false;
189
+ retentionPolicy: 'standard';
190
+ };
191
+ }
192
+ export declare function buildLearningPacketDraft(recorder: AgentRunTraceRecorder, input: LearningPacketDraftInput): LearningPacketDraft;
193
+ export interface LearningPacketSubmitResult {
194
+ accepted: boolean;
195
+ reason?: string;
196
+ }
197
+ export interface LearningPacketSink {
198
+ submit(draft: LearningPacketDraft): Promise<LearningPacketSubmitResult>;
199
+ }
200
+ export declare class InMemoryLearningPacketSink implements LearningPacketSink {
201
+ readonly drafts: LearningPacketDraft[];
202
+ submit(draft: LearningPacketDraft): Promise<LearningPacketSubmitResult>;
203
+ }
204
+ /** Writes one JSON file per run — the offline/no-hub path (and a manual-inspection artifact). */
205
+ export declare class FileLearningPacketSink implements LearningPacketSink {
206
+ private readonly dir;
207
+ constructor(dir: string);
208
+ submit(draft: LearningPacketDraft): Promise<LearningPacketSubmitResult>;
209
+ }