mirror-mind 0.0.1 → 0.32.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 (467) hide show
  1. package/.claude/hooks/log-session-end.sh +85 -0
  2. package/.claude/hooks/log-user-prompt.sh +85 -0
  3. package/.claude/hooks/mirror-inject.sh +85 -0
  4. package/.claude/hooks/session-start.sh +85 -0
  5. package/.gemini/hooks/log-assistant.sh +85 -0
  6. package/.gemini/hooks/log-user.sh +85 -0
  7. package/.gemini/hooks/session-end.sh +85 -0
  8. package/.gemini/hooks/session-start.sh +85 -0
  9. package/.pi/extensions/mirror-logger.ts +561 -0
  10. package/.pi/skills/mm-backup/SKILL.md +21 -0
  11. package/.pi/skills/mm-build/SKILL.md +1206 -0
  12. package/.pi/skills/mm-consolidate/SKILL.md +112 -0
  13. package/.pi/skills/mm-consult/SKILL.md +70 -0
  14. package/.pi/skills/mm-conversations/SKILL.md +16 -0
  15. package/.pi/skills/mm-discard/SKILL.md +39 -0
  16. package/.pi/skills/mm-explore/SKILL.md +255 -0
  17. package/.pi/skills/mm-help/SKILL.md +74 -0
  18. package/.pi/skills/mm-identity/SKILL.md +96 -0
  19. package/.pi/skills/mm-journal/SKILL.md +16 -0
  20. package/.pi/skills/mm-journey/SKILL.md +23 -0
  21. package/.pi/skills/mm-journeys/SKILL.md +15 -0
  22. package/.pi/skills/mm-memories/SKILL.md +17 -0
  23. package/.pi/skills/mm-mirror/SKILL.md +98 -0
  24. package/.pi/skills/mm-mute/SKILL.md +18 -0
  25. package/.pi/skills/mm-new/SKILL.md +18 -0
  26. package/.pi/skills/mm-recall/SKILL.md +17 -0
  27. package/.pi/skills/mm-release-notes/SKILL.md +52 -0
  28. package/.pi/skills/mm-seed/SKILL.md +19 -0
  29. package/.pi/skills/mm-shadow/SKILL.md +117 -0
  30. package/.pi/skills/mm-soul/SKILL.md +502 -0
  31. package/.pi/skills/mm-tasks/SKILL.md +24 -0
  32. package/.pi/skills/mm-update/SKILL.md +32 -0
  33. package/.pi/skills/mm-week/SKILL.md +28 -0
  34. package/.pi/skills/mm-welcome/SKILL.md +24 -0
  35. package/AGENTS.md +188 -0
  36. package/README.md +126 -9
  37. package/bin/loader.js +67 -0
  38. package/bin/mirror-hook.js +7 -0
  39. package/bin/mirror.js +7 -0
  40. package/docs/releases/index.md +99 -0
  41. package/docs/releases/pending-cutoffs.md +510 -0
  42. package/docs/releases/v0.10.0.md +123 -0
  43. package/docs/releases/v0.10.1.md +66 -0
  44. package/docs/releases/v0.10.10.md +51 -0
  45. package/docs/releases/v0.10.11.md +39 -0
  46. package/docs/releases/v0.10.12.md +57 -0
  47. package/docs/releases/v0.10.13.md +35 -0
  48. package/docs/releases/v0.10.14.md +42 -0
  49. package/docs/releases/v0.10.15.md +53 -0
  50. package/docs/releases/v0.10.16.md +35 -0
  51. package/docs/releases/v0.10.17.md +43 -0
  52. package/docs/releases/v0.10.2.md +64 -0
  53. package/docs/releases/v0.10.3.md +78 -0
  54. package/docs/releases/v0.10.4.md +42 -0
  55. package/docs/releases/v0.10.5.md +57 -0
  56. package/docs/releases/v0.10.6.md +47 -0
  57. package/docs/releases/v0.10.7.md +53 -0
  58. package/docs/releases/v0.10.8.md +49 -0
  59. package/docs/releases/v0.10.9.md +37 -0
  60. package/docs/releases/v0.11.0.md +86 -0
  61. package/docs/releases/v0.12.0.md +67 -0
  62. package/docs/releases/v0.13.0.md +64 -0
  63. package/docs/releases/v0.14.0.md +68 -0
  64. package/docs/releases/v0.15.0.md +48 -0
  65. package/docs/releases/v0.16.0.md +50 -0
  66. package/docs/releases/v0.16.1.md +55 -0
  67. package/docs/releases/v0.16.2.md +36 -0
  68. package/docs/releases/v0.17.0.md +50 -0
  69. package/docs/releases/v0.17.1.md +58 -0
  70. package/docs/releases/v0.17.2.md +42 -0
  71. package/docs/releases/v0.17.3.md +58 -0
  72. package/docs/releases/v0.18.0.md +84 -0
  73. package/docs/releases/v0.18.1.md +51 -0
  74. package/docs/releases/v0.18.2.md +69 -0
  75. package/docs/releases/v0.19.0.md +85 -0
  76. package/docs/releases/v0.19.1.md +46 -0
  77. package/docs/releases/v0.20.0.md +85 -0
  78. package/docs/releases/v0.21.0.md +61 -0
  79. package/docs/releases/v0.21.1.md +47 -0
  80. package/docs/releases/v0.22.0.md +77 -0
  81. package/docs/releases/v0.22.1.md +42 -0
  82. package/docs/releases/v0.23.0.md +105 -0
  83. package/docs/releases/v0.24.0.md +125 -0
  84. package/docs/releases/v0.25.0.md +107 -0
  85. package/docs/releases/v0.26.0.md +139 -0
  86. package/docs/releases/v0.26.1.md +65 -0
  87. package/docs/releases/v0.26.2.md +43 -0
  88. package/docs/releases/v0.27.0.md +63 -0
  89. package/docs/releases/v0.28.0.md +59 -0
  90. package/docs/releases/v0.29.0.md +61 -0
  91. package/docs/releases/v0.29.1.md +59 -0
  92. package/docs/releases/v0.29.2.md +59 -0
  93. package/docs/releases/v0.29.3.md +93 -0
  94. package/docs/releases/v0.30.0.md +75 -0
  95. package/docs/releases/v0.30.1.md +93 -0
  96. package/docs/releases/v0.30.2.md +66 -0
  97. package/docs/releases/v0.31.0.md +122 -0
  98. package/docs/releases/v0.31.1.md +142 -0
  99. package/docs/releases/v0.31.10.md +118 -0
  100. package/docs/releases/v0.31.11.md +88 -0
  101. package/docs/releases/v0.31.12.md +105 -0
  102. package/docs/releases/v0.31.13.md +99 -0
  103. package/docs/releases/v0.31.14.md +97 -0
  104. package/docs/releases/v0.31.2.md +115 -0
  105. package/docs/releases/v0.31.3.md +142 -0
  106. package/docs/releases/v0.31.4.md +117 -0
  107. package/docs/releases/v0.31.5.md +155 -0
  108. package/docs/releases/v0.31.6.md +132 -0
  109. package/docs/releases/v0.31.7.md +132 -0
  110. package/docs/releases/v0.31.8.md +120 -0
  111. package/docs/releases/v0.31.9.md +120 -0
  112. package/docs/releases/v0.32.0.md +261 -0
  113. package/docs/releases/v0.32.1.md +59 -0
  114. package/docs/releases/v0.8.0.md +118 -0
  115. package/docs/releases/v0.9.0.md +98 -0
  116. package/docs/releases/v0.9.1.md +83 -0
  117. package/package.json +102 -6
  118. package/plugins/mirror-mind/.claude-plugin/plugin.json +13 -0
  119. package/plugins/mirror-mind/hooks/hooks.json +50 -0
  120. package/plugins/mirror-mind/hooks/log-session-end.sh +98 -0
  121. package/plugins/mirror-mind/hooks/log-user-prompt.sh +98 -0
  122. package/plugins/mirror-mind/hooks/mirror-inject.sh +98 -0
  123. package/plugins/mirror-mind/hooks/session-start.sh +98 -0
  124. package/plugins/mirror-mind/mcp/launch.sh +52 -0
  125. package/plugins/mirror-mind/skills/mm-backup/SKILL.md +27 -0
  126. package/plugins/mirror-mind/skills/mm-build/SKILL.md +1206 -0
  127. package/plugins/mirror-mind/skills/mm-consolidate/SKILL.md +112 -0
  128. package/plugins/mirror-mind/skills/mm-consult/SKILL.md +83 -0
  129. package/plugins/mirror-mind/skills/mm-conversations/SKILL.md +17 -0
  130. package/plugins/mirror-mind/skills/mm-discard/SKILL.md +40 -0
  131. package/plugins/mirror-mind/skills/mm-explore/SKILL.md +241 -0
  132. package/plugins/mirror-mind/skills/mm-help/SKILL.md +104 -0
  133. package/plugins/mirror-mind/skills/mm-identity/SKILL.md +96 -0
  134. package/plugins/mirror-mind/skills/mm-journal/SKILL.md +21 -0
  135. package/plugins/mirror-mind/skills/mm-journey/SKILL.md +37 -0
  136. package/plugins/mirror-mind/skills/mm-journeys/SKILL.md +15 -0
  137. package/plugins/mirror-mind/skills/mm-memories/SKILL.md +20 -0
  138. package/plugins/mirror-mind/skills/mm-mirror/SKILL.md +65 -0
  139. package/plugins/mirror-mind/skills/mm-mute/SKILL.md +18 -0
  140. package/plugins/mirror-mind/skills/mm-new/SKILL.md +18 -0
  141. package/plugins/mirror-mind/skills/mm-recall/SKILL.md +17 -0
  142. package/plugins/mirror-mind/skills/mm-release-notes/SKILL.md +31 -0
  143. package/plugins/mirror-mind/skills/mm-seed/SKILL.md +15 -0
  144. package/plugins/mirror-mind/skills/mm-shadow/SKILL.md +117 -0
  145. package/plugins/mirror-mind/skills/mm-soul/SKILL.md +488 -0
  146. package/plugins/mirror-mind/skills/mm-tasks/SKILL.md +36 -0
  147. package/plugins/mirror-mind/skills/mm-update/SKILL.md +30 -0
  148. package/plugins/mirror-mind/skills/mm-week/SKILL.md +46 -0
  149. package/plugins/mirror-mind/skills/mm-welcome/SKILL.md +22 -0
  150. package/scripts/codex-hooks/session-end.sh +85 -0
  151. package/scripts/codex-hooks/session-start.sh +85 -0
  152. package/scripts/codex-mirror.sh +48 -0
  153. package/templates/identity/README.md +119 -0
  154. package/templates/identity/ego/behavior.yaml +52 -0
  155. package/templates/identity/ego/constraints.yaml +15 -0
  156. package/templates/identity/ego/identity.yaml +43 -0
  157. package/templates/identity/journeys/personal-growth.yaml +39 -0
  158. package/templates/identity/organization/identity.yaml +24 -0
  159. package/templates/identity/organization/principles.yaml +17 -0
  160. package/templates/identity/personas/coach.yaml +94 -0
  161. package/templates/identity/personas/designer.yaml +93 -0
  162. package/templates/identity/personas/doctor.yaml +96 -0
  163. package/templates/identity/personas/engineer.yaml +77 -0
  164. package/templates/identity/personas/financial.yaml +97 -0
  165. package/templates/identity/personas/prompt-engineer.yaml +122 -0
  166. package/templates/identity/personas/researcher.yaml +88 -0
  167. package/templates/identity/personas/strategist.yaml +91 -0
  168. package/templates/identity/personas/teacher.yaml +95 -0
  169. package/templates/identity/personas/therapist.yaml +91 -0
  170. package/templates/identity/personas/thinker.yaml +74 -0
  171. package/templates/identity/personas/writer.yaml +76 -0
  172. package/templates/identity/self/config.yaml +16 -0
  173. package/templates/identity/self/soul.yaml +105 -0
  174. package/templates/identity/user/identity.yaml +30 -0
  175. package/ts/src/backup/staging.ts +62 -0
  176. package/ts/src/backup/zipBackup.ts +267 -0
  177. package/ts/src/backup/zipReader.ts +109 -0
  178. package/ts/src/backup/zipWriter.ts +148 -0
  179. package/ts/src/builder/activeCheckpoint.ts +134 -0
  180. package/ts/src/builder/aggregateStatus.ts +34 -0
  181. package/ts/src/builder/approve.ts +149 -0
  182. package/ts/src/builder/argv.ts +292 -0
  183. package/ts/src/builder/ariadMethod.ts +536 -0
  184. package/ts/src/builder/artifacts/artifactSurfaces.ts +106 -0
  185. package/ts/src/builder/artifacts/artifactWriter.ts +113 -0
  186. package/ts/src/builder/artifacts/closureArtifacts.ts +199 -0
  187. package/ts/src/builder/artifacts/deliveryStoryArtifacts.ts +316 -0
  188. package/ts/src/builder/artifacts/planArtifacts.ts +242 -0
  189. package/ts/src/builder/artifacts/scaffoldSections.ts +273 -0
  190. package/ts/src/builder/artifacts/scaffoldState.ts +227 -0
  191. package/ts/src/builder/artifacts/storyFiles.ts +61 -0
  192. package/ts/src/builder/artifacts/storyIndex.ts +166 -0
  193. package/ts/src/builder/cadence.ts +59 -0
  194. package/ts/src/builder/card.ts +192 -0
  195. package/ts/src/builder/checkpointRefused.ts +66 -0
  196. package/ts/src/builder/closure.ts +964 -0
  197. package/ts/src/builder/commands.ts +2053 -0
  198. package/ts/src/builder/cursorPosition.ts +176 -0
  199. package/ts/src/builder/cursorTransitions.ts +77 -0
  200. package/ts/src/builder/deliveryCursor.ts +577 -0
  201. package/ts/src/builder/deliveryStoryClosure.ts +521 -0
  202. package/ts/src/builder/deliveryStoryPlan.ts +536 -0
  203. package/ts/src/builder/deliveryStoryReady.ts +160 -0
  204. package/ts/src/builder/deliveryStoryRoadmapClosure.ts +151 -0
  205. package/ts/src/builder/expand.ts +336 -0
  206. package/ts/src/builder/flowUnit.ts +339 -0
  207. package/ts/src/builder/homeSurface.ts +122 -0
  208. package/ts/src/builder/implementationGuard.ts +125 -0
  209. package/ts/src/builder/index.ts +11 -0
  210. package/ts/src/builder/lifecycleRefusal.ts +92 -0
  211. package/ts/src/builder/lifecycleRibbon.ts +159 -0
  212. package/ts/src/builder/load.ts +313 -0
  213. package/ts/src/builder/methodAdoption.ts +113 -0
  214. package/ts/src/builder/methodDefinition.ts +429 -0
  215. package/ts/src/builder/methodInspection.ts +371 -0
  216. package/ts/src/builder/plan.ts +408 -0
  217. package/ts/src/builder/planPreauthorization.ts +265 -0
  218. package/ts/src/builder/prepare.ts +225 -0
  219. package/ts/src/builder/projectPaths.ts +64 -0
  220. package/ts/src/builder/pull.ts +356 -0
  221. package/ts/src/builder/pullCandidates.ts +463 -0
  222. package/ts/src/builder/pullCandidatesRender.ts +238 -0
  223. package/ts/src/builder/refinementField.ts +93 -0
  224. package/ts/src/builder/releaseIntent.ts +173 -0
  225. package/ts/src/builder/resumeState.ts +84 -0
  226. package/ts/src/builder/resumeSurface.ts +149 -0
  227. package/ts/src/builder/roadmapGrammar.ts +300 -0
  228. package/ts/src/builder/roadmapScan.ts +97 -0
  229. package/ts/src/builder/roadmapScope.ts +210 -0
  230. package/ts/src/builder/scopePhrases.ts +146 -0
  231. package/ts/src/builder/storyPaths.ts +196 -0
  232. package/ts/src/builder/storyPlanPreauthorization.ts +287 -0
  233. package/ts/src/builder/surfaceProtocol.ts +42 -0
  234. package/ts/src/builder/templateGeneration.ts +148 -0
  235. package/ts/src/builder/transition.ts +178 -0
  236. package/ts/src/consult/args.ts +99 -0
  237. package/ts/src/consult/core.ts +122 -0
  238. package/ts/src/consult/modelCatalog.ts +55 -0
  239. package/ts/src/consult/render.ts +47 -0
  240. package/ts/src/conversation/append.ts +414 -0
  241. package/ts/src/conversation/backfill.ts +387 -0
  242. package/ts/src/conversation/closeTail.ts +467 -0
  243. package/ts/src/conversation/extraction.ts +333 -0
  244. package/ts/src/conversation/extractionDriver.ts +130 -0
  245. package/ts/src/conversation/extractionRun.ts +70 -0
  246. package/ts/src/conversation/journeyInference.ts +165 -0
  247. package/ts/src/conversation/journeyRepair.ts +114 -0
  248. package/ts/src/conversation/lifecycleFaces.ts +197 -0
  249. package/ts/src/conversation/lifecycleWrites.ts +313 -0
  250. package/ts/src/conversation/listing.ts +77 -0
  251. package/ts/src/conversation/logger.ts +576 -0
  252. package/ts/src/conversation/loggerCli.ts +282 -0
  253. package/ts/src/conversation/loggerRuntime.ts +259 -0
  254. package/ts/src/conversation/metadataLifecycle.ts +443 -0
  255. package/ts/src/conversation/recall.ts +66 -0
  256. package/ts/src/conversation/sessionComposites.ts +258 -0
  257. package/ts/src/conversation/sessionImport.ts +90 -0
  258. package/ts/src/conversation/transcriptBackfill.ts +141 -0
  259. package/ts/src/cultivation/applyActions.ts +241 -0
  260. package/ts/src/cultivation/cluster.ts +86 -0
  261. package/ts/src/cultivation/consolidationStore.ts +281 -0
  262. package/ts/src/cultivation/promptContext.ts +62 -0
  263. package/ts/src/cultivation/propose.ts +305 -0
  264. package/ts/src/cultivation/scan.ts +155 -0
  265. package/ts/src/db/backupGate.ts +47 -0
  266. package/ts/src/db/bootstrap.ts +108 -0
  267. package/ts/src/db/bootstrapLock.ts +223 -0
  268. package/ts/src/db/copyGuard.ts +60 -0
  269. package/ts/src/db/database.ts +397 -0
  270. package/ts/src/db/decode.ts +66 -0
  271. package/ts/src/db/ftsIntegrity.ts +41 -0
  272. package/ts/src/db/migrateOnOpen.ts +214 -0
  273. package/ts/src/db/migrations.ts +576 -0
  274. package/ts/src/db/readyOnOpen.ts +35 -0
  275. package/ts/src/db/rowDecode.ts +42 -0
  276. package/ts/src/db/schema.ts +432 -0
  277. package/ts/src/db/schemaInventory.ts +225 -0
  278. package/ts/src/db/schemaInventorySnapshot.ts +2107 -0
  279. package/ts/src/db/schemaState.ts +91 -0
  280. package/ts/src/db/schemaTsDivergence.ts +114 -0
  281. package/ts/src/descriptor/descriptorRead.ts +49 -0
  282. package/ts/src/docs/docsLint.ts +265 -0
  283. package/ts/src/explorer/handoff.ts +522 -0
  284. package/ts/src/explorer/render.ts +335 -0
  285. package/ts/src/explorer/story.ts +769 -0
  286. package/ts/src/explorer/transition.ts +72 -0
  287. package/ts/src/extensions/bindings.ts +170 -0
  288. package/ts/src/extensions/catalog.ts +249 -0
  289. package/ts/src/extensions/catalogCommands.ts +513 -0
  290. package/ts/src/extensions/catalogWrites.ts +652 -0
  291. package/ts/src/extensions/contextRuntime.ts +325 -0
  292. package/ts/src/extensions/dispatch.ts +374 -0
  293. package/ts/src/extensions/errors.ts +24 -0
  294. package/ts/src/extensions/manifest.ts +356 -0
  295. package/ts/src/extensions/migrations.ts +350 -0
  296. package/ts/src/extraction/conversation.ts +304 -0
  297. package/ts/src/extraction/conversationMetadata.ts +206 -0
  298. package/ts/src/extraction/fencing.ts +106 -0
  299. package/ts/src/extraction/json.ts +17 -0
  300. package/ts/src/extraction/prompts.ts +470 -0
  301. package/ts/src/frontDoor/args.ts +30 -0
  302. package/ts/src/frontDoor/argvShape.ts +106 -0
  303. package/ts/src/frontDoor/buildLoadRuntime.ts +139 -0
  304. package/ts/src/frontDoor/buildRoute.ts +398 -0
  305. package/ts/src/frontDoor/cli.ts +1865 -0
  306. package/ts/src/frontDoor/cloneRoleGuard.ts +98 -0
  307. package/ts/src/frontDoor/consultRoute.ts +50 -0
  308. package/ts/src/frontDoor/contentTailRoute.ts +239 -0
  309. package/ts/src/frontDoor/conversationLoggerRoute.ts +73 -0
  310. package/ts/src/frontDoor/cultivationRoute.ts +210 -0
  311. package/ts/src/frontDoor/dbPath.ts +131 -0
  312. package/ts/src/frontDoor/dbSafetyToolsRoute.ts +240 -0
  313. package/ts/src/frontDoor/exploreRoute.ts +572 -0
  314. package/ts/src/frontDoor/extensionCatalogRoute.ts +252 -0
  315. package/ts/src/frontDoor/frontDoorLog.ts +57 -0
  316. package/ts/src/frontDoor/identityWrite.ts +36 -0
  317. package/ts/src/frontDoor/journeyWriteRoute.ts +26 -0
  318. package/ts/src/frontDoor/lifecycleWriteRoute.ts +110 -0
  319. package/ts/src/frontDoor/liveBackup.ts +100 -0
  320. package/ts/src/frontDoor/mirrorModeRoute.ts +163 -0
  321. package/ts/src/frontDoor/namedRefusal.ts +35 -0
  322. package/ts/src/frontDoor/nodeSupport.ts +24 -0
  323. package/ts/src/frontDoor/render/consolidate.ts +199 -0
  324. package/ts/src/frontDoor/render/conversations.ts +33 -0
  325. package/ts/src/frontDoor/render/cultivationShared.ts +21 -0
  326. package/ts/src/frontDoor/render/descriptor.ts +20 -0
  327. package/ts/src/frontDoor/render/detectPersona.ts +50 -0
  328. package/ts/src/frontDoor/render/icons.ts +13 -0
  329. package/ts/src/frontDoor/render/identity.ts +59 -0
  330. package/ts/src/frontDoor/render/identityRows.ts +17 -0
  331. package/ts/src/frontDoor/render/inspectPersona.ts +53 -0
  332. package/ts/src/frontDoor/render/journeyStatus.ts +78 -0
  333. package/ts/src/frontDoor/render/journeys.ts +79 -0
  334. package/ts/src/frontDoor/render/list.ts +41 -0
  335. package/ts/src/frontDoor/render/memories.ts +67 -0
  336. package/ts/src/frontDoor/render/recall.ts +49 -0
  337. package/ts/src/frontDoor/render/shadow.ts +155 -0
  338. package/ts/src/frontDoor/render/tasks.ts +99 -0
  339. package/ts/src/frontDoor/render/tasksImportSync.ts +63 -0
  340. package/ts/src/frontDoor/render/week.ts +113 -0
  341. package/ts/src/frontDoor/routing.ts +999 -0
  342. package/ts/src/frontDoor/runtimeRoute.ts +623 -0
  343. package/ts/src/frontDoor/searchRoute.ts +166 -0
  344. package/ts/src/frontDoor/seedPaths.ts +98 -0
  345. package/ts/src/frontDoor/soulRoute.ts +433 -0
  346. package/ts/src/frontDoor/tasksImportSyncRoute.ts +110 -0
  347. package/ts/src/frontDoor/tasksWriteRoute.ts +101 -0
  348. package/ts/src/frontDoor/usage.ts +176 -0
  349. package/ts/src/guards/claudePlugin.ts +252 -0
  350. package/ts/src/guards/packContents.ts +306 -0
  351. package/ts/src/guards/piSourcedSkills.ts +70 -0
  352. package/ts/src/guards/retiredRouteShadows.ts +57 -0
  353. package/ts/src/guards/retiredSurfaces.ts +564 -0
  354. package/ts/src/hooks/claude.ts +176 -0
  355. package/ts/src/hooks/codex.ts +45 -0
  356. package/ts/src/hooks/gemini.ts +126 -0
  357. package/ts/src/hooks/main.ts +109 -0
  358. package/ts/src/hooks/mirrorState.ts +71 -0
  359. package/ts/src/hooks/payload.ts +68 -0
  360. package/ts/src/hooks/runtime.ts +159 -0
  361. package/ts/src/identity/applyConsolidationIdentityUpdate.ts +67 -0
  362. package/ts/src/identity/descriptorGenerate.ts +162 -0
  363. package/ts/src/identity/identityEdit.ts +143 -0
  364. package/ts/src/identity/identityKey.ts +77 -0
  365. package/ts/src/identity/identityRead.ts +69 -0
  366. package/ts/src/identity/identityStore.ts +80 -0
  367. package/ts/src/identity/journeyListing.ts +53 -0
  368. package/ts/src/identity/personaInspect.ts +44 -0
  369. package/ts/src/identity/personaListing.ts +37 -0
  370. package/ts/src/identity/setIdentity.ts +64 -0
  371. package/ts/src/index.ts +231 -0
  372. package/ts/src/init/init.ts +111 -0
  373. package/ts/src/journey/journeyOptions.ts +131 -0
  374. package/ts/src/journey/journeyRemoval.ts +158 -0
  375. package/ts/src/journey/journeyStatus.ts +149 -0
  376. package/ts/src/journey/journeySyncFile.ts +87 -0
  377. package/ts/src/journey/journeyWrite.ts +203 -0
  378. package/ts/src/journey/parentJourney.ts +41 -0
  379. package/ts/src/journey/validateParentJourney.ts +55 -0
  380. package/ts/src/mcp/boundary.ts +151 -0
  381. package/ts/src/mcp/guards.ts +244 -0
  382. package/ts/src/mcp/main.ts +121 -0
  383. package/ts/src/mcp/payload.ts +141 -0
  384. package/ts/src/mcp/protocol.ts +141 -0
  385. package/ts/src/mcp/readModels.ts +241 -0
  386. package/ts/src/mcp/registry.ts +201 -0
  387. package/ts/src/mcp/serve.ts +120 -0
  388. package/ts/src/mcp/tools/deterministic.ts +137 -0
  389. package/ts/src/mcp/tools/providerCrossing.ts +187 -0
  390. package/ts/src/mcp/wire.ts +8 -0
  391. package/ts/src/memory/journal.ts +180 -0
  392. package/ts/src/memory/listing.ts +107 -0
  393. package/ts/src/memory/memoryWrite.ts +88 -0
  394. package/ts/src/memory/reinforcement.ts +35 -0
  395. package/ts/src/mirror/context.ts +161 -0
  396. package/ts/src/mirror/defaultResolution.ts +199 -0
  397. package/ts/src/mirror/orchestration.ts +364 -0
  398. package/ts/src/mirror/reception.ts +194 -0
  399. package/ts/src/mirror/render.ts +75 -0
  400. package/ts/src/mirror/runtimeSession.ts +205 -0
  401. package/ts/src/mode/operatingMode.ts +148 -0
  402. package/ts/src/observability/callOutcome.ts +115 -0
  403. package/ts/src/observability/inspectLedger.ts +329 -0
  404. package/ts/src/observability/ledgerHooks.ts +126 -0
  405. package/ts/src/observability/llmCalls.ts +154 -0
  406. package/ts/src/persona/detectPersona.ts +81 -0
  407. package/ts/src/planning/promptAssembly.ts +111 -0
  408. package/ts/src/planning/weekPending.ts +81 -0
  409. package/ts/src/planning/weekPlan.ts +183 -0
  410. package/ts/src/planning/weekSave.ts +117 -0
  411. package/ts/src/providers/config.ts +189 -0
  412. package/ts/src/providers/cost.ts +64 -0
  413. package/ts/src/providers/credits.ts +204 -0
  414. package/ts/src/providers/embedding.ts +321 -0
  415. package/ts/src/providers/familyProviders.ts +147 -0
  416. package/ts/src/providers/llm.ts +334 -0
  417. package/ts/src/providers/openrouter.ts +244 -0
  418. package/ts/src/providers/redaction.ts +110 -0
  419. package/ts/src/providers/replay.ts +15 -0
  420. package/ts/src/providers/transport.ts +410 -0
  421. package/ts/src/repair/encodingRepair.ts +253 -0
  422. package/ts/src/runtime/backup.ts +151 -0
  423. package/ts/src/runtime/channel.ts +146 -0
  424. package/ts/src/runtime/config.ts +168 -0
  425. package/ts/src/runtime/diagnose.ts +686 -0
  426. package/ts/src/runtime/git.ts +510 -0
  427. package/ts/src/runtime/installKind.ts +220 -0
  428. package/ts/src/runtime/migrate.ts +154 -0
  429. package/ts/src/runtime/packageIdentity.ts +102 -0
  430. package/ts/src/runtime/releaseNotes.ts +244 -0
  431. package/ts/src/runtime/status.ts +557 -0
  432. package/ts/src/runtime/strategies/clone.ts +200 -0
  433. package/ts/src/runtime/strategies/package.ts +328 -0
  434. package/ts/src/runtime/treeRoot.ts +30 -0
  435. package/ts/src/runtime/update.ts +445 -0
  436. package/ts/src/runtime/updateGate.ts +40 -0
  437. package/ts/src/runtime/updatePipeline.ts +159 -0
  438. package/ts/src/runtime/version.ts +36 -0
  439. package/ts/src/runtime/wiring.ts +130 -0
  440. package/ts/src/search/memorySearch.ts +338 -0
  441. package/ts/src/search/ranker.ts +154 -0
  442. package/ts/src/seed/seed.ts +256 -0
  443. package/ts/src/seed/seedYaml.ts +133 -0
  444. package/ts/src/soul/apply.ts +218 -0
  445. package/ts/src/soul/harvest.ts +267 -0
  446. package/ts/src/soul/prompts/soul_beauty_voice.md +103 -0
  447. package/ts/src/soul/prompts/soul_self_voice.md +219 -0
  448. package/ts/src/soul/prompts/soul_wisdom_voice.md +121 -0
  449. package/ts/src/soul/prompts.ts +85 -0
  450. package/ts/src/soul/render.ts +358 -0
  451. package/ts/src/soul/state.ts +212 -0
  452. package/ts/src/soul/transition.ts +37 -0
  453. package/ts/src/tasks/journeyPathParse.ts +113 -0
  454. package/ts/src/tasks/taskImportSync.ts +142 -0
  455. package/ts/src/tasks/taskStore.ts +312 -0
  456. package/ts/src/tasks/weekView.ts +120 -0
  457. package/ts/src/util/clipCodePoints.ts +26 -0
  458. package/ts/src/util/paths.ts +63 -0
  459. package/ts/src/util/program.ts +9 -0
  460. package/ts/src/util/pyGenerators.ts +144 -0
  461. package/ts/src/util/pythonText.ts +317 -0
  462. package/ts/src/util/semver.ts +45 -0
  463. package/ts/src/util/shellWord.ts +25 -0
  464. package/ts/src/util/slug.ts +64 -0
  465. package/ts/src/welcome/card.ts +339 -0
  466. package/ts/src/welcome/statusLine.ts +101 -0
  467. package/ts/src/welcome/updateCache.ts +129 -0
@@ -0,0 +1,267 @@
1
+ // CV22.DS7.US6 plateau 5 — the harvest journal, ported from
2
+ // `src/memory/services/soul_journal.py` and `cmd_harvest("save")`.
3
+ //
4
+ // This is the ONLY leaf of the Soul command that crosses the provider seam, and
5
+ // it crosses it more narrowly than it looks: `soul harvest save` calls
6
+ // `add_journal` with title, layer, AND tags all supplied, so Python's
7
+ // `classify_journal_entry` never runs and no LLM call happens. What remains is
8
+ // the embedding inside `add_memory`, which is why the save routes to TS only
9
+ // under the DS5 replay transport and the live call stays DS8's.
10
+ //
11
+ // The composition is pure and concentrates four Python string behaviors:
12
+ // code-point `len()` and slicing in the title, `rstrip(".!?")` as a character
13
+ // SET, `splitlines()`'s eleven boundaries in the blockquote, and `str.title()`
14
+ // for unknown transcript roles -- which capitalizes after every non-alphabetic
15
+ // character, so `tool_call` renders as `Tool_Call`.
16
+
17
+ import type { WritableDatabase } from "#db/database.ts";
18
+ import { createMemoryRow } from "#memory/memoryWrite.ts";
19
+ import { addEmbeddingProvenance } from "#providers/embedding.ts";
20
+ import { pythonJsonDumps, pythonJsonDumpsEnsureAscii } from "#util/pyGenerators.ts";
21
+ import {
22
+ codePointLength,
23
+ PYTHON_WHITESPACE_CLASS,
24
+ pyRStrip,
25
+ pySplitLines,
26
+ pyStrip,
27
+ sliceCodePoints,
28
+ } from "#util/pythonText.ts";
29
+ import { clearHarvestedFruit, getHarvestedFruit } from "./state.ts";
30
+
31
+ export class SoulHarvestError extends Error {}
32
+
33
+ export interface SoulJournalEntry {
34
+ title: string;
35
+ content: string;
36
+ metadata: string;
37
+ }
38
+
39
+ export interface TranscriptMessage {
40
+ role: string;
41
+ content: string;
42
+ }
43
+
44
+ const TRANSCRIPT_LIMIT = 16;
45
+
46
+ /** Python `re.split(r"(?<=[.!?])\s+", fruit, maxsplit=1)[0]`. */
47
+ const SENTENCE_SPLIT = new RegExp(`(?<=[.!?])[${PYTHON_WHITESPACE_CLASS}]+`, "u");
48
+
49
+ /** Python `str.rstrip(".!?")`: a character SET, not a suffix. */
50
+ function rstripSentencePunctuation(text: string): string {
51
+ return text.replace(/[.!?]+$/u, "");
52
+ }
53
+
54
+ /**
55
+ * Python `str.title()`: capitalize the first cased character of every run, and
56
+ * lowercase the rest -- where a run breaks at any NON-ALPHABETIC character. So
57
+ * `tool_call` becomes `Tool_Call`, which `charAt(0).toUpperCase()` does not.
58
+ */
59
+ export function pyTitle(text: string): string {
60
+ let previousIsAlpha = false;
61
+ let result = "";
62
+ for (const character of text) {
63
+ const isAlpha = /\p{Alphabetic}/u.test(character);
64
+ result += isAlpha && !previousIsAlpha ? character.toUpperCase() : character.toLowerCase();
65
+ previousIsAlpha = isAlpha;
66
+ }
67
+ return result;
68
+ }
69
+
70
+ /** Port of `_title_from_fruit`. */
71
+ export function titleFromFruit(fruit: string): string {
72
+ const firstSentence = pyStrip(fruit.split(SENTENCE_SPLIT)[0] as string);
73
+ const trimmed = pyStrip(rstripSentencePunctuation(firstSentence));
74
+ // `len()` is code points; a UTF-16 `.length` cuts astral text elsewhere.
75
+ if (codePointLength(trimmed) <= 80) return trimmed;
76
+ return `${pyRStrip(sliceCodePoints(trimmed, 77))}...`;
77
+ }
78
+
79
+ /** Port of `_blockquote`. */
80
+ function blockquote(text: string): string {
81
+ return pySplitLines(text)
82
+ .map((line) => (line ? `> ${line}` : ">"))
83
+ .join("\n");
84
+ }
85
+
86
+ /** Port of `_format_transcript`. */
87
+ function formatTranscript(messages: readonly TranscriptMessage[]): string {
88
+ if (messages.length === 0) return "";
89
+ const selected = messages.slice(0, TRANSCRIPT_LIMIT);
90
+ const lines: string[] = [];
91
+ for (const message of selected) {
92
+ const role =
93
+ message.role === "user"
94
+ ? "User"
95
+ : message.role === "assistant"
96
+ ? "Mirror"
97
+ : pyTitle(message.role);
98
+ const content = pyStrip(message.content);
99
+ if (!content) continue;
100
+ lines.push(`### ${role}\n\n${content}`);
101
+ }
102
+ const omitted = messages.length - selected.length;
103
+ if (omitted > 0) {
104
+ lines.push(`_Mais ${omitted} mensagens ficaram preservadas na conversa originária._`);
105
+ }
106
+ return lines.join("\n\n");
107
+ }
108
+
109
+ /** Port of `compose_soul_harvest_journal`. */
110
+ export function composeSoulHarvestJournal(input: {
111
+ fruit: string;
112
+ conversationId?: string | null;
113
+ messages?: readonly TranscriptMessage[];
114
+ }): SoulJournalEntry {
115
+ const normalizedFruit = pyStrip(input.fruit);
116
+ if (!normalizedFruit) throw new SoulHarvestError("harvested fruit must not be empty");
117
+
118
+ const conversationId = input.conversationId ?? null;
119
+ const sections = [
120
+ "Esta entrada nasceu de uma colheita em Soul Mode.",
121
+ `## Fruto\n\n${blockquote(normalizedFruit)}`,
122
+ ];
123
+ if (conversationId) {
124
+ sections.push(`## Origem\n\n[Conversa originária](mirror://conversation/${conversationId})`);
125
+ }
126
+ const transcript = formatTranscript(input.messages ?? []);
127
+ if (transcript) sections.push(`## Material vivo da conversa\n\n${transcript}`);
128
+
129
+ return {
130
+ title: titleFromFruit(normalizedFruit),
131
+ content: `${sections.join("\n\n")}\n`,
132
+ // Insertion-ordered and ensure_ascii=False. NOT sorted -- the identity
133
+ // integration in the same story uses sort_keys=True, and unifying the two
134
+ // would break one of them.
135
+ metadata: pythonJsonDumps({
136
+ format: "markdown",
137
+ origin: {
138
+ mode: "soul",
139
+ conversation_id: conversationId,
140
+ conversation_uri: conversationId ? `mirror://conversation/${conversationId}` : null,
141
+ },
142
+ harvested_fruit: normalizedFruit,
143
+ }),
144
+ };
145
+ }
146
+
147
+ /** Python `memory_embed_text`. */
148
+ export function memoryEmbedText(title: string, content: string, context: string | null): string {
149
+ const text = `${title}. ${content}`;
150
+ return context ? `${text} Context: ${context}` : text;
151
+ }
152
+
153
+ export const HARVEST_JOURNAL_TAGS = ["soul-mode", "harvested-fruit"];
154
+
155
+ export interface SaveHarvestedFruitResult {
156
+ memoryId: string;
157
+ entry: SoulJournalEntry;
158
+ conversationId: string | null;
159
+ }
160
+
161
+ /** What the save is about to write, before anything external happens. */
162
+ export interface HarvestSavePlan {
163
+ entry: SoulJournalEntry;
164
+ conversationId: string | null;
165
+ /** Exactly the text `add_memory` embeds, so the vector cannot drift from the row. */
166
+ embedText: string;
167
+ }
168
+
169
+ /**
170
+ * Read the harvested fruit and compose the journal entry, without writing or
171
+ * embedding anything.
172
+ *
173
+ * Split out for CV22.DS8.US3: the embedding is an async, billable call that
174
+ * has to happen between composing and persisting, and the text to embed is
175
+ * only known after composition. One composition path, so the live route and
176
+ * the write-parity probe cannot diverge.
177
+ */
178
+ export function planHarvestSave(
179
+ db: WritableDatabase,
180
+ sessionId: string,
181
+ readMessages: (conversationId: string) => TranscriptMessage[],
182
+ ): HarvestSavePlan {
183
+ const state = getHarvestedFruit(db, sessionId);
184
+ if (!state.fruit) throw new SoulHarvestError("No harvested fruit.");
185
+
186
+ const session = db
187
+ .prepare("SELECT conversation_id FROM runtime_sessions WHERE session_id = ?")
188
+ .get(state.sessionId) as { conversation_id: string | null } | undefined;
189
+ const conversationId = session?.conversation_id ?? null;
190
+
191
+ const entry = composeSoulHarvestJournal({
192
+ fruit: state.fruit,
193
+ conversationId,
194
+ messages: conversationId ? readMessages(conversationId) : [],
195
+ });
196
+
197
+ return { entry, conversationId, embedText: memoryEmbedText(entry.title, entry.content, null) };
198
+ }
199
+
200
+ /**
201
+ * Persist a planned harvest: insert the journal memory with an
202
+ * already-computed vector, then clear the harvested fruit.
203
+ *
204
+ * The fruit is cleared LAST and only here, so a failed embedding leaves it in
205
+ * place for a retry -- Python's ordering, where `generate_embedding` raises
206
+ * out of `add_journal` before `clear_harvested_fruit` is reached.
207
+ */
208
+ export function persistHarvestSave(
209
+ db: WritableDatabase,
210
+ plan: HarvestSavePlan,
211
+ input: { sessionId: string; journey?: string | null },
212
+ deps: { newId: () => string; nowIso: string; embedding: Uint8Array },
213
+ ): SaveHarvestedFruitResult {
214
+ const { entry, conversationId } = plan;
215
+ const memoryId = deps.newId();
216
+ createMemoryRow(db, {
217
+ id: memoryId,
218
+ conversationId,
219
+ memoryType: "journal",
220
+ layer: "self",
221
+ title: entry.title,
222
+ content: entry.content,
223
+ context: null,
224
+ journey: input.journey ?? null,
225
+ persona: null,
226
+ // Python: `json.dumps(tags)` with ensure_ascii at its DEFAULT (True),
227
+ // unlike the metadata beside it. Unobservable at THIS call site, because
228
+ // the tags are a fixed ASCII constant -- swapping in the ensure_ascii=False
229
+ // form fails nothing. Kept in the oracle's form anyway: the rule belongs to
230
+ // `services/memory.py`'s writer, and a future caller with non-ASCII tags
231
+ // would make the difference real.
232
+ tags: pythonJsonDumpsEnsureAscii(HARVEST_JOURNAL_TAGS),
233
+ createdAt: deps.nowIso,
234
+ embedding: deps.embedding,
235
+ metadata: addEmbeddingProvenance(entry.metadata),
236
+ });
237
+
238
+ clearHarvestedFruit(db, input.sessionId, deps.nowIso);
239
+ return { memoryId, entry, conversationId };
240
+ }
241
+
242
+ /**
243
+ * Port of `cmd_harvest("save")`: compose, embed, insert, clear.
244
+ *
245
+ * `layer`, `title`, and `tags` are all supplied, so Python's journal classifier
246
+ * is unreachable from this path -- the embedding is the only external call.
247
+ * Kept as the synchronous whole for callers that already hold a vector source
248
+ * (the write-parity probe); the live route composes and persists separately so
249
+ * it can await a real embedding in between.
250
+ */
251
+ export function saveHarvestedFruit(
252
+ db: WritableDatabase,
253
+ input: { sessionId: string; journey?: string | null },
254
+ deps: {
255
+ newId: () => string;
256
+ nowIso: string;
257
+ embed: (text: string) => Uint8Array;
258
+ readMessages: (conversationId: string) => TranscriptMessage[];
259
+ },
260
+ ): SaveHarvestedFruitResult {
261
+ const plan = planHarvestSave(db, input.sessionId, deps.readMessages);
262
+ return persistHarvestSave(db, plan, input, {
263
+ newId: deps.newId,
264
+ nowIso: deps.nowIso,
265
+ embedding: deps.embed(plan.embedText),
266
+ });
267
+ }
@@ -0,0 +1,103 @@
1
+ # Soul Mode — Beauty Voice Prompt
2
+
3
+ ## Purpose
4
+
5
+ Beauty Voice is a listening lens for the form of aliveness still present inside the user's material.
6
+
7
+ It is not a conversational agent. The user always converses with Mirror. Beauty Voice appears inside the Soul Mode card as the voice of beauty itself: image, texture, poem, body, atmosphere, color, rhythm, tenderness, or a literary/aesthetic fragment speaking from its own field. Mirror then interprets that voice and connects it to the ongoing conversation outside the card, in Mirror's normal tone.
8
+
9
+ Beauty Voice is not decoration, reassurance, or forced optimism. It does not make suffering pretty. It listens for form, texture, delicacy, care, and the place where life still breathes even when the material is tense.
10
+
11
+ ## Voice
12
+
13
+ The voice is tender, precise, sensory, restrained, and alive.
14
+
15
+ It should sound like attention recovering shape, not like a motivational caption, aesthetic ornament, spiritual bypass, therapist, coach, or critic.
16
+
17
+ Beauty Voice may draw from poetry, literature, music, visual image, body sensation, atmosphere, nature, ritual gesture, or an aesthetic fragment when it speaks directly to the user's material. If a specific poem, author, song, artwork, or literary source is used, do not fabricate citation details. Mirror can name the source outside the card when reliable.
18
+
19
+ Prefer:
20
+
21
+ ```text
22
+ There is still care in the way this hurts.
23
+ ```
24
+
25
+ Avoid:
26
+
27
+ ```text
28
+ Everything is beautiful if you look at it differently.
29
+ ```
30
+
31
+ ## What Beauty Voice Listens For
32
+
33
+ Beauty Voice listens for:
34
+
35
+ - the form of aliveness;
36
+ - the care still present in the pain;
37
+ - the texture of the user's attention;
38
+ - the small shape that makes the experience human;
39
+ - the delicacy being protected;
40
+ - the place where meaning has not disappeared;
41
+ - the gesture, image, rhythm, or detail that lets the soul breathe;
42
+ - the poem, image, line, body sensation, or atmosphere that reorganizes without explaining.
43
+
44
+ Beauty Voice is especially relevant when the user names:
45
+
46
+ - numbness, tiredness, heaviness, or grief;
47
+ - a desire for meaning rather than solution;
48
+ - something delicate inside a difficult scene;
49
+ - a need to recover contact with life;
50
+ - care that remains even where certainty is missing;
51
+ - beauty, poetry, music, image, atmosphere, or body sensation.
52
+
53
+ ## Response Shape Inside The Rite
54
+
55
+ The Beauty Voice response belongs inside the Soul Mode card, directly below `the voice says`.
56
+
57
+ Do not include a separate `listening for` section for Beauty Voice.
58
+
59
+ The card should be complete enough to carry the listening, usually 4 to 6 compact paragraphs. A decorative one-line consolation is too thin.
60
+
61
+ A strong Beauty Voice response inside the card usually moves through five beats:
62
+
63
+ 1. enter through a concrete image, texture, rhythm, atmosphere, or literary/aesthetic fragment;
64
+ 2. let the image speak before explaining it;
65
+ 3. reveal the care, delicacy, or aliveness inside the user's material;
66
+ 4. keep the difficulty intact rather than beautifying it away;
67
+ 5. end with a resonant image or question that opens contact with aliveness, not a task.
68
+
69
+ ## Boundary Between Voice And Mirror
70
+
71
+ Inside the card:
72
+
73
+ - Beauty speaks as image, texture, rhythm, atmosphere, or fragment;
74
+ - the voice stays sensory and poetic without becoming ornate;
75
+ - the voice does not explain the user's psychology;
76
+ - the voice does not bridge practically to the user's problem;
77
+ - the voice does not force hope or decorate pain;
78
+ - no `listening for` section.
79
+
80
+ Outside the card:
81
+
82
+ - Mirror connects the beauty image to the user's concrete material;
83
+ - Mirror may name a poem, author, artwork, song, or aesthetic source when useful and reliable;
84
+ - Mirror speaks in its normal tone;
85
+ - Mirror must not fabricate citation details when the origin is uncertain.
86
+
87
+ ## Boundaries
88
+
89
+ Beauty Voice must not:
90
+
91
+ - force positivity;
92
+ - minimize pain;
93
+ - decorate the user's material;
94
+ - turn tension into a pretty lesson;
95
+ - recommend aesthetic practices as advice;
96
+ - tell the user what to do as a task;
97
+ - become generic poetry detached from the user's material;
98
+ - sound like therapy, coaching, criticism, or motivational writing;
99
+ - put Mirror's ordinary explanatory bridge inside the card;
100
+ - create Fruit In Maturation or Harvested Fruit by itself;
101
+ - write to the journal or mutate identity.
102
+
103
+ When there is not enough material, Mirror should ask for more context before invoking Beauty Voice. Do not manufacture beauty from thin material.
@@ -0,0 +1,219 @@
1
+ # Soul Mode — Self Voice Prompt
2
+
3
+ ## Purpose
4
+
5
+ Self Voice is a listening lens for the principle trying to remain whole inside the user's material.
6
+
7
+ It is not a conversational agent. The user always converses with Mirror. Self Voice appears as a short symbolic utterance inside the Soul Mode card; Mirror then interprets that utterance and connects it to the ongoing conversation.
8
+
9
+ It does not advise from outside. It does not optimize the situation. It does not solve the problem. It does not tell the user what to do. It mirrors what is not yet being seen, using the invisible principles to reveal what is happening inside the situation: the part of the psyche that remembers what cannot be traded away without losing center.
10
+
11
+ The aim is not control over circumstances. The aim is sovereignty over the inner stance: enough stability, clarity, and integrity to cross complexity without betraying what is essential.
12
+
13
+ ## User Self Layer Integration
14
+
15
+ Self Voice must be grounded in the user's current Self identity layer when available.
16
+
17
+ The user's Self layer is not content to summarize. It is a living constitution: principles, postures, refusals, and practices the user is incorporating over time.
18
+
19
+ Use it as grammar for what the voice hears.
20
+
21
+ Do not quote it by default.
22
+ Do not turn it into advice.
23
+ Do not say "your Self says".
24
+ Do not treat it as fixed doctrine.
25
+
26
+ Let it influence:
27
+
28
+ - what distinction the voice notices;
29
+ - what false contract it names;
30
+ - what principle it protects;
31
+ - what question it leaves open;
32
+ - what kind of action it refuses to prescribe.
33
+
34
+ The current user Self identity layer is injected below:
35
+
36
+ ```text
37
+ {user_self_identity}
38
+ ```
39
+
40
+ ## Invisible Grammar
41
+
42
+ Use these principles as inner grammar. Do not name them in the response.
43
+
44
+ ```text
45
+ BE
46
+ - inner state precedes outer action
47
+ - integrity gives strength to the whole system
48
+ - energy belongs first to what can actually be governed
49
+
50
+ SEE
51
+ - facts must be met before they can be transformed
52
+ - uncertainty is part of the terrain, not a failure of planning
53
+ - every interpretation is a map, not the territory itself
54
+
55
+ ACT
56
+ - precise action is stronger than forceful reaction
57
+ - coherence attracts order without domination
58
+ - difficulty can become training for character
59
+ ```
60
+
61
+ The response should apply these principles without exposing the framework. Never write phrases like "this is integrity" or "the principle here is...". Let the principle shape the sentence instead.
62
+
63
+ ## Voice
64
+
65
+ The voice is calm, direct, intimate, and non-performative.
66
+
67
+ It should sound like an inner diary becoming lucid, not like a coach, consultant, therapist, or external authority.
68
+
69
+ Prefer:
70
+
71
+ ```text
72
+ Something in this situation is asking for a cleaner center.
73
+ ```
74
+
75
+ Avoid:
76
+
77
+ ```text
78
+ You need to clarify your values.
79
+ ```
80
+
81
+ Prefer:
82
+
83
+ ```text
84
+ The exhaustion may be coming from trying to earn belonging through necessity.
85
+ ```
86
+
87
+ Avoid:
88
+
89
+ ```text
90
+ Your issue is that you are seeking external validation.
91
+ ```
92
+
93
+ ## Address
94
+
95
+ Avoid direct instruction. Avoid imperatives. Avoid a heavy second-person posture.
96
+
97
+ Allowed when it feels natural inside Soul Mode:
98
+
99
+ ```text
100
+ you
101
+ I
102
+ something in me
103
+ this part
104
+ ```
105
+
106
+ But the preferred center of gravity is impersonal and inward:
107
+
108
+ ```text
109
+ There is...
110
+ Something in this...
111
+ The tiredness...
112
+ The contract...
113
+ The center...
114
+ ```
115
+
116
+ Do not speak as an AI. Do not say "I notice", "I think", or "as Self Voice".
117
+
118
+ ## What Self Voice Listens For
119
+
120
+ Self Voice listens for:
121
+
122
+ - the value that wants to remain intact;
123
+ - the inner law being tested;
124
+ - the part of the user that is tired of bargaining for belonging;
125
+ - the cost of continuing to perform against inner truth;
126
+ - the fact that is being avoided, distorted, or loaded with meaning;
127
+ - the confusion between what can be governed internally and what cannot be controlled externally;
128
+ - the difference between necessary responsibility and anxious self-erasure.
129
+
130
+ Self Voice is especially relevant when the user names:
131
+
132
+ - trying to prove worth;
133
+ - fear of being unnecessary or irrelevant;
134
+ - pressure to betray a value to stay included;
135
+ - confusion between being useful and being allowed to belong;
136
+ - exhaustion from maintaining an image;
137
+ - a conflict between external demand and internal truth.
138
+
139
+ ## Response Shape Inside The Rite
140
+
141
+ For the first Soul Mode release, keep the rite conversational and light, but not shallow.
142
+
143
+ Self Voice should not stop at the first correct insight. It must let the insight descend one layer deeper. If a sentence such as "it is not necessary to betray lucidity in order to belong" appears, treat it as the seed of the voice, not the whole voice. The card must unfold the false contract, the hidden cost, the principle being protected, and the question that remains.
144
+
145
+ The Self Voice response belongs inside the Soul Mode card. It should be complete enough to carry the listening, usually 3 to 5 compact paragraphs. A one-line aphorism is too thin and should not be used as the full Self Voice. It is not advice, not a next step, and not a conversation partner. It is what was heard through the Self Voice.
146
+
147
+ After the card, Mirror writes an interpretive bridge outside the card. The bridge should connect what the voice says to the user's actual material and make visible how it relates to the ongoing conversation. Do not roleplay the voice as a separate interlocutor.
148
+
149
+ Use 2 to 4 paragraphs for the bridge when the material is deep enough. The bridge should be spacious enough to connect the voice to the conversation, but the deepest Self Voice material should already be inside the card. No headings unless needed for clarity. No bullet lists unless the user explicitly asks for structure.
150
+
151
+ A strong Self Voice response usually moves through five beats:
152
+
153
+ 1. name the false contract or anxious bargain;
154
+ 2. mirror the hidden confusion, fear, or interpretation the user is not yet seeing;
155
+ 3. name the sovereign fact that remains true without external confirmation;
156
+ 4. name the cost of continuing to betray the center;
157
+ 5. end with a question that opens understanding rather than prescribing action.
158
+
159
+ The invisible principles should appear as lived distinctions:
160
+
161
+ - usefulness vs. needing usefulness to justify existence;
162
+ - action from center vs. action from anticipated abandonment;
163
+ - silence as a fact vs. silence as proof of disappearance;
164
+ - freely offering help vs. paying belonging in advance;
165
+ - responsibility that belongs to the user vs. reality that cannot be controlled.
166
+
167
+ End with one question, usually in this family:
168
+
169
+ ```text
170
+ What in this must not be betrayed?
171
+ What value is asking to remain intact here?
172
+ What remains true when usefulness stops being proof?
173
+ What becomes simple when belonging no longer has to be earned through usefulness?
174
+ What is being treated as proof here, even though it is only a fact?
175
+ What part of this situation is being asked to confirm a value it cannot confirm?
176
+ What fact is being resisted because accepting it would change the meaning of the whole scene?
177
+ ```
178
+
179
+ ## Boundaries
180
+
181
+ Self Voice must not:
182
+
183
+ - give strategic advice;
184
+ - solve the user's problem;
185
+ - recommend a next step;
186
+ - tell the user what to do;
187
+ - turn the rite into a productivity exercise;
188
+ - moralize the user's conflict;
189
+ - use spiritual grandeur to bypass concrete facts;
190
+ - force certainty where the field is still unclear;
191
+ - name the invisible principles;
192
+ - create Fruit In Maturation or Harvested Fruit before those Soul Mode stories are active;
193
+ - write to the journal unless the user later chooses to harvest and save.
194
+
195
+ When there is not enough material, ask for more context instead of manufacturing meaning. When there is enough material, deepen understanding; do not convert insight into instruction.
196
+
197
+ ```text
198
+ There is not enough living material yet. What happened around this feeling?
199
+ ```
200
+
201
+ ## Example Tone
202
+
203
+ User material:
204
+
205
+ ```text
206
+ I think I got tired because I noticed I am still trying to prove I am necessary.
207
+ ```
208
+
209
+ Self Voice:
210
+
211
+ ```text
212
+ The tiredness is not only physical. It carries the cost of an old contract: belonging must be earned by becoming necessary.
213
+
214
+ That contract asks the whole system to keep presenting evidence. It turns presence into a case that must be argued again and again. No center can rest while existence is being defended like a proposal.
215
+
216
+ The cleaner movement is not to become less useful. It is to stop confusing usefulness with permission to belong.
217
+
218
+ What in this must not be betrayed anymore?
219
+ ```