@itaila/archetype 0.3.30

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 (319) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +475 -0
  3. package/dist/audit/audit-persona.d.ts +163 -0
  4. package/dist/audit/audit-persona.d.ts.map +1 -0
  5. package/dist/audit/audit-persona.js +415 -0
  6. package/dist/audit/audit-persona.js.map +1 -0
  7. package/dist/audit/brain-reflection.d.ts +33 -0
  8. package/dist/audit/brain-reflection.d.ts.map +1 -0
  9. package/dist/audit/brain-reflection.js +148 -0
  10. package/dist/audit/brain-reflection.js.map +1 -0
  11. package/dist/audit/conversation-audit.d.ts +12 -0
  12. package/dist/audit/conversation-audit.d.ts.map +1 -0
  13. package/dist/audit/conversation-audit.js +76 -0
  14. package/dist/audit/conversation-audit.js.map +1 -0
  15. package/dist/audit/prompt-audit.d.ts +10 -0
  16. package/dist/audit/prompt-audit.d.ts.map +1 -0
  17. package/dist/audit/prompt-audit.js +153 -0
  18. package/dist/audit/prompt-audit.js.map +1 -0
  19. package/dist/audit/prompt-dump.d.ts +137 -0
  20. package/dist/audit/prompt-dump.d.ts.map +1 -0
  21. package/dist/audit/prompt-dump.js +269 -0
  22. package/dist/audit/prompt-dump.js.map +1 -0
  23. package/dist/audit/trace-integrity.d.ts +33 -0
  24. package/dist/audit/trace-integrity.d.ts.map +1 -0
  25. package/dist/audit/trace-integrity.js +109 -0
  26. package/dist/audit/trace-integrity.js.map +1 -0
  27. package/dist/audit/types.d.ts +92 -0
  28. package/dist/audit/types.d.ts.map +1 -0
  29. package/dist/audit/types.js +2 -0
  30. package/dist/audit/types.js.map +1 -0
  31. package/dist/audit/version.d.ts +14 -0
  32. package/dist/audit/version.d.ts.map +1 -0
  33. package/dist/audit/version.js +65 -0
  34. package/dist/audit/version.js.map +1 -0
  35. package/dist/brain.d.ts +7 -0
  36. package/dist/brain.d.ts.map +1 -0
  37. package/dist/brain.js +83 -0
  38. package/dist/brain.js.map +1 -0
  39. package/dist/builder/actions.d.ts +60 -0
  40. package/dist/builder/actions.d.ts.map +1 -0
  41. package/dist/builder/actions.js +257 -0
  42. package/dist/builder/actions.js.map +1 -0
  43. package/dist/builder/browser.d.ts +140 -0
  44. package/dist/builder/browser.d.ts.map +1 -0
  45. package/dist/builder/browser.js +232 -0
  46. package/dist/builder/browser.js.map +1 -0
  47. package/dist/builder/executor.d.ts +228 -0
  48. package/dist/builder/executor.d.ts.map +1 -0
  49. package/dist/builder/executor.js +1548 -0
  50. package/dist/builder/executor.js.map +1 -0
  51. package/dist/builder/index.d.ts +24 -0
  52. package/dist/builder/index.d.ts.map +1 -0
  53. package/dist/builder/index.js +24 -0
  54. package/dist/builder/index.js.map +1 -0
  55. package/dist/builder/node-test-discovery.d.ts +13 -0
  56. package/dist/builder/node-test-discovery.d.ts.map +1 -0
  57. package/dist/builder/node-test-discovery.js +45 -0
  58. package/dist/builder/node-test-discovery.js.map +1 -0
  59. package/dist/builder/sandbox.d.ts +172 -0
  60. package/dist/builder/sandbox.d.ts.map +1 -0
  61. package/dist/builder/sandbox.js +294 -0
  62. package/dist/builder/sandbox.js.map +1 -0
  63. package/dist/builder/workspace-files.d.ts +63 -0
  64. package/dist/builder/workspace-files.d.ts.map +1 -0
  65. package/dist/builder/workspace-files.js +190 -0
  66. package/dist/builder/workspace-files.js.map +1 -0
  67. package/dist/core/actions.d.ts +55 -0
  68. package/dist/core/actions.d.ts.map +1 -0
  69. package/dist/core/actions.js +311 -0
  70. package/dist/core/actions.js.map +1 -0
  71. package/dist/core/attachment-notes.d.ts +7 -0
  72. package/dist/core/attachment-notes.d.ts.map +1 -0
  73. package/dist/core/attachment-notes.js +38 -0
  74. package/dist/core/attachment-notes.js.map +1 -0
  75. package/dist/core/context.d.ts +10 -0
  76. package/dist/core/context.d.ts.map +1 -0
  77. package/dist/core/context.js +108 -0
  78. package/dist/core/context.js.map +1 -0
  79. package/dist/core/crud-prompt.d.ts +16 -0
  80. package/dist/core/crud-prompt.d.ts.map +1 -0
  81. package/dist/core/crud-prompt.js +268 -0
  82. package/dist/core/crud-prompt.js.map +1 -0
  83. package/dist/core/crud-schema.d.ts +12 -0
  84. package/dist/core/crud-schema.d.ts.map +1 -0
  85. package/dist/core/crud-schema.js +42 -0
  86. package/dist/core/crud-schema.js.map +1 -0
  87. package/dist/core/effective-config.d.ts +13 -0
  88. package/dist/core/effective-config.d.ts.map +1 -0
  89. package/dist/core/effective-config.js +33 -0
  90. package/dist/core/effective-config.js.map +1 -0
  91. package/dist/core/entities.d.ts +82 -0
  92. package/dist/core/entities.d.ts.map +1 -0
  93. package/dist/core/entities.js +116 -0
  94. package/dist/core/entities.js.map +1 -0
  95. package/dist/core/entity-helpers.d.ts +47 -0
  96. package/dist/core/entity-helpers.d.ts.map +1 -0
  97. package/dist/core/entity-helpers.js +122 -0
  98. package/dist/core/entity-helpers.js.map +1 -0
  99. package/dist/core/entity-registry.d.ts +47 -0
  100. package/dist/core/entity-registry.d.ts.map +1 -0
  101. package/dist/core/entity-registry.js +54 -0
  102. package/dist/core/entity-registry.js.map +1 -0
  103. package/dist/core/eq.d.ts +13 -0
  104. package/dist/core/eq.d.ts.map +1 -0
  105. package/dist/core/eq.js +41 -0
  106. package/dist/core/eq.js.map +1 -0
  107. package/dist/core/focus-context.d.ts +19 -0
  108. package/dist/core/focus-context.d.ts.map +1 -0
  109. package/dist/core/focus-context.js +46 -0
  110. package/dist/core/focus-context.js.map +1 -0
  111. package/dist/core/focus-mode-actions.d.ts +23 -0
  112. package/dist/core/focus-mode-actions.d.ts.map +1 -0
  113. package/dist/core/focus-mode-actions.js +74 -0
  114. package/dist/core/focus-mode-actions.js.map +1 -0
  115. package/dist/core/greeting.d.ts +10 -0
  116. package/dist/core/greeting.d.ts.map +1 -0
  117. package/dist/core/greeting.js +41 -0
  118. package/dist/core/greeting.js.map +1 -0
  119. package/dist/core/identity.d.ts +13 -0
  120. package/dist/core/identity.d.ts.map +1 -0
  121. package/dist/core/identity.js +54 -0
  122. package/dist/core/identity.js.map +1 -0
  123. package/dist/core/knowledge.d.ts +10 -0
  124. package/dist/core/knowledge.d.ts.map +1 -0
  125. package/dist/core/knowledge.js +40 -0
  126. package/dist/core/knowledge.js.map +1 -0
  127. package/dist/core/memory-actions.d.ts +38 -0
  128. package/dist/core/memory-actions.d.ts.map +1 -0
  129. package/dist/core/memory-actions.js +181 -0
  130. package/dist/core/memory-actions.js.map +1 -0
  131. package/dist/core/memory.d.ts +35 -0
  132. package/dist/core/memory.d.ts.map +1 -0
  133. package/dist/core/memory.js +168 -0
  134. package/dist/core/memory.js.map +1 -0
  135. package/dist/core/peer-actions.d.ts +15 -0
  136. package/dist/core/peer-actions.d.ts.map +1 -0
  137. package/dist/core/peer-actions.js +33 -0
  138. package/dist/core/peer-actions.js.map +1 -0
  139. package/dist/core/prompt-builder.d.ts +46 -0
  140. package/dist/core/prompt-builder.d.ts.map +1 -0
  141. package/dist/core/prompt-builder.js +543 -0
  142. package/dist/core/prompt-builder.js.map +1 -0
  143. package/dist/core/prompt-mode.d.ts +3 -0
  144. package/dist/core/prompt-mode.d.ts.map +1 -0
  145. package/dist/core/prompt-mode.js +6 -0
  146. package/dist/core/prompt-mode.js.map +1 -0
  147. package/dist/core/prompted-turn.d.ts +6 -0
  148. package/dist/core/prompted-turn.d.ts.map +1 -0
  149. package/dist/core/prompted-turn.js +48 -0
  150. package/dist/core/prompted-turn.js.map +1 -0
  151. package/dist/core/request-builder.d.ts +14 -0
  152. package/dist/core/request-builder.d.ts.map +1 -0
  153. package/dist/core/request-builder.js +64 -0
  154. package/dist/core/request-builder.js.map +1 -0
  155. package/dist/core/session-routing.d.ts +23 -0
  156. package/dist/core/session-routing.d.ts.map +1 -0
  157. package/dist/core/session-routing.js +59 -0
  158. package/dist/core/session-routing.js.map +1 -0
  159. package/dist/core/voice.d.ts +6 -0
  160. package/dist/core/voice.d.ts.map +1 -0
  161. package/dist/core/voice.js +30 -0
  162. package/dist/core/voice.js.map +1 -0
  163. package/dist/engine/chat.d.ts +45 -0
  164. package/dist/engine/chat.d.ts.map +1 -0
  165. package/dist/engine/chat.js +308 -0
  166. package/dist/engine/chat.js.map +1 -0
  167. package/dist/engine/continuity.d.ts +107 -0
  168. package/dist/engine/continuity.d.ts.map +1 -0
  169. package/dist/engine/continuity.js +320 -0
  170. package/dist/engine/continuity.js.map +1 -0
  171. package/dist/engine/crud.d.ts +62 -0
  172. package/dist/engine/crud.d.ts.map +1 -0
  173. package/dist/engine/crud.js +260 -0
  174. package/dist/engine/crud.js.map +1 -0
  175. package/dist/engine/side-effects.d.ts +93 -0
  176. package/dist/engine/side-effects.d.ts.map +1 -0
  177. package/dist/engine/side-effects.js +271 -0
  178. package/dist/engine/side-effects.js.map +1 -0
  179. package/dist/engine/staging.d.ts +29 -0
  180. package/dist/engine/staging.d.ts.map +1 -0
  181. package/dist/engine/staging.js +159 -0
  182. package/dist/engine/staging.js.map +1 -0
  183. package/dist/engine/working-set.d.ts +18 -0
  184. package/dist/engine/working-set.d.ts.map +1 -0
  185. package/dist/engine/working-set.js +246 -0
  186. package/dist/engine/working-set.js.map +1 -0
  187. package/dist/evals/action-contracts.d.ts +40 -0
  188. package/dist/evals/action-contracts.d.ts.map +1 -0
  189. package/dist/evals/action-contracts.js +208 -0
  190. package/dist/evals/action-contracts.js.map +1 -0
  191. package/dist/evals/brain-bloat.d.ts +39 -0
  192. package/dist/evals/brain-bloat.d.ts.map +1 -0
  193. package/dist/evals/brain-bloat.js +167 -0
  194. package/dist/evals/brain-bloat.js.map +1 -0
  195. package/dist/evals/brain-prescriptions.d.ts +30 -0
  196. package/dist/evals/brain-prescriptions.d.ts.map +1 -0
  197. package/dist/evals/brain-prescriptions.js +148 -0
  198. package/dist/evals/brain-prescriptions.js.map +1 -0
  199. package/dist/evals/cross-layer-duplicates.d.ts +49 -0
  200. package/dist/evals/cross-layer-duplicates.d.ts.map +1 -0
  201. package/dist/evals/cross-layer-duplicates.js +289 -0
  202. package/dist/evals/cross-layer-duplicates.js.map +1 -0
  203. package/dist/evals/entity-visibility.d.ts +28 -0
  204. package/dist/evals/entity-visibility.d.ts.map +1 -0
  205. package/dist/evals/entity-visibility.js +216 -0
  206. package/dist/evals/entity-visibility.js.map +1 -0
  207. package/dist/evals/index.d.ts +19 -0
  208. package/dist/evals/index.d.ts.map +1 -0
  209. package/dist/evals/index.js +11 -0
  210. package/dist/evals/index.js.map +1 -0
  211. package/dist/evals/judge.d.ts +22 -0
  212. package/dist/evals/judge.d.ts.map +1 -0
  213. package/dist/evals/judge.js +337 -0
  214. package/dist/evals/judge.js.map +1 -0
  215. package/dist/evals/operational-contract.d.ts +40 -0
  216. package/dist/evals/operational-contract.d.ts.map +1 -0
  217. package/dist/evals/operational-contract.js +115 -0
  218. package/dist/evals/operational-contract.js.map +1 -0
  219. package/dist/evals/prompt-content.d.ts +14 -0
  220. package/dist/evals/prompt-content.d.ts.map +1 -0
  221. package/dist/evals/prompt-content.js +104 -0
  222. package/dist/evals/prompt-content.js.map +1 -0
  223. package/dist/evals/runtime.d.ts +4 -0
  224. package/dist/evals/runtime.d.ts.map +1 -0
  225. package/dist/evals/runtime.js +197 -0
  226. package/dist/evals/runtime.js.map +1 -0
  227. package/dist/evals/sample-projects.d.ts +143 -0
  228. package/dist/evals/sample-projects.d.ts.map +1 -0
  229. package/dist/evals/sample-projects.js +644 -0
  230. package/dist/evals/sample-projects.js.map +1 -0
  231. package/dist/evals/types.d.ts +88 -0
  232. package/dist/evals/types.d.ts.map +1 -0
  233. package/dist/evals/types.js +2 -0
  234. package/dist/evals/types.js.map +1 -0
  235. package/dist/foundation/index.d.ts +158 -0
  236. package/dist/foundation/index.d.ts.map +1 -0
  237. package/dist/foundation/index.js +256 -0
  238. package/dist/foundation/index.js.map +1 -0
  239. package/dist/index.d.ts +223 -0
  240. package/dist/index.d.ts.map +1 -0
  241. package/dist/index.js +998 -0
  242. package/dist/index.js.map +1 -0
  243. package/dist/managed/autonomous-loop.d.ts +199 -0
  244. package/dist/managed/autonomous-loop.d.ts.map +1 -0
  245. package/dist/managed/autonomous-loop.js +451 -0
  246. package/dist/managed/autonomous-loop.js.map +1 -0
  247. package/dist/managed/conversation.d.ts +20 -0
  248. package/dist/managed/conversation.d.ts.map +1 -0
  249. package/dist/managed/conversation.js +40 -0
  250. package/dist/managed/conversation.js.map +1 -0
  251. package/dist/managed/knowledge.d.ts +7 -0
  252. package/dist/managed/knowledge.d.ts.map +1 -0
  253. package/dist/managed/knowledge.js +174 -0
  254. package/dist/managed/knowledge.js.map +1 -0
  255. package/dist/managed/memory-manager.d.ts +7 -0
  256. package/dist/managed/memory-manager.d.ts.map +1 -0
  257. package/dist/managed/memory-manager.js +18 -0
  258. package/dist/managed/memory-manager.js.map +1 -0
  259. package/dist/managed/memory-review.d.ts +45 -0
  260. package/dist/managed/memory-review.d.ts.map +1 -0
  261. package/dist/managed/memory-review.js +130 -0
  262. package/dist/managed/memory-review.js.map +1 -0
  263. package/dist/managed/storage.d.ts +2 -0
  264. package/dist/managed/storage.d.ts.map +1 -0
  265. package/dist/managed/storage.js +2 -0
  266. package/dist/managed/storage.js.map +1 -0
  267. package/dist/managed/work-history.d.ts +23 -0
  268. package/dist/managed/work-history.d.ts.map +1 -0
  269. package/dist/managed/work-history.js +31 -0
  270. package/dist/managed/work-history.js.map +1 -0
  271. package/dist/observability/index.d.ts +15 -0
  272. package/dist/observability/index.d.ts.map +1 -0
  273. package/dist/observability/index.js +15 -0
  274. package/dist/observability/index.js.map +1 -0
  275. package/dist/observability/render-run-markdown.d.ts +90 -0
  276. package/dist/observability/render-run-markdown.d.ts.map +1 -0
  277. package/dist/observability/render-run-markdown.js +231 -0
  278. package/dist/observability/render-run-markdown.js.map +1 -0
  279. package/dist/observability/turn-reporter.d.ts +20 -0
  280. package/dist/observability/turn-reporter.d.ts.map +1 -0
  281. package/dist/observability/turn-reporter.js +106 -0
  282. package/dist/observability/turn-reporter.js.map +1 -0
  283. package/dist/persona.d.ts +49 -0
  284. package/dist/persona.d.ts.map +1 -0
  285. package/dist/persona.js +287 -0
  286. package/dist/persona.js.map +1 -0
  287. package/dist/playbook/defaults.d.ts +25 -0
  288. package/dist/playbook/defaults.d.ts.map +1 -0
  289. package/dist/playbook/defaults.js +108 -0
  290. package/dist/playbook/defaults.js.map +1 -0
  291. package/dist/playbook/invariants.d.ts +244 -0
  292. package/dist/playbook/invariants.d.ts.map +1 -0
  293. package/dist/playbook/invariants.js +259 -0
  294. package/dist/playbook/invariants.js.map +1 -0
  295. package/dist/playbook/templates.d.ts +7 -0
  296. package/dist/playbook/templates.d.ts.map +1 -0
  297. package/dist/playbook/templates.js +437 -0
  298. package/dist/playbook/templates.js.map +1 -0
  299. package/dist/providers/gemini.d.ts +73 -0
  300. package/dist/providers/gemini.d.ts.map +1 -0
  301. package/dist/providers/gemini.js +536 -0
  302. package/dist/providers/gemini.js.map +1 -0
  303. package/dist/providers/types.d.ts +2 -0
  304. package/dist/providers/types.d.ts.map +1 -0
  305. package/dist/providers/types.js +2 -0
  306. package/dist/providers/types.js.map +1 -0
  307. package/dist/providers/zod-to-gemini.d.ts +8 -0
  308. package/dist/providers/zod-to-gemini.d.ts.map +1 -0
  309. package/dist/providers/zod-to-gemini.js +148 -0
  310. package/dist/providers/zod-to-gemini.js.map +1 -0
  311. package/dist/samples/pm-spec-agent.d.ts +22 -0
  312. package/dist/samples/pm-spec-agent.d.ts.map +1 -0
  313. package/dist/samples/pm-spec-agent.js +53 -0
  314. package/dist/samples/pm-spec-agent.js.map +1 -0
  315. package/dist/types.d.ts +920 -0
  316. package/dist/types.d.ts.map +1 -0
  317. package/dist/types.js +2 -0
  318. package/dist/types.js.map +1 -0
  319. package/package.json +68 -0
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Cross-layer duplicate detector — a structural audit that catches the most
3
+ * common "boxed brain" pattern: prose in the brain that restates content
4
+ * already carried by entity descriptions, entity field describe() annotations,
5
+ * context labels, EQ flags, or memory config.
6
+ *
7
+ * This isn't a replacement for judgment-level review — it's a cheap, deterministic
8
+ * pass that catches the patterns we saw in the Savor v2 → v3 experiment:
9
+ * - "Profile settings use the profile entity" (duplicate of profile entity description)
10
+ * - "Weight: if given in kg, convert to lbs" (duplicate of weight field describe())
11
+ * - "use the id shown in PROFILE RECORD" (duplicate of context label with includeIds)
12
+ * - "qualitative language by default" (duplicate of eq.qualitativeFirst)
13
+ *
14
+ * Scenario-first design: the findings are advisory. Each finding names a
15
+ * specific adjacent layer where the rule should live, not a brand-new rule.
16
+ */
17
+ import type { PersonaConfig } from '../types.js';
18
+ import type { LoadedBrainArtifact } from '../types.js';
19
+ export interface CrossLayerAuditInput {
20
+ config: PersonaConfig;
21
+ markdown?: string;
22
+ brain?: LoadedBrainArtifact;
23
+ }
24
+ export interface CrossLayerDuplicate {
25
+ /** Which layer the brain content duplicates. */
26
+ targetLayer: 'entity-description' | 'entity-field' | 'context-label' | 'eq-flag' | 'memory-purpose' | 'identity-keystone' | 'identity-northstar' | 'voice-formatting';
27
+ /** The specific target (entity name, field name, context key, flag name). */
28
+ target: string;
29
+ /** The offending text from the brain. */
30
+ brainText: string;
31
+ /** Brain section where the text appears. */
32
+ section: string;
33
+ /** Why it's duplicated and what to do. */
34
+ suggestion: string;
35
+ }
36
+ export interface CrossLayerAuditResult {
37
+ pass: boolean;
38
+ duplicates: CrossLayerDuplicate[];
39
+ }
40
+ /**
41
+ * Detect brain prose that restates content available in adjacent layers.
42
+ *
43
+ * The detector works by scanning brain lines for mentions of entity names,
44
+ * field names, context keys, or EQ concepts, then checking whether the brain
45
+ * line is a rule/directive (as opposed to domain-level framing that happens
46
+ * to reference an entity name).
47
+ */
48
+ export declare function auditCrossLayerDuplicates(input: CrossLayerAuditInput): CrossLayerAuditResult;
49
+ //# sourceMappingURL=cross-layer-duplicates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cross-layer-duplicates.d.ts","sourceRoot":"","sources":["../../src/evals/cross-layer-duplicates.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAEhD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAEtD,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,aAAa,CAAA;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE,mBAAmB,CAAA;CAC5B;AAED,MAAM,WAAW,mBAAmB;IAClC,gDAAgD;IAChD,WAAW,EACP,oBAAoB,GACpB,cAAc,GACd,eAAe,GACf,SAAS,GACT,gBAAgB,GAChB,mBAAmB,GACnB,oBAAoB,GACpB,kBAAkB,CAAA;IACtB,6EAA6E;IAC7E,MAAM,EAAE,MAAM,CAAA;IACd,yCAAyC;IACzC,SAAS,EAAE,MAAM,CAAA;IACjB,4CAA4C;IAC5C,OAAO,EAAE,MAAM,CAAA;IACf,0CAA0C;IAC1C,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,OAAO,CAAA;IACb,UAAU,EAAE,mBAAmB,EAAE,CAAA;CAClC;AAED;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,oBAAoB,GAAG,qBAAqB,CA6J5F"}
@@ -0,0 +1,289 @@
1
+ import { parseBrainMarkdown } from '../brain.js';
2
+ /**
3
+ * Detect brain prose that restates content available in adjacent layers.
4
+ *
5
+ * The detector works by scanning brain lines for mentions of entity names,
6
+ * field names, context keys, or EQ concepts, then checking whether the brain
7
+ * line is a rule/directive (as opposed to domain-level framing that happens
8
+ * to reference an entity name).
9
+ */
10
+ export function auditCrossLayerDuplicates(input) {
11
+ const brain = input.brain ?? parseBrainMarkdown(input.markdown ?? '', undefined);
12
+ const duplicates = [];
13
+ const config = input.config;
14
+ const entities = config.entities ?? {};
15
+ const contextInputs = config.contextInputs ?? {};
16
+ const eq = config.eq ?? {};
17
+ const memory = config.memory;
18
+ const craftMemory = config.craftMemory;
19
+ const identity = config.identity;
20
+ const voice = config.voice;
21
+ for (const [sectionName, sectionContent] of Object.entries(brain.sections)) {
22
+ for (const line of extractMeaningfulLines(sectionContent)) {
23
+ const lower = line.toLowerCase();
24
+ // Entity-name duplicates: brain line names an entity AND either
25
+ // (a) prescribes when/how to use it (routing rule), or
26
+ // (b) defines what it IS (definitional drift — belongs in entity description).
27
+ for (const [entityName, entityConfig] of Object.entries(entities)) {
28
+ const entityMentioned = lineNamesEntity(lower, entityName);
29
+ if (!entityMentioned)
30
+ continue;
31
+ if (lineLooksPrescriptive(line)) {
32
+ duplicates.push({
33
+ targetLayer: 'entity-description',
34
+ target: entityName,
35
+ brainText: line,
36
+ section: sectionName,
37
+ suggestion: `This rule directs the AI on when/how to use the '${entityName}' entity — move the routing guidance into the entity description or the relevant field's describe() annotation. The current description is: ${JSON.stringify(entityConfig?.description ?? null)}.`,
38
+ });
39
+ }
40
+ else if (lineLooksDefinitional(line, entityName)) {
41
+ duplicates.push({
42
+ targetLayer: 'entity-description',
43
+ target: entityName,
44
+ brainText: line,
45
+ section: sectionName,
46
+ suggestion: `This brain line defines what '${entityName}' IS — that semantic belongs in the entity description, not the brain. The current description is: ${JSON.stringify(entityConfig?.description ?? null)}.`,
47
+ });
48
+ }
49
+ }
50
+ // Context-label duplicates: "use the id" / "the record shows" when includeIds is already on the label
51
+ if (/\buse the id\b|\bthe id shown\b|\bwith the id\b/i.test(line)) {
52
+ for (const [contextKey, contextInput] of Object.entries(contextInputs)) {
53
+ if ('includeIds' in contextInput && contextInput.includeIds) {
54
+ duplicates.push({
55
+ targetLayer: 'context-label',
56
+ target: contextKey,
57
+ brainText: line,
58
+ section: sectionName,
59
+ suggestion: `Context '${contextKey}' already has includeIds=true — the AI can see the id in the context block. Delete the brain rule; or if the label isn't clear, strengthen the label text instead.`,
60
+ });
61
+ }
62
+ }
63
+ }
64
+ // EQ flag duplicates
65
+ if (/\bqualitative\b|\bwarm language by default\b|\bnumbers (only )?(when|if) (the user )?asks?\b/i.test(line)) {
66
+ if (eq.qualitativeFirst) {
67
+ duplicates.push({
68
+ targetLayer: 'eq-flag',
69
+ target: 'qualitativeFirst',
70
+ brainText: line,
71
+ section: sectionName,
72
+ suggestion: `eq.qualitativeFirst is already enabled and drives this behavior at prompt-assembly time. Remove the brain rule.`,
73
+ });
74
+ }
75
+ }
76
+ // Frequency rule: detect both the literal phrase AND the concept
77
+ // ("when something shows up once/twice/three times", "pattern worth naming",
78
+ // "repetition is signal", etc.).
79
+ if (/\bfrequency rule\b|\bdon'?t repeat the same observation\b/i.test(line) ||
80
+ /\b(when|once)\b.*\b(pattern|thing|something)\b.*\b(three times|twice|repeats|keeps|shows up)\b/i.test(line) ||
81
+ /\bpatterns?\b.*\b(across|worth naming|keep showing up|repeat)\b/i.test(line) ||
82
+ /\b(shows up|appears) (once|twice|three times|\d+ times)\b.*\b(moment|coincidence|worth naming|pattern)\b/i.test(line)) {
83
+ if (eq.frequencyRule) {
84
+ duplicates.push({
85
+ targetLayer: 'eq-flag',
86
+ target: 'frequencyRule',
87
+ brainText: line,
88
+ section: sectionName,
89
+ suggestion: `eq.frequencyRule already drives "pattern vs moment" behavior at prompt-assembly time. Remove the brain rule.`,
90
+ });
91
+ }
92
+ }
93
+ if (/\bautonomy\b.*\b(respect|inform)\b|\brespect informed choices?\b/i.test(line)) {
94
+ if (eq.autonomyRespect) {
95
+ duplicates.push({
96
+ targetLayer: 'eq-flag',
97
+ target: 'autonomyRespect',
98
+ brainText: line,
99
+ section: sectionName,
100
+ suggestion: `eq.autonomyRespect is already enabled. Remove the brain rule.`,
101
+ });
102
+ }
103
+ }
104
+ // Memory config duplicates: brain describes what memory is for when memory.purpose already covers it
105
+ if (/\bdurable\b.*\bmemor(y|ies)\b|\bmemor(y|ies)\b.*\bnot\b.*\b(active|settings|targets|declared)\b/i.test(line)) {
106
+ if (memory?.purpose || memory?.categories) {
107
+ duplicates.push({
108
+ targetLayer: 'memory-purpose',
109
+ target: 'memory',
110
+ brainText: line,
111
+ section: sectionName,
112
+ suggestion: `memory.purpose/categories already define what memory is for. Strengthen that config instead of restating in the brain.`,
113
+ });
114
+ }
115
+ }
116
+ // Identity keystone duplicates: brain restates the "single most impactful thing" frame
117
+ if (identity?.keystone && keystoneOverlap(line)) {
118
+ duplicates.push({
119
+ targetLayer: 'identity-keystone',
120
+ target: 'keystone',
121
+ brainText: line,
122
+ section: sectionName,
123
+ suggestion: `identity.keystone already asks for the single most impactful move this turn. This brain line paraphrases that. Remove — the keystone is injected early in the prompt.`,
124
+ });
125
+ }
126
+ // Identity northStar duplicates: brain restates the persona's enduring goal
127
+ if (identity?.northStar && northStarOverlap(line, identity.northStar)) {
128
+ duplicates.push({
129
+ targetLayer: 'identity-northstar',
130
+ target: 'northStar',
131
+ brainText: line,
132
+ section: sectionName,
133
+ suggestion: `identity.northStar already carries the persona's enduring goal. This brain line restates it. Remove.`,
134
+ });
135
+ }
136
+ // Voice formatting leaks: brain talks about markdown/rendering when voice.formatting exists (or should)
137
+ if (voiceFormattingLeak(line)) {
138
+ duplicates.push({
139
+ targetLayer: 'voice-formatting',
140
+ target: 'voice.formatting',
141
+ brainText: line,
142
+ section: sectionName,
143
+ suggestion: voice?.formatting
144
+ ? `This is markdown/rendering info — belongs in voice.formatting (which already exists), not in methodology.`
145
+ : `This is markdown/rendering info — belongs in voice.formatting. Move it there so the brain stays focused on domain intent.`,
146
+ });
147
+ }
148
+ }
149
+ }
150
+ return {
151
+ pass: duplicates.length === 0,
152
+ duplicates,
153
+ };
154
+ }
155
+ /**
156
+ * Pull meaningful lines from a brain section — skip headers, markers, blank lines,
157
+ * but keep bullet items and prose paragraphs as candidate rules.
158
+ */
159
+ function extractMeaningfulLines(content) {
160
+ return content
161
+ .split('\n')
162
+ .map((raw) => raw.replace(/^[-*]\s+/, '').trim())
163
+ .filter((line) => {
164
+ if (!line)
165
+ return false;
166
+ if (line.length < 15)
167
+ return false;
168
+ if (line.startsWith('#'))
169
+ return false;
170
+ return true;
171
+ });
172
+ }
173
+ /**
174
+ * A line "names" an entity if the entity name appears as a word (not as a substring
175
+ * of an unrelated word). We use word-boundary matching and also try the pluralized
176
+ * form (entities often appear as "threads" when the name is "thread").
177
+ */
178
+ function lineNamesEntity(lowerLine, entityName) {
179
+ const esc = entityName.toLowerCase().replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
180
+ if (new RegExp(`\\b${esc}\\b`).test(lowerLine))
181
+ return true;
182
+ // Try simple plural: entity + 's' or entity + 'es'
183
+ if (new RegExp(`\\b${esc}s\\b`).test(lowerLine))
184
+ return true;
185
+ if (new RegExp(`\\b${esc}es\\b`).test(lowerLine))
186
+ return true;
187
+ return false;
188
+ }
189
+ /**
190
+ * A line looks "definitional" when it reads as an explanation of what the entity
191
+ * IS or WHAT IT CAPTURES, rather than a rule about when to use it. These
192
+ * belong in the entity's description, not the brain.
193
+ *
194
+ * Patterns we catch:
195
+ * - `"[entity]s" are X` / `'[entity]s' are X`
196
+ * - `[entity] (is|are) [definition]`
197
+ * - `[entity] (have|means|represents|captures) X`
198
+ * - `[entity] (persist|exist|live|work) ...`
199
+ */
200
+ function lineLooksDefinitional(line, entityName) {
201
+ const lower = line.toLowerCase();
202
+ const esc = entityName.toLowerCase().replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
203
+ // "threads are CEO-level challenges"
204
+ if (new RegExp(`["']?${esc}s?["']?\\s+(are|is)\\s+\\w+`, 'i').test(lower))
205
+ return true;
206
+ // "forcing functions have owners and deadlines"
207
+ if (new RegExp(`\\b${esc}s?\\s+(have|means?|represents?|captures?|records?|persists?|exist|live)\\b`, 'i').test(lower))
208
+ return true;
209
+ // "movement means decisions" — defining a concept the enum/schema encodes
210
+ if (new RegExp(`\\b(movement|progress|status|completion)\\b.*\\b(means?|is|includes?)\\b`, 'i').test(lower))
211
+ return true;
212
+ return false;
213
+ }
214
+ /** Concept overlap with identity.keystone — "single most impactful move/thing". */
215
+ function keystoneOverlap(line) {
216
+ const lower = line.toLowerCase();
217
+ // The keystone always asks for the single highest-leverage move. Brain
218
+ // paraphrases take forms like "80/20", "biggest lever", "single move",
219
+ // "highest leverage", "one thing that matters most".
220
+ return (/\b80[/\\-]?20\b/.test(lower) ||
221
+ /\b(single|one)\s+(move|thing|lever|question|message)\b.*\b(most|matters|impactful|leverage|disproportionate|highest|biggest)\b/i.test(lower) ||
222
+ /\b(highest|biggest)\s+(leverage|lever|impact)\b/i.test(lower) ||
223
+ /\bleverage point\b/.test(lower) ||
224
+ /\bone (move|thing) that (creates|matters|moves)\b/i.test(lower));
225
+ }
226
+ /**
227
+ * Concept overlap with identity.northStar. Compare by shared distinctive words
228
+ * (nouns ≥4 chars, excluding stopwords) between the brain line and northStar.
229
+ * Threshold: ≥3 shared distinctive words AND the line is mostly restating
230
+ * the goal (short / principle-shaped, not scene-setting).
231
+ */
232
+ function northStarOverlap(line, northStar) {
233
+ const stop = new Set([
234
+ 'the', 'a', 'an', 'and', 'or', 'but', 'for', 'from', 'with', 'into',
235
+ 'over', 'through', 'their', 'them', 'that', 'this', 'those', 'these',
236
+ 'what', 'when', 'where', 'which', 'while', 'your', 'yours', 'you',
237
+ 'its', 'is', 'are', 'be', 'been', 'have', 'has', 'had', 'will', 'would',
238
+ ]);
239
+ const norm = (s) => s.toLowerCase().match(/[a-z]{4,}/g) ?? [];
240
+ const lineTokens = new Set(norm(line).filter((t) => !stop.has(t)));
241
+ const starTokens = new Set(norm(northStar).filter((t) => !stop.has(t)));
242
+ let shared = 0;
243
+ for (const t of starTokens)
244
+ if (lineTokens.has(t))
245
+ shared++;
246
+ // Need substantial overlap AND line should be relatively short / principle-shaped
247
+ return shared >= 3 && line.length < 200;
248
+ }
249
+ /**
250
+ * Detect markdown/rendering mentions that belong in voice.formatting, not the
251
+ * brain's methodology.
252
+ */
253
+ function voiceFormattingLeak(line) {
254
+ const lower = line.toLowerCase();
255
+ return (/\bmarkdown\b/.test(lower) ||
256
+ /\brenders?\b.*\b(rich|formatting|bold|italic|span)\b/i.test(lower) ||
257
+ /\bformatting\b.*\b(helps? structure|when it helps?)\b/i.test(lower) ||
258
+ /\*\*bold\*\*/.test(line) ||
259
+ /<span style=/.test(line));
260
+ }
261
+ /**
262
+ * Detect whether a line reads like a rule/directive about what the AI should do,
263
+ * as opposed to scene-setting prose that merely mentions an entity.
264
+ */
265
+ function lineLooksPrescriptive(line) {
266
+ const lower = line.toLowerCase();
267
+ const triggers = [
268
+ /\buse the\b/,
269
+ /\buse \w+\b/,
270
+ /\bupdate the\b/,
271
+ /\brecord\b/,
272
+ /\blive in\b/,
273
+ /\blives? here\b/,
274
+ /\bsettings? use\b/,
275
+ /\bnot (in )?(memor|memories)\b/,
276
+ /\bfor [a-z ]+ updates?,? use\b/,
277
+ /\bif (given|reported) in\b/,
278
+ /\bconvert to\b/,
279
+ /\bthe recipe is part of\b/,
280
+ /\bvisible card\b/,
281
+ /\bdraft meals?\b.*\b(recipe|card|update)\b/,
282
+ /\bprofile settings?\b/,
283
+ /\bshould\b.*\bnot\b/,
284
+ /\bdo not\b/,
285
+ /\bmust\b/,
286
+ ];
287
+ return triggers.some((pattern) => pattern.test(lower));
288
+ }
289
+ //# sourceMappingURL=cross-layer-duplicates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cross-layer-duplicates.js","sourceRoot":"","sources":["../../src/evals/cross-layer-duplicates.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import type { PersonaConfig, Memory } from '../types.js';
2
+ export interface EntityVisibilityAuditInput {
3
+ config: PersonaConfig;
4
+ /** A representative context the app passes to chat() — typically the fixture or live callsite shape */
5
+ context: Record<string, unknown>;
6
+ /** Memories the caller would pass to chat() — needed to verify memory visibility */
7
+ memories?: Memory[];
8
+ /** Craft memories the caller would pass to chat() — needed to verify craftMemory visibility */
9
+ craftMemories?: Memory[];
10
+ }
11
+ export interface EntityVisibilityIssue {
12
+ severity: 'error';
13
+ entity: string;
14
+ principle: 'not-visible-in-context';
15
+ message: string;
16
+ suggestion: string;
17
+ }
18
+ export interface EntityVisibilityResult {
19
+ pass: boolean;
20
+ issues: EntityVisibilityIssue[];
21
+ /** Per-entity verdict so callers can see which passed, which didn't, and how. */
22
+ perEntity: Record<string, {
23
+ visible: boolean;
24
+ how: string | null;
25
+ }>;
26
+ }
27
+ export declare function auditEntityVisibility(input: EntityVisibilityAuditInput): EntityVisibilityResult;
28
+ //# sourceMappingURL=entity-visibility.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity-visibility.d.ts","sourceRoot":"","sources":["../../src/evals/entity-visibility.ts"],"names":[],"mappings":"AAsCA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAExD,MAAM,WAAW,0BAA0B;IACzC,MAAM,EAAE,aAAa,CAAA;IACrB,uGAAuG;IACvG,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAChC,oFAAoF;IACpF,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;IACnB,+FAA+F;IAC/F,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;CACzB;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,OAAO,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,wBAAwB,CAAA;IACnC,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,OAAO,CAAA;IACb,MAAM,EAAE,qBAAqB,EAAE,CAAA;IAC/B,iFAAiF;IACjF,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC,CAAA;CACpE;AAED,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,0BAA0B,GAChC,sBAAsB,CAsCxB"}
@@ -0,0 +1,216 @@
1
+ /**
2
+ * Entity visibility auditor — single job: verify the AI will actually be shown
3
+ * a record with an id it can target for update/delete on every entity that
4
+ * declares CRUD beyond create.
5
+ *
6
+ * The bug class: a persona declares an entity with full CRUD (create / update /
7
+ * delete), but no record carrying an id reaches the prompt. At chat time the
8
+ * AI has nothing to target — so when the user says "switch to maintenance and
9
+ * set 2300 calories," the AI can't address profile or dailyTargets and
10
+ * quietly falls back to saving a memory instead. Guardrails score the failure,
11
+ * the judge never sees the cause, and the fix — populating a record with an
12
+ * id at the right surface — is invisible at code review.
13
+ *
14
+ * Two surfaces carry records to the AI, and this audit checks both:
15
+ *
16
+ * 1. DOMAIN ENTITIES → via contextInputs. Only keys declared in
17
+ * `config.contextInputs` get serialized (src/core/context.ts); undeclared
18
+ * keys are silently dropped. Required predicate:
19
+ * declared contextInput at K
20
+ * ∧ runtime context[K] has a record with a non-empty `id` string
21
+ * ∧ K is an idiomatic name for this entity
22
+ *
23
+ * 2. MEMORY / CRAFT MEMORY → via their dedicated prompt blocks
24
+ * (src/core/memory.ts, src/core/prompt-builder.ts). `memory` defaults
25
+ * to includeIds=false, so the AI sees content without ids unless the
26
+ * persona explicitly opts in. `craftMemory` hardcodes includeIds=true,
27
+ * so the only concern is whether the block renders at all (requires
28
+ * craftMemory.enabled AND craftMemories provided).
29
+ *
30
+ * Anything else is a latent bug. The audit answers one question per entity
31
+ * and fails loudly. It does NOT audit entity quality, description prose, or
32
+ * field schemas — those belong to auditActionContracts.
33
+ *
34
+ * Not a runtime check — it runs against a representative context the app
35
+ * would pass to chat() (a fixture, a live callsite shape, or an integration
36
+ * harness's sample payload).
37
+ */
38
+ import { allowedOperations } from '../core/entity-helpers.js';
39
+ export function auditEntityVisibility(input) {
40
+ const issues = [];
41
+ const perEntity = {};
42
+ const entities = input.config.entities ?? {};
43
+ const contextInputs = input.config.contextInputs ?? {};
44
+ for (const [name, entity] of Object.entries(entities)) {
45
+ const ops = allowedOperations(entity);
46
+ if (!ops.includes('update') && !ops.includes('delete')) {
47
+ perEntity[name] = { visible: true, how: 'create-only operations (update/delete not expected)' };
48
+ continue;
49
+ }
50
+ const visibility = name === 'memory'
51
+ ? checkMemoryVisibility(input.config, input.memories ?? [])
52
+ : name === 'craftMemory'
53
+ ? checkCraftMemoryVisibility(input.config, input.craftMemories ?? [])
54
+ : findVisibility(name, input.context, contextInputs);
55
+ perEntity[name] = visibility;
56
+ if (!visibility.visible) {
57
+ issues.push({
58
+ severity: 'error',
59
+ entity: name,
60
+ principle: 'not-visible-in-context',
61
+ message: visibilityFailureMessage(name, input.config, input.memories, input.craftMemories),
62
+ suggestion: visibilityFailureSuggestion(name),
63
+ });
64
+ }
65
+ }
66
+ return {
67
+ pass: issues.length === 0,
68
+ issues,
69
+ perEntity,
70
+ };
71
+ }
72
+ // ─── Memory / craftMemory visibility ────────────────────────────────────────
73
+ // Memory records reach the prompt via a dedicated block, not contextInputs.
74
+ // See src/core/memory.ts (selectMemoriesForPrompt) and src/core/prompt-builder.ts.
75
+ //
76
+ // memory: includeIds is caller-chosen, defaults FALSE. If memory is
77
+ // declared as an updatable entity but config.memory.includeIds
78
+ // isn't true, memories render without ids and the AI can't
79
+ // target them.
80
+ // craftMemory: includeIds is hardcoded TRUE inside the craftMemory block.
81
+ // Visibility depends on the block rendering at all, which
82
+ // requires config.craftMemory.enabled AND craftMemories provided.
83
+ function checkMemoryVisibility(config, memories) {
84
+ const includeIds = config.memory?.includeIds === true;
85
+ const hasMemoryWithId = memories.some(isMemoryWithId);
86
+ if (!includeIds || !hasMemoryWithId)
87
+ return { visible: false, how: null };
88
+ return { visible: true, how: 'MEMORY block (memory.includeIds=true, memories provided)' };
89
+ }
90
+ function checkCraftMemoryVisibility(config, craftMemories) {
91
+ const enabled = config.craftMemory?.enabled === true;
92
+ const hasCraftWithId = craftMemories.some(isMemoryWithId);
93
+ if (!enabled || !hasCraftWithId)
94
+ return { visible: false, how: null };
95
+ return { visible: true, how: 'CRAFT MEMORY block (craftMemory.enabled=true, craftMemories provided, includeIds is hardcoded on)' };
96
+ }
97
+ function isMemoryWithId(memory) {
98
+ return typeof memory?.id === 'string' && memory.id.length > 0;
99
+ }
100
+ function visibilityFailureMessage(name, config, memories, craftMemories) {
101
+ if (name === 'memory') {
102
+ if (config.memory?.includeIds !== true) {
103
+ return 'Entity "memory" is declared as updatable but config.memory.includeIds is not true — the MEMORY block renders without ids, so the AI has nothing to target for update or delete.';
104
+ }
105
+ if (!memories || memories.length === 0) {
106
+ return 'Entity "memory" is declared as updatable but no memories were provided to the audit — the MEMORY block will be empty, giving the AI no records to target.';
107
+ }
108
+ return 'Entity "memory" is declared as updatable but the provided memories lack non-empty string ids.';
109
+ }
110
+ if (name === 'craftMemory') {
111
+ if (config.craftMemory?.enabled !== true) {
112
+ return 'Entity "craftMemory" is declared but config.craftMemory.enabled is not true — the CRAFT MEMORY block never renders.';
113
+ }
114
+ if (!craftMemories || craftMemories.length === 0) {
115
+ return 'Entity "craftMemory" is declared as updatable but no craftMemories were provided to the audit — the CRAFT MEMORY block will be empty, giving the AI no records to target.';
116
+ }
117
+ return 'Entity "craftMemory" is declared as updatable but the provided craftMemories lack non-empty string ids.';
118
+ }
119
+ return `Entity "${name}" is declared as updatable but no record with an id reaches the prompt — the AI has nothing to target for update or delete.`;
120
+ }
121
+ function visibilityFailureSuggestion(name) {
122
+ if (name === 'memory') {
123
+ return 'Set memory.includeIds: true in the persona config and ensure memories are provided at chat time. If memory is only ever created (never updated or deleted), set createOnly: true on the memory entity config.';
124
+ }
125
+ if (name === 'craftMemory') {
126
+ return 'Set craftMemory.enabled: true in the persona config and ensure craftMemories are provided at chat time. If craftMemory is only ever created, set createOnly: true on the entity config.';
127
+ }
128
+ return `Declare a contextInput whose key matches "${name}" (or its plural) AND populate the runtime context at that key with record(s) carrying a non-empty string id. If this entity is only ever created, set createOnly: true on the entity config.`;
129
+ }
130
+ // ─── Domain entity visibility detection ─────────────────────────────────────
131
+ //
132
+ // For each entity, walk the conventional key names in priority order. A key
133
+ // makes an entity visible only when BOTH:
134
+ // 1. `config.contextInputs[key]` is declared — without this the SDK skips
135
+ // the block entirely and no id reaches the prompt.
136
+ // 2. `context[key]` holds at least one record with a non-empty `id` string.
137
+ //
138
+ // We intentionally don't accept arbitrary contextInput keys (e.g., a
139
+ // contextInput called `userSettings` carrying profile records). Conventional
140
+ // naming is enforceable and keeps the audit's answer unambiguous. Developers
141
+ // with exotic plumbing can rename or set `createOnly: true`.
142
+ function findVisibility(entityName, context, contextInputs) {
143
+ for (const key of Object.keys(contextInputs)) {
144
+ if (!keyMatchesEntity(key, entityName))
145
+ continue;
146
+ if (!hasRecordWithId(context[key]))
147
+ continue;
148
+ return { visible: true, how: `context.${key} (via contextInputs.${key})` };
149
+ }
150
+ return { visible: false, how: null };
151
+ }
152
+ function hasRecordWithId(value) {
153
+ if (value == null)
154
+ return false;
155
+ if (Array.isArray(value)) {
156
+ return value.some(isObjectWithId);
157
+ }
158
+ if (typeof value === 'object') {
159
+ return isObjectWithId(value);
160
+ }
161
+ return false;
162
+ }
163
+ function isObjectWithId(value) {
164
+ if (!value || typeof value !== 'object')
165
+ return false;
166
+ const id = value.id;
167
+ return typeof id === 'string' && id.length > 0;
168
+ }
169
+ // Match a contextInput key to an entity via three idiomatic conventions:
170
+ // 1. Explicit suffix: profile / profiles / profileRecord / profileRecords
171
+ // 2. Pure plural: threads / forcingFunctions / coachingNotes
172
+ // 3. Semantic prefix + plural: openTasks / recentWorkouts / recentMistakes
173
+ // The "semantic prefix" convention is pervasive in real personas — the prefix
174
+ // names the subset of records being surfaced (open, recent, active, etc.).
175
+ // The rule: tokenize the key in camelCase; the LAST token, lowercased, must
176
+ // equal the entity's last token (as-is or naively pluralized).
177
+ function keyMatchesEntity(key, entityName) {
178
+ const k = key.toLowerCase();
179
+ const n = entityName.toLowerCase();
180
+ if (k === n)
181
+ return true;
182
+ if (k === `${n}s`)
183
+ return true;
184
+ if (k === `${n}record`)
185
+ return true;
186
+ if (k === `${n}records`)
187
+ return true;
188
+ const keyTokens = tokenize(key);
189
+ const entityTokens = tokenize(entityName);
190
+ if (keyTokens.length === 0 || entityTokens.length === 0)
191
+ return false;
192
+ const lastKey = keyTokens[keyTokens.length - 1];
193
+ const lastEntity = entityTokens[entityTokens.length - 1];
194
+ if (lastKey === lastEntity)
195
+ return true;
196
+ if (lastKey === naivePluralize(lastEntity))
197
+ return true;
198
+ return false;
199
+ }
200
+ function tokenize(name) {
201
+ return name
202
+ .replace(/([a-z0-9])([A-Z])/g, '$1 $2')
203
+ .toLowerCase()
204
+ .split(/[\s_-]+/)
205
+ .filter(Boolean);
206
+ }
207
+ function naivePluralize(word) {
208
+ if (word.endsWith('y') && !/[aeiou]y$/.test(word)) {
209
+ return word.slice(0, -1) + 'ies';
210
+ }
211
+ if (/(?:s|x|z|ch|sh)$/.test(word)) {
212
+ return word + 'es';
213
+ }
214
+ return word + 's';
215
+ }
216
+ //# sourceMappingURL=entity-visibility.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity-visibility.js","sourceRoot":"","sources":["../../src/evals/entity-visibility.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ export { runEvalConversation } from './runtime.js';
2
+ export { auditBrainBloat } from './brain-bloat.js';
3
+ export { auditOperationalPromptContract } from './operational-contract.js';
4
+ export { auditPromptContent } from './prompt-content.js';
5
+ export { auditCrossLayerDuplicates } from './cross-layer-duplicates.js';
6
+ export { auditActionContracts } from './action-contracts.js';
7
+ export { auditBrainPrescriptions } from './brain-prescriptions.js';
8
+ export { auditEntityVisibility } from './entity-visibility.js';
9
+ export type { CrossLayerAuditInput, CrossLayerAuditResult, CrossLayerDuplicate, } from './cross-layer-duplicates.js';
10
+ export type { ActionContractAuditInput, ActionContractAuditResult, ActionContractIssue, } from './action-contracts.js';
11
+ export type { BrainPrescriptionsAuditInput, BrainPrescriptionsAuditResult, BrainPrescription, AuditScope, } from './brain-prescriptions.js';
12
+ export type { EntityVisibilityAuditInput, EntityVisibilityIssue, EntityVisibilityResult, } from './entity-visibility.js';
13
+ export type { BrainBloatAuditInput, BrainBloatAuditIssue, BrainBloatAuditOptions, BrainBloatAuditResult, BrainBloatSectionMetric, } from './brain-bloat.js';
14
+ export type { OperationalPromptRequirement, OperationalPromptContractInput, OperationalPromptContractIssue, OperationalPromptContractResult, } from './operational-contract.js';
15
+ export type { PromptContentAuditInput, PromptContentAuditIssue, PromptContentAuditResult, } from './prompt-content.js';
16
+ export { SAMPLE_PROJECTS, coachProject, nutritionProject, fitnessProject, languageTutorProject, chiefOfStaffProject, } from './sample-projects.js';
17
+ export { judgeEvalTurn, judgeEvalConversation, judgePairwiseConversations, } from './judge.js';
18
+ export type { EvalState, EvalProject, EvalTurn, EvalTurnResult, EvalConversationResult, EvalActionRecord, EvalJudgeScenario, EvalJudgeCriterionScore, EvalJudgeVerdict, EvalPairwiseVerdict, CrudHandler, } from './types.js';
19
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/evals/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,EAAE,8BAA8B,EAAE,MAAM,2BAA2B,CAAA;AAC1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AACxD,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAA;AACvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AAC5D,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAA;AAClE,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAA;AAC9D,YAAY,EACV,oBAAoB,EACpB,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,6BAA6B,CAAA;AACpC,YAAY,EACV,wBAAwB,EACxB,yBAAyB,EACzB,mBAAmB,GACpB,MAAM,uBAAuB,CAAA;AAC9B,YAAY,EACV,4BAA4B,EAC5B,6BAA6B,EAC7B,iBAAiB,EACjB,UAAU,GACX,MAAM,0BAA0B,CAAA;AACjC,YAAY,EACV,0BAA0B,EAC1B,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,wBAAwB,CAAA;AAC/B,YAAY,EACV,oBAAoB,EACpB,oBAAoB,EACpB,sBAAsB,EACtB,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,kBAAkB,CAAA;AACzB,YAAY,EACV,4BAA4B,EAC5B,8BAA8B,EAC9B,8BAA8B,EAC9B,+BAA+B,GAChC,MAAM,2BAA2B,CAAA;AAClC,YAAY,EACV,uBAAuB,EACvB,uBAAuB,EACvB,wBAAwB,GACzB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EACL,eAAe,EACf,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACd,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EACL,aAAa,EACb,qBAAqB,EACrB,0BAA0B,GAC3B,MAAM,YAAY,CAAA;AACnB,YAAY,EACV,SAAS,EACT,WAAW,EACX,QAAQ,EACR,cAAc,EACd,sBAAsB,EACtB,gBAAgB,EAChB,iBAAiB,EACjB,uBAAuB,EACvB,gBAAgB,EAChB,mBAAmB,EACnB,WAAW,GACZ,MAAM,YAAY,CAAA"}