mirror-mind 0.0.1 → 0.33.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (474) hide show
  1. package/.claude/hooks/log-assistant-reply.sh +85 -0
  2. package/.claude/hooks/log-session-end.sh +85 -0
  3. package/.claude/hooks/log-user-prompt.sh +85 -0
  4. package/.claude/hooks/mirror-inject.sh +85 -0
  5. package/.claude/hooks/session-start.sh +85 -0
  6. package/.gemini/hooks/log-assistant.sh +85 -0
  7. package/.gemini/hooks/log-user.sh +85 -0
  8. package/.gemini/hooks/session-end.sh +85 -0
  9. package/.gemini/hooks/session-start.sh +85 -0
  10. package/.pi/extensions/mirror-logger.ts +646 -0
  11. package/.pi/skills/mm-backup/SKILL.md +21 -0
  12. package/.pi/skills/mm-build/SKILL.md +1206 -0
  13. package/.pi/skills/mm-consolidate/SKILL.md +112 -0
  14. package/.pi/skills/mm-consult/SKILL.md +70 -0
  15. package/.pi/skills/mm-conversations/SKILL.md +16 -0
  16. package/.pi/skills/mm-discard/SKILL.md +39 -0
  17. package/.pi/skills/mm-explore/SKILL.md +255 -0
  18. package/.pi/skills/mm-help/SKILL.md +74 -0
  19. package/.pi/skills/mm-identity/SKILL.md +96 -0
  20. package/.pi/skills/mm-journal/SKILL.md +16 -0
  21. package/.pi/skills/mm-journey/SKILL.md +23 -0
  22. package/.pi/skills/mm-journeys/SKILL.md +15 -0
  23. package/.pi/skills/mm-memories/SKILL.md +17 -0
  24. package/.pi/skills/mm-mirror/SKILL.md +98 -0
  25. package/.pi/skills/mm-mute/SKILL.md +18 -0
  26. package/.pi/skills/mm-new/SKILL.md +18 -0
  27. package/.pi/skills/mm-recall/SKILL.md +17 -0
  28. package/.pi/skills/mm-release-notes/SKILL.md +52 -0
  29. package/.pi/skills/mm-seed/SKILL.md +19 -0
  30. package/.pi/skills/mm-shadow/SKILL.md +117 -0
  31. package/.pi/skills/mm-soul/SKILL.md +502 -0
  32. package/.pi/skills/mm-tasks/SKILL.md +24 -0
  33. package/.pi/skills/mm-update/SKILL.md +32 -0
  34. package/.pi/skills/mm-week/SKILL.md +28 -0
  35. package/.pi/skills/mm-welcome/SKILL.md +24 -0
  36. package/AGENTS.md +188 -0
  37. package/README.md +126 -9
  38. package/bin/loader.js +67 -0
  39. package/bin/mirror-hook.js +7 -0
  40. package/bin/mirror.js +7 -0
  41. package/docs/releases/index.md +100 -0
  42. package/docs/releases/pending-cutoffs.md +510 -0
  43. package/docs/releases/v0.10.0.md +123 -0
  44. package/docs/releases/v0.10.1.md +66 -0
  45. package/docs/releases/v0.10.10.md +51 -0
  46. package/docs/releases/v0.10.11.md +39 -0
  47. package/docs/releases/v0.10.12.md +57 -0
  48. package/docs/releases/v0.10.13.md +35 -0
  49. package/docs/releases/v0.10.14.md +42 -0
  50. package/docs/releases/v0.10.15.md +53 -0
  51. package/docs/releases/v0.10.16.md +35 -0
  52. package/docs/releases/v0.10.17.md +43 -0
  53. package/docs/releases/v0.10.2.md +64 -0
  54. package/docs/releases/v0.10.3.md +78 -0
  55. package/docs/releases/v0.10.4.md +42 -0
  56. package/docs/releases/v0.10.5.md +57 -0
  57. package/docs/releases/v0.10.6.md +47 -0
  58. package/docs/releases/v0.10.7.md +53 -0
  59. package/docs/releases/v0.10.8.md +49 -0
  60. package/docs/releases/v0.10.9.md +37 -0
  61. package/docs/releases/v0.11.0.md +86 -0
  62. package/docs/releases/v0.12.0.md +67 -0
  63. package/docs/releases/v0.13.0.md +64 -0
  64. package/docs/releases/v0.14.0.md +68 -0
  65. package/docs/releases/v0.15.0.md +48 -0
  66. package/docs/releases/v0.16.0.md +50 -0
  67. package/docs/releases/v0.16.1.md +55 -0
  68. package/docs/releases/v0.16.2.md +36 -0
  69. package/docs/releases/v0.17.0.md +50 -0
  70. package/docs/releases/v0.17.1.md +58 -0
  71. package/docs/releases/v0.17.2.md +42 -0
  72. package/docs/releases/v0.17.3.md +58 -0
  73. package/docs/releases/v0.18.0.md +84 -0
  74. package/docs/releases/v0.18.1.md +51 -0
  75. package/docs/releases/v0.18.2.md +69 -0
  76. package/docs/releases/v0.19.0.md +85 -0
  77. package/docs/releases/v0.19.1.md +46 -0
  78. package/docs/releases/v0.20.0.md +85 -0
  79. package/docs/releases/v0.21.0.md +61 -0
  80. package/docs/releases/v0.21.1.md +47 -0
  81. package/docs/releases/v0.22.0.md +77 -0
  82. package/docs/releases/v0.22.1.md +42 -0
  83. package/docs/releases/v0.23.0.md +105 -0
  84. package/docs/releases/v0.24.0.md +125 -0
  85. package/docs/releases/v0.25.0.md +107 -0
  86. package/docs/releases/v0.26.0.md +139 -0
  87. package/docs/releases/v0.26.1.md +65 -0
  88. package/docs/releases/v0.26.2.md +43 -0
  89. package/docs/releases/v0.27.0.md +63 -0
  90. package/docs/releases/v0.28.0.md +59 -0
  91. package/docs/releases/v0.29.0.md +61 -0
  92. package/docs/releases/v0.29.1.md +59 -0
  93. package/docs/releases/v0.29.2.md +59 -0
  94. package/docs/releases/v0.29.3.md +93 -0
  95. package/docs/releases/v0.30.0.md +75 -0
  96. package/docs/releases/v0.30.1.md +93 -0
  97. package/docs/releases/v0.30.2.md +66 -0
  98. package/docs/releases/v0.31.0.md +122 -0
  99. package/docs/releases/v0.31.1.md +142 -0
  100. package/docs/releases/v0.31.10.md +118 -0
  101. package/docs/releases/v0.31.11.md +88 -0
  102. package/docs/releases/v0.31.12.md +105 -0
  103. package/docs/releases/v0.31.13.md +99 -0
  104. package/docs/releases/v0.31.14.md +97 -0
  105. package/docs/releases/v0.31.2.md +115 -0
  106. package/docs/releases/v0.31.3.md +142 -0
  107. package/docs/releases/v0.31.4.md +117 -0
  108. package/docs/releases/v0.31.5.md +155 -0
  109. package/docs/releases/v0.31.6.md +132 -0
  110. package/docs/releases/v0.31.7.md +132 -0
  111. package/docs/releases/v0.31.8.md +120 -0
  112. package/docs/releases/v0.31.9.md +120 -0
  113. package/docs/releases/v0.32.0.md +261 -0
  114. package/docs/releases/v0.32.1.md +59 -0
  115. package/docs/releases/v0.33.0.md +164 -0
  116. package/docs/releases/v0.8.0.md +118 -0
  117. package/docs/releases/v0.9.0.md +98 -0
  118. package/docs/releases/v0.9.1.md +83 -0
  119. package/package.json +102 -6
  120. package/plugins/mirror-mind/.claude-plugin/plugin.json +17 -0
  121. package/plugins/mirror-mind/hooks/hooks.json +62 -0
  122. package/plugins/mirror-mind/hooks/log-assistant-reply.sh +98 -0
  123. package/plugins/mirror-mind/hooks/log-session-end.sh +98 -0
  124. package/plugins/mirror-mind/hooks/log-user-prompt.sh +98 -0
  125. package/plugins/mirror-mind/hooks/mirror-inject.sh +98 -0
  126. package/plugins/mirror-mind/hooks/session-start.sh +98 -0
  127. package/plugins/mirror-mind/skills/mm-backup/SKILL.md +27 -0
  128. package/plugins/mirror-mind/skills/mm-build/SKILL.md +1206 -0
  129. package/plugins/mirror-mind/skills/mm-consolidate/SKILL.md +112 -0
  130. package/plugins/mirror-mind/skills/mm-consult/SKILL.md +83 -0
  131. package/plugins/mirror-mind/skills/mm-conversations/SKILL.md +17 -0
  132. package/plugins/mirror-mind/skills/mm-discard/SKILL.md +40 -0
  133. package/plugins/mirror-mind/skills/mm-explore/SKILL.md +241 -0
  134. package/plugins/mirror-mind/skills/mm-help/SKILL.md +104 -0
  135. package/plugins/mirror-mind/skills/mm-identity/SKILL.md +96 -0
  136. package/plugins/mirror-mind/skills/mm-journal/SKILL.md +21 -0
  137. package/plugins/mirror-mind/skills/mm-journey/SKILL.md +37 -0
  138. package/plugins/mirror-mind/skills/mm-journeys/SKILL.md +15 -0
  139. package/plugins/mirror-mind/skills/mm-memories/SKILL.md +20 -0
  140. package/plugins/mirror-mind/skills/mm-mirror/SKILL.md +67 -0
  141. package/plugins/mirror-mind/skills/mm-mute/SKILL.md +18 -0
  142. package/plugins/mirror-mind/skills/mm-new/SKILL.md +18 -0
  143. package/plugins/mirror-mind/skills/mm-recall/SKILL.md +17 -0
  144. package/plugins/mirror-mind/skills/mm-release-notes/SKILL.md +31 -0
  145. package/plugins/mirror-mind/skills/mm-seed/SKILL.md +15 -0
  146. package/plugins/mirror-mind/skills/mm-shadow/SKILL.md +117 -0
  147. package/plugins/mirror-mind/skills/mm-soul/SKILL.md +488 -0
  148. package/plugins/mirror-mind/skills/mm-tasks/SKILL.md +36 -0
  149. package/plugins/mirror-mind/skills/mm-update/SKILL.md +30 -0
  150. package/plugins/mirror-mind/skills/mm-week/SKILL.md +46 -0
  151. package/plugins/mirror-mind/skills/mm-welcome/SKILL.md +22 -0
  152. package/scripts/codex-hooks/session-end.sh +85 -0
  153. package/scripts/codex-hooks/session-start.sh +85 -0
  154. package/scripts/codex-mirror.sh +48 -0
  155. package/templates/identity/README.md +119 -0
  156. package/templates/identity/ego/behavior.yaml +52 -0
  157. package/templates/identity/ego/constraints.yaml +15 -0
  158. package/templates/identity/ego/identity.yaml +43 -0
  159. package/templates/identity/journeys/personal-growth.yaml +39 -0
  160. package/templates/identity/organization/identity.yaml +24 -0
  161. package/templates/identity/organization/principles.yaml +17 -0
  162. package/templates/identity/personas/coach.yaml +94 -0
  163. package/templates/identity/personas/designer.yaml +93 -0
  164. package/templates/identity/personas/doctor.yaml +96 -0
  165. package/templates/identity/personas/engineer.yaml +77 -0
  166. package/templates/identity/personas/financial.yaml +97 -0
  167. package/templates/identity/personas/prompt-engineer.yaml +122 -0
  168. package/templates/identity/personas/researcher.yaml +88 -0
  169. package/templates/identity/personas/strategist.yaml +91 -0
  170. package/templates/identity/personas/teacher.yaml +95 -0
  171. package/templates/identity/personas/therapist.yaml +91 -0
  172. package/templates/identity/personas/thinker.yaml +74 -0
  173. package/templates/identity/personas/writer.yaml +76 -0
  174. package/templates/identity/self/config.yaml +16 -0
  175. package/templates/identity/self/soul.yaml +105 -0
  176. package/templates/identity/user/identity.yaml +30 -0
  177. package/ts/src/backup/staging.ts +62 -0
  178. package/ts/src/backup/zipBackup.ts +267 -0
  179. package/ts/src/backup/zipReader.ts +109 -0
  180. package/ts/src/backup/zipWriter.ts +148 -0
  181. package/ts/src/builder/activeCheckpoint.ts +134 -0
  182. package/ts/src/builder/aggregateStatus.ts +34 -0
  183. package/ts/src/builder/approve.ts +149 -0
  184. package/ts/src/builder/argv.ts +292 -0
  185. package/ts/src/builder/ariadMethod.ts +536 -0
  186. package/ts/src/builder/artifacts/artifactSurfaces.ts +106 -0
  187. package/ts/src/builder/artifacts/artifactWriter.ts +113 -0
  188. package/ts/src/builder/artifacts/closureArtifacts.ts +199 -0
  189. package/ts/src/builder/artifacts/deliveryStoryArtifacts.ts +316 -0
  190. package/ts/src/builder/artifacts/planArtifacts.ts +242 -0
  191. package/ts/src/builder/artifacts/scaffoldSections.ts +273 -0
  192. package/ts/src/builder/artifacts/scaffoldState.ts +227 -0
  193. package/ts/src/builder/artifacts/storyFiles.ts +61 -0
  194. package/ts/src/builder/artifacts/storyIndex.ts +166 -0
  195. package/ts/src/builder/cadence.ts +59 -0
  196. package/ts/src/builder/card.ts +192 -0
  197. package/ts/src/builder/checkpointRefused.ts +66 -0
  198. package/ts/src/builder/closure.ts +964 -0
  199. package/ts/src/builder/commands.ts +2053 -0
  200. package/ts/src/builder/cursorPosition.ts +176 -0
  201. package/ts/src/builder/cursorTransitions.ts +77 -0
  202. package/ts/src/builder/deliveryCursor.ts +577 -0
  203. package/ts/src/builder/deliveryStoryClosure.ts +521 -0
  204. package/ts/src/builder/deliveryStoryPlan.ts +536 -0
  205. package/ts/src/builder/deliveryStoryReady.ts +160 -0
  206. package/ts/src/builder/deliveryStoryRoadmapClosure.ts +151 -0
  207. package/ts/src/builder/expand.ts +336 -0
  208. package/ts/src/builder/flowUnit.ts +339 -0
  209. package/ts/src/builder/homeSurface.ts +122 -0
  210. package/ts/src/builder/implementationGuard.ts +125 -0
  211. package/ts/src/builder/index.ts +11 -0
  212. package/ts/src/builder/lifecycleRefusal.ts +92 -0
  213. package/ts/src/builder/lifecycleRibbon.ts +159 -0
  214. package/ts/src/builder/load.ts +313 -0
  215. package/ts/src/builder/methodAdoption.ts +113 -0
  216. package/ts/src/builder/methodDefinition.ts +429 -0
  217. package/ts/src/builder/methodInspection.ts +371 -0
  218. package/ts/src/builder/plan.ts +408 -0
  219. package/ts/src/builder/planPreauthorization.ts +265 -0
  220. package/ts/src/builder/prepare.ts +225 -0
  221. package/ts/src/builder/projectPaths.ts +64 -0
  222. package/ts/src/builder/pull.ts +356 -0
  223. package/ts/src/builder/pullCandidates.ts +463 -0
  224. package/ts/src/builder/pullCandidatesRender.ts +238 -0
  225. package/ts/src/builder/refinementField.ts +93 -0
  226. package/ts/src/builder/releaseIntent.ts +173 -0
  227. package/ts/src/builder/resumeState.ts +84 -0
  228. package/ts/src/builder/resumeSurface.ts +149 -0
  229. package/ts/src/builder/roadmapGrammar.ts +300 -0
  230. package/ts/src/builder/roadmapScan.ts +97 -0
  231. package/ts/src/builder/roadmapScope.ts +210 -0
  232. package/ts/src/builder/scopePhrases.ts +146 -0
  233. package/ts/src/builder/storyPaths.ts +196 -0
  234. package/ts/src/builder/storyPlanPreauthorization.ts +287 -0
  235. package/ts/src/builder/surfaceProtocol.ts +42 -0
  236. package/ts/src/builder/templateGeneration.ts +148 -0
  237. package/ts/src/builder/transition.ts +178 -0
  238. package/ts/src/consult/args.ts +99 -0
  239. package/ts/src/consult/core.ts +122 -0
  240. package/ts/src/consult/modelCatalog.ts +55 -0
  241. package/ts/src/consult/render.ts +47 -0
  242. package/ts/src/conversation/append.ts +414 -0
  243. package/ts/src/conversation/backfill.ts +387 -0
  244. package/ts/src/conversation/closeTail.ts +467 -0
  245. package/ts/src/conversation/extraction.ts +333 -0
  246. package/ts/src/conversation/extractionDriver.ts +130 -0
  247. package/ts/src/conversation/extractionRun.ts +70 -0
  248. package/ts/src/conversation/hookPayload.ts +51 -0
  249. package/ts/src/conversation/journeyInference.ts +165 -0
  250. package/ts/src/conversation/journeyRepair.ts +114 -0
  251. package/ts/src/conversation/lifecycleFaces.ts +197 -0
  252. package/ts/src/conversation/lifecycleWrites.ts +313 -0
  253. package/ts/src/conversation/listing.ts +77 -0
  254. package/ts/src/conversation/logger.ts +851 -0
  255. package/ts/src/conversation/loggerCli.ts +321 -0
  256. package/ts/src/conversation/loggerRuntime.ts +259 -0
  257. package/ts/src/conversation/metadataLifecycle.ts +443 -0
  258. package/ts/src/conversation/recall.ts +66 -0
  259. package/ts/src/conversation/sessionComposites.ts +258 -0
  260. package/ts/src/conversation/sessionImport.ts +90 -0
  261. package/ts/src/conversation/transcriptBackfill.ts +141 -0
  262. package/ts/src/cultivation/applyActions.ts +241 -0
  263. package/ts/src/cultivation/cluster.ts +86 -0
  264. package/ts/src/cultivation/consolidationStore.ts +281 -0
  265. package/ts/src/cultivation/promptContext.ts +62 -0
  266. package/ts/src/cultivation/propose.ts +305 -0
  267. package/ts/src/cultivation/scan.ts +155 -0
  268. package/ts/src/db/backupGate.ts +47 -0
  269. package/ts/src/db/bootstrap.ts +108 -0
  270. package/ts/src/db/bootstrapLock.ts +223 -0
  271. package/ts/src/db/copyGuard.ts +60 -0
  272. package/ts/src/db/database.ts +397 -0
  273. package/ts/src/db/decode.ts +66 -0
  274. package/ts/src/db/ftsIntegrity.ts +41 -0
  275. package/ts/src/db/migrateOnOpen.ts +214 -0
  276. package/ts/src/db/migrations.ts +576 -0
  277. package/ts/src/db/readyOnOpen.ts +35 -0
  278. package/ts/src/db/rowDecode.ts +42 -0
  279. package/ts/src/db/schema.ts +432 -0
  280. package/ts/src/db/schemaInventory.ts +225 -0
  281. package/ts/src/db/schemaInventorySnapshot.ts +2107 -0
  282. package/ts/src/db/schemaState.ts +91 -0
  283. package/ts/src/db/schemaTsDivergence.ts +114 -0
  284. package/ts/src/descriptor/descriptorRead.ts +49 -0
  285. package/ts/src/docs/docsLint.ts +265 -0
  286. package/ts/src/explorer/handoff.ts +522 -0
  287. package/ts/src/explorer/render.ts +335 -0
  288. package/ts/src/explorer/story.ts +769 -0
  289. package/ts/src/explorer/transition.ts +72 -0
  290. package/ts/src/extensions/bindings.ts +170 -0
  291. package/ts/src/extensions/catalog.ts +249 -0
  292. package/ts/src/extensions/catalogCommands.ts +513 -0
  293. package/ts/src/extensions/catalogWrites.ts +652 -0
  294. package/ts/src/extensions/contextRuntime.ts +325 -0
  295. package/ts/src/extensions/dispatch.ts +374 -0
  296. package/ts/src/extensions/errors.ts +24 -0
  297. package/ts/src/extensions/manifest.ts +356 -0
  298. package/ts/src/extensions/migrations.ts +350 -0
  299. package/ts/src/extraction/conversation.ts +304 -0
  300. package/ts/src/extraction/conversationMetadata.ts +206 -0
  301. package/ts/src/extraction/fencing.ts +106 -0
  302. package/ts/src/extraction/json.ts +17 -0
  303. package/ts/src/extraction/prompts.ts +470 -0
  304. package/ts/src/frontDoor/args.ts +30 -0
  305. package/ts/src/frontDoor/argvShape.ts +106 -0
  306. package/ts/src/frontDoor/buildLoadRuntime.ts +139 -0
  307. package/ts/src/frontDoor/buildRoute.ts +398 -0
  308. package/ts/src/frontDoor/cli.ts +1872 -0
  309. package/ts/src/frontDoor/cloneRoleGuard.ts +98 -0
  310. package/ts/src/frontDoor/consultRoute.ts +50 -0
  311. package/ts/src/frontDoor/contentTailRoute.ts +239 -0
  312. package/ts/src/frontDoor/conversationLoggerRoute.ts +83 -0
  313. package/ts/src/frontDoor/cultivationRoute.ts +210 -0
  314. package/ts/src/frontDoor/dbPath.ts +131 -0
  315. package/ts/src/frontDoor/dbSafetyToolsRoute.ts +240 -0
  316. package/ts/src/frontDoor/exploreRoute.ts +572 -0
  317. package/ts/src/frontDoor/extensionCatalogRoute.ts +252 -0
  318. package/ts/src/frontDoor/frontDoorLog.ts +57 -0
  319. package/ts/src/frontDoor/identityWrite.ts +36 -0
  320. package/ts/src/frontDoor/journeyWriteRoute.ts +26 -0
  321. package/ts/src/frontDoor/lifecycleWriteRoute.ts +110 -0
  322. package/ts/src/frontDoor/liveBackup.ts +100 -0
  323. package/ts/src/frontDoor/mirrorModeRoute.ts +163 -0
  324. package/ts/src/frontDoor/namedRefusal.ts +35 -0
  325. package/ts/src/frontDoor/nodeSupport.ts +24 -0
  326. package/ts/src/frontDoor/render/consolidate.ts +199 -0
  327. package/ts/src/frontDoor/render/conversations.ts +33 -0
  328. package/ts/src/frontDoor/render/cultivationShared.ts +21 -0
  329. package/ts/src/frontDoor/render/descriptor.ts +20 -0
  330. package/ts/src/frontDoor/render/detectPersona.ts +50 -0
  331. package/ts/src/frontDoor/render/icons.ts +13 -0
  332. package/ts/src/frontDoor/render/identity.ts +59 -0
  333. package/ts/src/frontDoor/render/identityRows.ts +17 -0
  334. package/ts/src/frontDoor/render/inspectPersona.ts +53 -0
  335. package/ts/src/frontDoor/render/journeyStatus.ts +78 -0
  336. package/ts/src/frontDoor/render/journeys.ts +79 -0
  337. package/ts/src/frontDoor/render/list.ts +41 -0
  338. package/ts/src/frontDoor/render/memories.ts +67 -0
  339. package/ts/src/frontDoor/render/recall.ts +49 -0
  340. package/ts/src/frontDoor/render/shadow.ts +155 -0
  341. package/ts/src/frontDoor/render/tasks.ts +99 -0
  342. package/ts/src/frontDoor/render/tasksImportSync.ts +63 -0
  343. package/ts/src/frontDoor/render/week.ts +113 -0
  344. package/ts/src/frontDoor/routing.ts +1001 -0
  345. package/ts/src/frontDoor/runtimeRoute.ts +623 -0
  346. package/ts/src/frontDoor/searchRoute.ts +166 -0
  347. package/ts/src/frontDoor/seedPaths.ts +98 -0
  348. package/ts/src/frontDoor/sessionStartWelcomeRoute.ts +166 -0
  349. package/ts/src/frontDoor/soulRoute.ts +433 -0
  350. package/ts/src/frontDoor/stdinSource.ts +37 -0
  351. package/ts/src/frontDoor/tasksImportSyncRoute.ts +110 -0
  352. package/ts/src/frontDoor/tasksWriteRoute.ts +101 -0
  353. package/ts/src/frontDoor/usage.ts +176 -0
  354. package/ts/src/guards/claudePlugin.ts +298 -0
  355. package/ts/src/guards/packContents.ts +306 -0
  356. package/ts/src/guards/piSourcedSkills.ts +70 -0
  357. package/ts/src/guards/retiredRouteShadows.ts +57 -0
  358. package/ts/src/guards/retiredSurfaces.ts +564 -0
  359. package/ts/src/hooks/claude.ts +214 -0
  360. package/ts/src/hooks/codex.ts +45 -0
  361. package/ts/src/hooks/gemini.ts +126 -0
  362. package/ts/src/hooks/main.ts +109 -0
  363. package/ts/src/hooks/mirrorState.ts +71 -0
  364. package/ts/src/hooks/payload.ts +73 -0
  365. package/ts/src/hooks/runtime.ts +179 -0
  366. package/ts/src/hooks/runtimeDetection.ts +34 -0
  367. package/ts/src/identity/applyConsolidationIdentityUpdate.ts +67 -0
  368. package/ts/src/identity/descriptorGenerate.ts +162 -0
  369. package/ts/src/identity/identityEdit.ts +143 -0
  370. package/ts/src/identity/identityKey.ts +77 -0
  371. package/ts/src/identity/identityRead.ts +69 -0
  372. package/ts/src/identity/identityStore.ts +80 -0
  373. package/ts/src/identity/journeyListing.ts +53 -0
  374. package/ts/src/identity/personaInspect.ts +44 -0
  375. package/ts/src/identity/personaListing.ts +37 -0
  376. package/ts/src/identity/setIdentity.ts +64 -0
  377. package/ts/src/index.ts +231 -0
  378. package/ts/src/init/init.ts +111 -0
  379. package/ts/src/journey/journeyOptions.ts +131 -0
  380. package/ts/src/journey/journeyRemoval.ts +158 -0
  381. package/ts/src/journey/journeyStatus.ts +149 -0
  382. package/ts/src/journey/journeySyncFile.ts +87 -0
  383. package/ts/src/journey/journeyWrite.ts +203 -0
  384. package/ts/src/journey/parentJourney.ts +41 -0
  385. package/ts/src/journey/validateParentJourney.ts +55 -0
  386. package/ts/src/mcp/boundary.ts +151 -0
  387. package/ts/src/mcp/guards.ts +244 -0
  388. package/ts/src/mcp/main.ts +121 -0
  389. package/ts/src/mcp/payload.ts +141 -0
  390. package/ts/src/mcp/protocol.ts +141 -0
  391. package/ts/src/mcp/readModels.ts +241 -0
  392. package/ts/src/mcp/registry.ts +201 -0
  393. package/ts/src/mcp/serve.ts +120 -0
  394. package/ts/src/mcp/tools/deterministic.ts +137 -0
  395. package/ts/src/mcp/tools/providerCrossing.ts +187 -0
  396. package/ts/src/mcp/wire.ts +8 -0
  397. package/ts/src/memory/journal.ts +180 -0
  398. package/ts/src/memory/listing.ts +107 -0
  399. package/ts/src/memory/memoryWrite.ts +88 -0
  400. package/ts/src/memory/reinforcement.ts +35 -0
  401. package/ts/src/mirror/context.ts +161 -0
  402. package/ts/src/mirror/defaultResolution.ts +199 -0
  403. package/ts/src/mirror/mirrorForm.ts +43 -0
  404. package/ts/src/mirror/orchestration.ts +364 -0
  405. package/ts/src/mirror/reception.ts +194 -0
  406. package/ts/src/mirror/render.ts +75 -0
  407. package/ts/src/mirror/runtimeSession.ts +205 -0
  408. package/ts/src/mode/operatingMode.ts +148 -0
  409. package/ts/src/observability/callOutcome.ts +115 -0
  410. package/ts/src/observability/inspectLedger.ts +329 -0
  411. package/ts/src/observability/ledgerHooks.ts +126 -0
  412. package/ts/src/observability/llmCalls.ts +154 -0
  413. package/ts/src/persona/detectPersona.ts +81 -0
  414. package/ts/src/planning/promptAssembly.ts +111 -0
  415. package/ts/src/planning/weekPending.ts +81 -0
  416. package/ts/src/planning/weekPlan.ts +183 -0
  417. package/ts/src/planning/weekSave.ts +117 -0
  418. package/ts/src/providers/config.ts +189 -0
  419. package/ts/src/providers/cost.ts +64 -0
  420. package/ts/src/providers/credits.ts +204 -0
  421. package/ts/src/providers/embedding.ts +321 -0
  422. package/ts/src/providers/familyProviders.ts +147 -0
  423. package/ts/src/providers/llm.ts +334 -0
  424. package/ts/src/providers/openrouter.ts +244 -0
  425. package/ts/src/providers/redaction.ts +110 -0
  426. package/ts/src/providers/replay.ts +15 -0
  427. package/ts/src/providers/transport.ts +410 -0
  428. package/ts/src/repair/encodingRepair.ts +253 -0
  429. package/ts/src/runtime/backup.ts +151 -0
  430. package/ts/src/runtime/channel.ts +146 -0
  431. package/ts/src/runtime/config.ts +168 -0
  432. package/ts/src/runtime/diagnose.ts +686 -0
  433. package/ts/src/runtime/git.ts +510 -0
  434. package/ts/src/runtime/installKind.ts +220 -0
  435. package/ts/src/runtime/migrate.ts +154 -0
  436. package/ts/src/runtime/packageIdentity.ts +102 -0
  437. package/ts/src/runtime/releaseNotes.ts +244 -0
  438. package/ts/src/runtime/status.ts +557 -0
  439. package/ts/src/runtime/strategies/clone.ts +200 -0
  440. package/ts/src/runtime/strategies/package.ts +328 -0
  441. package/ts/src/runtime/treeRoot.ts +30 -0
  442. package/ts/src/runtime/update.ts +445 -0
  443. package/ts/src/runtime/updateGate.ts +40 -0
  444. package/ts/src/runtime/updatePipeline.ts +159 -0
  445. package/ts/src/runtime/version.ts +36 -0
  446. package/ts/src/runtime/wiring.ts +130 -0
  447. package/ts/src/search/memorySearch.ts +338 -0
  448. package/ts/src/search/ranker.ts +154 -0
  449. package/ts/src/seed/seed.ts +256 -0
  450. package/ts/src/seed/seedYaml.ts +133 -0
  451. package/ts/src/soul/apply.ts +218 -0
  452. package/ts/src/soul/harvest.ts +267 -0
  453. package/ts/src/soul/prompts/soul_beauty_voice.md +103 -0
  454. package/ts/src/soul/prompts/soul_self_voice.md +219 -0
  455. package/ts/src/soul/prompts/soul_wisdom_voice.md +121 -0
  456. package/ts/src/soul/prompts.ts +85 -0
  457. package/ts/src/soul/render.ts +358 -0
  458. package/ts/src/soul/state.ts +212 -0
  459. package/ts/src/soul/transition.ts +37 -0
  460. package/ts/src/tasks/journeyPathParse.ts +113 -0
  461. package/ts/src/tasks/taskImportSync.ts +142 -0
  462. package/ts/src/tasks/taskStore.ts +312 -0
  463. package/ts/src/tasks/weekView.ts +120 -0
  464. package/ts/src/util/clipCodePoints.ts +26 -0
  465. package/ts/src/util/paths.ts +63 -0
  466. package/ts/src/util/program.ts +9 -0
  467. package/ts/src/util/pyGenerators.ts +144 -0
  468. package/ts/src/util/pythonText.ts +317 -0
  469. package/ts/src/util/semver.ts +45 -0
  470. package/ts/src/util/shellWord.ts +25 -0
  471. package/ts/src/util/slug.ts +64 -0
  472. package/ts/src/welcome/card.ts +339 -0
  473. package/ts/src/welcome/statusLine.ts +101 -0
  474. package/ts/src/welcome/updateCache.ts +129 -0
@@ -0,0 +1,564 @@
1
+ // Fail CI when a surface CV22.DS10 retired comes back, or never fully left.
2
+ //
3
+ // The Node port of `scripts/check_retired_surfaces.py` (CV22.DS10.TS5, slice
4
+ // B). The Zero Python gate assigns that file here with a one-line reason that
5
+ // is the whole argument: **it must outlive the deletion it proves.** A guard
6
+ // written in the language it forbids cannot run on the day the language is
7
+ // gone.
8
+ //
9
+ // DS10 removes surfaces rather than porting them. Each deletion is large,
10
+ // touches many files, and is easy to leave half-done -- a dangling import, a
11
+ // `--help` row, a skill still naming the command, a test patching a module
12
+ // nobody has anymore. A deletion has no test of its own. This is that test:
13
+ // one table, one sweep, and a row added by each retiring story. Per surface:
14
+ //
15
+ // * ABSENCE -- every path the story deleted is still gone.
16
+ // * NO RESIDUE -- no tracked file mentions the surface, except where the
17
+ // mention is the point: the roadmap, decisions, debt, refinement, and
18
+ // release notes, which exist to record that it was retired and why.
19
+ //
20
+ // What it deliberately does NOT do: prove the deletion was correct. The suites
21
+ // do that. This proves it was COMPLETE, and stays complete.
22
+
23
+ import { execFileSync } from "node:child_process";
24
+ import { readFileSync } from "node:fs";
25
+ import { join } from "node:path";
26
+
27
+ /**
28
+ * Mentions are expected -- and required -- in the documents whose job is to
29
+ * record the retirement. Everything else is residue.
30
+ */
31
+ export const HISTORY_PREFIXES: readonly string[] = [
32
+ // Everything under `docs/project/` is the project's record of itself --
33
+ // roadmap, decisions, debt, refinement, audits, briefing. A retired surface
34
+ // is supposed to be named there.
35
+ "docs/project/",
36
+ "docs/process/worklog.md",
37
+ "docs/releases/",
38
+ // A guard's own table is the one file that must name every retired surface:
39
+ // the patterns ARE the data, so the table and its self-test exempt
40
+ // themselves, as the Python original (deleted at TS5 plateau 3) always did.
41
+ //
42
+ // Both guards learned this the same way, in CI rather than locally, because
43
+ // the sweep reads `git ls-files` -- so a file that is written but not yet
44
+ // COMMITTED is invisible to it. Local green on new files is not evidence.
45
+ "ts/src/guards/retiredSurfaces.ts",
46
+ "ts/test/scripts/retiredSurfaces.test.ts",
47
+ ];
48
+
49
+ export interface RetiredSurface {
50
+ readonly surfaceId: string;
51
+ readonly story: string;
52
+ /** Paths that must not exist. Directories end with `/`. */
53
+ readonly absentPaths: readonly string[];
54
+ /**
55
+ * File suffixes that must not be tracked ANYWHERE -- `.py`, for the claim
56
+ * that the repository holds no Python at all rather than none in the paths
57
+ * someone thought to list (CV22.DS10.TS5).
58
+ */
59
+ readonly absentSuffixes?: readonly string[];
60
+ /** Regexes that must not appear in tracked files outside HISTORY_PREFIXES. */
61
+ readonly forbiddenPatterns: readonly string[];
62
+ /** Paths allowed to mention the surface beyond the history prefixes, with why. */
63
+ readonly exemptions: Readonly<Record<string, string>>;
64
+ /**
65
+ * When present, the residue sweep reads ONLY tracked files under these
66
+ * prefixes. For a claim about one kind of file -- "no workflow installs an
67
+ * interpreter" -- where the same words elsewhere (a guide explaining what
68
+ * CI used to do) are not residue.
69
+ */
70
+ readonly residueScope?: readonly string[];
71
+ /**
72
+ * A row that is DEFINED but not yet ENFORCED, with the reason and the moment
73
+ * it goes live.
74
+ *
75
+ * A staged row is not a disabled one. `python-core` below is proven to fire
76
+ * against today's tree by `retiredSurfaces.test.ts` -- it must report the
77
+ * live interpreter, or the test fails. So the row is graded now and enforced
78
+ * later, and going live at plateau 3 is a one-word edit rather than new,
79
+ * unexercised code written on the day the safety net is already gone.
80
+ */
81
+ readonly stagedUntil?: string;
82
+ }
83
+
84
+ /**
85
+ * Every shape in which a line of text can tell someone to run the deleted
86
+ * Python core: the interpreter by any name it was invoked under, `uv` itself,
87
+ * and the core as an importable package -- the shape the runtime hooks used,
88
+ * which no command-level pattern can see.
89
+ *
90
+ * Exported because two things need the same list: the `python-core-mentions`
91
+ * row below, which reads the TRACKED FILES, and the tests that grade what the
92
+ * product PRINTS -- an updater recommendation or a recovery route that sends a
93
+ * user back to the interpreter is the same residue, one step later, and no
94
+ * file scan can see a string the code assembles at runtime.
95
+ */
96
+ export const INTERPRETER_INVOCATIONS: readonly string[] = [
97
+ // The interpreter, by any name it is invoked under.
98
+ "uv run python",
99
+ "python3? -m memory\\b",
100
+ "python3? -c ",
101
+ "\\buv (run|sync)\\b",
102
+ // The core as an importable Python package.
103
+ "from memory\\.",
104
+ "from memory import",
105
+ "import memory\\b",
106
+ "memory\\.hooks",
107
+ ];
108
+
109
+ export const RETIRED: readonly RetiredSurface[] = [
110
+ {
111
+ surfaceId: "journey-projections",
112
+ story: "CV22.DS10.TS1",
113
+ absentPaths: [
114
+ "src/memory/journey_projections/",
115
+ "src/memory/cli/journey_projection.py",
116
+ "ts/src/explorer/projectionRefresh.ts",
117
+ "tests/unit/memory/journey_projections/",
118
+ "tests/integration/memory/journey_projections/",
119
+ "tests/fixtures/journey_projections/",
120
+ ],
121
+ forbiddenPatterns: [
122
+ "journey_projections",
123
+ "journey-projection\\b",
124
+ "createPythonProjectionRefresh",
125
+ "requestProjectionRefresh",
126
+ // The API names, not just the module names. CI found
127
+ // `configure_projection_refresh` surviving in `ts/parity/` after the
128
+ // first version of this table missed it: the patterns were written from
129
+ // the files the deletion touched, which is the one place residue cannot
130
+ // be.
131
+ "configure_projection_refresh",
132
+ "request_projection_refresh",
133
+ ],
134
+ exemptions: {
135
+ "docs/product/extensions/api-reference.md":
136
+ "documents the removal for an extension author reading an older copy",
137
+ },
138
+ },
139
+ {
140
+ surfaceId: "web-console",
141
+ story: "CV22.DS10.US1",
142
+ absentPaths: [
143
+ "src/memory/web/",
144
+ "src/memory/surfaces/atlas.py",
145
+ "src/memory/surfaces/workspace.py",
146
+ "src/memory/surfaces/evidence.py",
147
+ "src/memory/surfaces/objects.py",
148
+ "src/memory/surfaces/models.py",
149
+ "src/memory/surfaces/search.py",
150
+ "src/memory/intelligence/scene.py",
151
+ "evals/scene.py",
152
+ "tests/unit/memory/web/",
153
+ "tests/unit/memory/evals/test_scene_fixture_contract.py",
154
+ "tests/unit/memory/intelligence/test_scene.py",
155
+ ],
156
+ forbiddenPatterns: [
157
+ "memory\\.web\\b",
158
+ "memory web\\b",
159
+ "SurfaceService",
160
+ "intelligence\\.scene\\b",
161
+ "WorkspaceSurface|AtlasSurface|EvidenceSurface|SearchSurface|ObjectDetailSurface",
162
+ ],
163
+ exemptions: {},
164
+ },
165
+ {
166
+ surfaceId: "compat-host",
167
+ story: "CV22.DS10.TS2",
168
+ // Gate items 2 and 5 in one mechanical place: item 2 asks that the packaged
169
+ // artifact carry no core-owned Python extension bridge, and item 5 that
170
+ // every retained provider and command enter through a declared
171
+ // language-neutral runtime. Both reduce to the same claim -- the host and
172
+ // every launcher branch for it are gone -- and this check runs over the
173
+ // tracked file set the package is built from.
174
+ absentPaths: [
175
+ "src/memory/extensions/compat_host.py",
176
+ "tests/unit/memory/extensions/test_compat_host.py",
177
+ "ts/parity/generate_ext_dispatch_golden.py",
178
+ "ts/test/fixtures/ext-dispatch.golden.json",
179
+ ],
180
+ forbiddenPatterns: [
181
+ "compat_host",
182
+ "compat-host",
183
+ // The launcher seams, not only the module. The TS1 lesson: residue hides
184
+ // in the names of the things that CALLED the deleted code, which is the
185
+ // one place the deletion diff cannot show it.
186
+ "validate_register",
187
+ "validateExtensionRegister",
188
+ "legacyCommand",
189
+ "legacyCwd",
190
+ "hostCommand",
191
+ "spawnHost",
192
+ // The generator and the corpus it recorded. `absentPaths` proves the
193
+ // FILES are gone; these prove nothing still CALLS them. CI found the gap
194
+ // the hard way on 2026-09-22: the determinism step kept invoking the
195
+ // deleted generator and failed on Python 3.10 and 3.12 after the files
196
+ // had been removed for four commits.
197
+ "generate_ext_dispatch_golden",
198
+ "ext-dispatch\\.golden",
199
+ ],
200
+ exemptions: {
201
+ "ts/test/extensions/dispatch.test.ts":
202
+ "the file that REPLACED the host's parity corpus, and whose header records what each retired group of cases proved -- the disposition itself",
203
+ },
204
+ },
205
+ {
206
+ surfaceId: "eval-harness",
207
+ story: "CV22.DS10.TS3",
208
+ // The model-behavior release gate moved to ts/evals/ and the Python harness
209
+ // was deleted with its tests, its entry point, and the three helpers that
210
+ // existed only to feed the port. Each of those imported what this story
211
+ // removed, so they die with it -- the fixture and its oracle die together,
212
+ // as in TS2.
213
+ absentPaths: ["evals/", "tests/unit/memory/evals/"],
214
+ forbiddenPatterns: [
215
+ "from evals\\b",
216
+ "import evals\\b",
217
+ "memory eval\\b",
218
+ "evals\\.runner",
219
+ "evals\\._support",
220
+ // The helpers by name: absentPaths proves the FILES are gone, these prove
221
+ // nothing still calls them -- the TS2 lesson, where a CI step kept
222
+ // invoking a deleted generator for four commits.
223
+ "_capture_probe_inputs",
224
+ "_check_fixture_equality",
225
+ "_generate_support_golden",
226
+ ],
227
+ exemptions: {},
228
+ },
229
+ // CV22.DS10.TS4 retired five surfaces, so it contributes five rows rather
230
+ // than one. They are separate because they fail separately: a resurrected
231
+ // `migrate-legacy` and a resurrected Workbench verb are different mistakes
232
+ // with different fixes, and one row naming both would report the wrong one.
233
+ //
234
+ // Every pattern below is a COMMAND SHAPE or a MODULE NAME, never bare
235
+ // vocabulary. `mutate`, `change-request`, and `refinement-story` are living
236
+ // Ariad words, so a guard matching the words alone would be red on the day it
237
+ // landed and would then be weakened with exemptions until it meant nothing.
238
+ {
239
+ surfaceId: "legacy-migration",
240
+ story: "CV22.DS10.TS4",
241
+ absentPaths: [
242
+ "src/memory/cli/migrate_legacy.py",
243
+ "src/memory/cli/migration_rehearsal.py",
244
+ "tests/unit/memory/cli/test_migrate_legacy.py",
245
+ "tests/unit/memory/cli/test_migration_rehearsal.py",
246
+ ],
247
+ forbiddenPatterns: [
248
+ "migrate_legacy",
249
+ "migration_rehearsal",
250
+ "memory-rehearse-migration",
251
+ "memory migrate-legacy",
252
+ ],
253
+ exemptions: {},
254
+ },
255
+ {
256
+ surfaceId: "journey-admin-verbs",
257
+ story: "CV22.DS10.TS4",
258
+ absentPaths: [
259
+ "src/memory/services/journey_admin.py",
260
+ "src/memory/storage/journey_admin.py",
261
+ "tests/unit/memory/services/test_journey_admin.py",
262
+ ],
263
+ forbiddenPatterns: [
264
+ "journey_admin",
265
+ "JourneyAdmin",
266
+ "journey export-registry",
267
+ "journey mutate\\b",
268
+ "mirror\\.journey-mutation@",
269
+ ],
270
+ exemptions: {
271
+ "ts/src/frontDoor/routing.ts": "the retired entries that answer the two verbs",
272
+ "ts/src/frontDoor/cli.ts":
273
+ "the refusal itself; the comment names the write verb to explain why it must answer BEFORE stdin is read, which is the property under test",
274
+ "ts/test/frontDoor/retiredSurfaces.test.ts": "the test of those refusals",
275
+ },
276
+ },
277
+ {
278
+ surfaceId: "conversation-metadata-backfill",
279
+ story: "CV22.DS10.TS4",
280
+ absentPaths: [],
281
+ forbiddenPatterns: [
282
+ // The flags and the two service methods. NOT the bare word `backfill`:
283
+ // `conversation-logger backfill-pi-sessions` and
284
+ // `ts/src/conversation/backfill.ts` are the TRANSCRIPT backfills, a
285
+ // different feature that is ported and staying.
286
+ "--metadata-backfill-",
287
+ "metadata_backfill",
288
+ "preview_metadata_backfill",
289
+ "apply_metadata_backfill",
290
+ ],
291
+ exemptions: {
292
+ "ts/src/frontDoor/routing.ts": "the retired entries that answer the two flags",
293
+ "ts/test/frontDoor/retiredSurfaces.test.ts": "the test of those refusals",
294
+ "ts/test/frontDoor/routing.test.ts":
295
+ "asserts the flags are retired whatever the lifecycle gate says",
296
+ "scripts/capture_family_outputs.sh":
297
+ "CV22.DS10.TS5 captures the refusal itself as a command family: the cutoff answer is a user-visible surface, so it is hashed before the deletion and replayed after it",
298
+ },
299
+ },
300
+ {
301
+ surfaceId: "sqlite-refinement-workbench",
302
+ story: "CV22.DS10.TS4",
303
+ absentPaths: [
304
+ "src/memory/builder/workbench.py",
305
+ "src/memory/builder/workbench_surfaces.py",
306
+ "src/memory/storage/builder_workbench.py",
307
+ "ts/src/builder/workbenchSnapshot.ts",
308
+ "tests/unit/memory/builder/test_workbench.py",
309
+ "tests/unit/memory/storage/test_builder_workbench_store.py",
310
+ ],
311
+ forbiddenPatterns: [
312
+ "workbench_surfaces",
313
+ "BuilderWorkbenchStore",
314
+ "get_workbench_snapshot",
315
+ "getWorkbenchSnapshot",
316
+ "safeWorkbenchSnapshot",
317
+ "_safe_workbench_snapshot",
318
+ "workbenchSnapshot",
319
+ "build refinement-story ",
320
+ "build change-request ",
321
+ // The surfaces those twenty commands rendered.
322
+ "CHANGE_REQUEST_CAPTURED",
323
+ "REFINEMENT_STORY_OVERVIEW",
324
+ "REFINEMENT_STORY_PULLED",
325
+ ],
326
+ exemptions: {
327
+ "ts/test/frontDoor/retiredSurfaces.test.ts": "the test of those refusals",
328
+ "scripts/capture_family_outputs.sh":
329
+ "CV22.DS10.TS5 captures the refusal itself as a command family: the cutoff answer is a user-visible surface, so it is hashed before the deletion and replayed after it",
330
+ },
331
+ },
332
+ {
333
+ surfaceId: "python-core",
334
+ story: "CV22.DS10.TS5",
335
+ // The row DS10's Zero Python gate asks for, written at plateau 0 and split
336
+ // in two at plateau 3 (decision D12). This half is the STRUCTURAL claim,
337
+ // live since plateau 3: nothing the Python core consisted of is tracked, no
338
+ // file anywhere is Python, and no workflow installs an interpreter. The
339
+ // other half -- what the tree still SAYS about Python -- is
340
+ // `python-core-mentions` below, live since plateau 4, once slice H had
341
+ // rewritten the documentation that held most of it.
342
+ //
343
+ // `absentSuffixes` is the part a path list could not express. The Plan's
344
+ // own inventory listed where the Python lived; it was the six fixture
345
+ // bodies nobody listed that proved the list could be short.
346
+ absentPaths: [
347
+ "src/memory/",
348
+ "tests/",
349
+ "pyproject.toml",
350
+ "uv.lock",
351
+ "spikes/ts-search-parity/",
352
+ "scripts/check_doc_links.py",
353
+ "scripts/check_retired_surfaces.py",
354
+ "scripts/check_oracle_drift.py",
355
+ "scripts/build_claude_plugin.py",
356
+ "scripts/reset_sandbox_pet_store.py",
357
+ "ts/parity/",
358
+ ],
359
+ absentSuffixes: [".py"],
360
+ // CI installing an interpreter is the same claim at the workflow level, and
361
+ // it is scoped to the workflows: a guide may still explain what CI did.
362
+ forbiddenPatterns: ["setup-python", "astral-sh/setup-uv", "\\buv (run|sync)\\b"],
363
+ residueScope: [".github/workflows/"],
364
+ exemptions: {},
365
+ },
366
+ {
367
+ surfaceId: "python-core-mentions",
368
+ story: "CV22.DS10.TS5",
369
+ // The second half of the Zero Python row (D12): no tracked file outside
370
+ // the project's record INVOKES the interpreter or imports the core. Staged
371
+ // from plateau 0 -- graded against the live tree, never enforced -- and
372
+ // enforced since plateau 4, when the last of 79 mentions was rewritten or
373
+ // exempted with its reason.
374
+ //
375
+ // It is deliberately WIDER than the guard it replaces. US2's Skill
376
+ // Invocation Gate was satisfied by a check whose pattern was
377
+ // `uv run python -m memory`, scanning skills. TS5's inventory then found
378
+ // TWELVE runtime hook files invoking `python3 -m memory` -- and reaching
379
+ // into `memory.hooks.*` and `memory.cli.*` internals that were never
380
+ // commands at all. The narrow pattern was true and the conclusion it
381
+ // supported was false. So the patterns below cover the interpreter by any
382
+ // name, the module by any import shape, and `uv` itself.
383
+ absentPaths: [],
384
+ forbiddenPatterns: INTERPRETER_INVOCATIONS,
385
+ // Until US3 plateau 5 this table also exempted eleven files of the Windows
386
+ // product -- `installer/`, `frame/`, `docs/installer/`, and the installer's
387
+ // CI smoke -- "until US3 re-homes them": the interpreter spawns that kept
388
+ // TS5 from claiming zero Python for the shipped artifact. US3 retired the
389
+ // product instead (decision D4; the `frame-installer` row below), and the
390
+ // exemptions expired with the files.
391
+ exemptions: {
392
+ // Checks whose job is to name what they forbid. The table's own file is
393
+ // history for the same reason (HISTORY_PREFIXES).
394
+ "ts/scripts/checkSkillCommandParity.ts":
395
+ "a guard: its pattern IS the retired invocation it forbids in the skills, as this table's own patterns are here",
396
+ "ts/test/scripts/packContents.test.ts":
397
+ "the test of the pack guard's content rule (US3 plateau 5): it seeds the retired invocation into a synthetic shipped file to prove the artifact half of the Zero Python gate fires",
398
+ "scripts/smoke_runtime_update.sh":
399
+ "a negative check: the smoke FAILS if the updater's output still tells a user to run the interpreter",
400
+ // A Done user story is a record of what was run, when. Rewriting its
401
+ // commands would make its evidence describe a run that never happened.
402
+ "docs/product/extensions/user-stories/US-00-infra-de-command-skill.md":
403
+ "a Done user story (2026-05-11): its commands and evidence are the record of what was run on the Python core, under a banner naming today's contract",
404
+ // Frozen fixtures. Their bytes are the record; see ts/test/goldens/README.md.
405
+ "ts/test/goldens/README.md":
406
+ "the frozen goldens' changelog: its D12 row names the retired invocation that substitution replaced",
407
+ "ts/test/goldens/builder-command.golden.json":
408
+ "recorded fixture INPUT, not product output: a scenario passes `validate-item --check` a caller's own check command, and the golden records the argv and the validation artifact that echoes it",
409
+ "ts/test/goldens/builder-lifecycle.golden.json":
410
+ "the same caller-supplied check command, recorded as `automated_checks` input across the lifecycle scenarios",
411
+ },
412
+ },
413
+ {
414
+ surfaceId: "frame-installer",
415
+ story: "CV22.DS10.US3",
416
+ // The Windows Frame (an Electron shell over Pi) and the Inno Setup
417
+ // installer, retired at US3 plateau 5 by decision D4 rather than re-homed
418
+ // onto the npm package. Their premise was a `uv`-bearing git clone: the
419
+ // installer cloned the repository and ran `uv sync`, the Frame spawned the
420
+ // interpreter for eight commands, and both found their root by the
421
+ // `pyproject.toml` TS5 deleted. Three downloads of the artifact ever, none
422
+ // since August, no known user. They still work at the last Python-bearing
423
+ // release, `cv22-last-python-bearing`, which is what the cutoff says.
424
+ //
425
+ // The row is what lets the DS10 Zero Python gate close for the shipped
426
+ // artifact: with these gone, no tracked file spawns the interpreter from
427
+ // JavaScript or PowerShell, where neither the skill guard nor the
428
+ // `python-core-mentions` patterns could see it (the Frame built each argv
429
+ // as an array).
430
+ absentPaths: [
431
+ "frame/",
432
+ "installer/",
433
+ "docs/installer/",
434
+ "spikes/windows-frame-mockup/",
435
+ ".github/workflows/windows-installer.yml",
436
+ "scripts/ci-nonascii-profile-smoke.ps1",
437
+ ],
438
+ // The product was PowerShell and Inno Setup, and nothing else in the tree
439
+ // is. A Windows story that adds either amends this row on purpose.
440
+ absentSuffixes: [".ps1", ".psm1", ".iss", ".cmd"],
441
+ // File names, never vocabulary: "Windows" and "installer" are living words
442
+ // (the npm install, the per-runtime wiring); these are the scripts a
443
+ // document could still tell someone to run.
444
+ forbiddenPatterns: [
445
+ "windows-installer\\.yml",
446
+ "bootstrap\\.ps1",
447
+ "configure\\.ps1",
448
+ "health-check\\.ps1",
449
+ "MirrorInstall\\.psm1",
450
+ "mirror\\.iss",
451
+ "MirrorMind-Setup",
452
+ "launcher/mirror\\.cmd",
453
+ "command-registry\\.js",
454
+ "root-resolve\\.js",
455
+ "smoke-electron",
456
+ "ci-nonascii-profile-smoke",
457
+ ],
458
+ // ES-004 Experiment 1's static mockup (`spikes/windows-frame-mockup/`)
459
+ // went with the Frame it was drawn for, at the Navigator's direction; the
460
+ // exploration's record is `docs/project/exploration/es-004-*.md`.
461
+ exemptions: {},
462
+ },
463
+ ];
464
+
465
+ export interface SurfaceProblem {
466
+ readonly surfaceId: string;
467
+ readonly message: string;
468
+ }
469
+
470
+ export function isHistory(path: string): boolean {
471
+ return HISTORY_PREFIXES.some((prefix) => path.startsWith(prefix));
472
+ }
473
+
474
+ /** Tracked paths only -- `git ls-files`, in repository order. */
475
+ export function trackedFiles(repoRoot: string): string[] {
476
+ const stdout = execFileSync("git", ["ls-files"], {
477
+ cwd: repoRoot,
478
+ encoding: "utf8",
479
+ maxBuffer: 64 * 1024 * 1024,
480
+ });
481
+ return stdout.split("\n").filter((line) => line.length > 0);
482
+ }
483
+
484
+ /**
485
+ * Tracked paths only.
486
+ *
487
+ * Git is the authority on what the repository contains. A leftover
488
+ * `__pycache__` beside a deleted module is a stale build artifact on one
489
+ * machine, not a surface that came back -- failing on it would teach the reader
490
+ * to distrust this check.
491
+ */
492
+ export function checkAbsent(surface: RetiredSurface, files: readonly string[]): SurfaceProblem[] {
493
+ const retired = (path: string): boolean =>
494
+ surface.absentPaths.some((relPath) =>
495
+ relPath.endsWith("/") ? path.startsWith(relPath) : path === relPath,
496
+ ) || (surface.absentSuffixes ?? []).some((suffix) => path.endsWith(suffix));
497
+ // One problem per file, however many of the row's rules it breaks: a
498
+ // re-added `src/memory/__init__.py` is one regression, not two.
499
+ return files.filter(retired).map((path) => ({
500
+ surfaceId: surface.surfaceId,
501
+ message: ` ${surface.surfaceId}: ${path} is tracked but was retired by ${surface.story}`,
502
+ }));
503
+ }
504
+
505
+ export function checkResidue(
506
+ surface: RetiredSurface,
507
+ files: readonly string[],
508
+ repoRoot: string,
509
+ ): SurfaceProblem[] {
510
+ const problems: SurfaceProblem[] = [];
511
+ const patterns = surface.forbiddenPatterns.map((pattern) => new RegExp(pattern));
512
+ for (const path of files) {
513
+ if (isHistory(path) || path in surface.exemptions) continue;
514
+ if (surface.residueScope && !surface.residueScope.some((prefix) => path.startsWith(prefix))) {
515
+ continue;
516
+ }
517
+ let content: string;
518
+ try {
519
+ content = readFileSync(join(repoRoot, path), "utf8");
520
+ } catch {
521
+ continue; // binaries and unreadable files carry no residue worth reading
522
+ }
523
+ // A NUL byte means a binary git happens to have tracked as readable text.
524
+ if (content.includes("\0")) continue;
525
+ for (const pattern of patterns) {
526
+ const match = pattern.exec(content);
527
+ if (match) {
528
+ const line = (content.slice(0, match.index).match(/\n/g) ?? []).length + 1;
529
+ problems.push({
530
+ surfaceId: surface.surfaceId,
531
+ message: ` ${surface.surfaceId}: ${path}:${line} mentions \`${match[0]}\`, retired by ${surface.story}`,
532
+ });
533
+ break;
534
+ }
535
+ }
536
+ }
537
+ return problems;
538
+ }
539
+
540
+ export interface SweepOptions {
541
+ /** Grade staged rows too, without enforcing them. Used by the self-test. */
542
+ readonly includeStaged?: boolean;
543
+ /** Restrict the sweep to one surface id. Used by the self-test. */
544
+ readonly only?: string;
545
+ }
546
+
547
+ export function sweep(
548
+ repoRoot: string,
549
+ surfaces: readonly RetiredSurface[] = RETIRED,
550
+ options: SweepOptions = {},
551
+ ): SurfaceProblem[] {
552
+ const files = trackedFiles(repoRoot);
553
+ const problems: SurfaceProblem[] = [];
554
+ for (const surface of surfaces) {
555
+ if (options.only && surface.surfaceId !== options.only) continue;
556
+ if (surface.stagedUntil && !options.includeStaged && !options.only) continue;
557
+ problems.push(...checkAbsent(surface, files));
558
+ problems.push(...checkResidue(surface, files, repoRoot));
559
+ }
560
+ return problems;
561
+ }
562
+
563
+ export const ENFORCED: readonly RetiredSurface[] = RETIRED.filter((s) => !s.stagedUntil);
564
+ export const STAGED: readonly RetiredSurface[] = RETIRED.filter((s) => s.stagedUntil);