create-egregore 0.21.6 → 0.22.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 (719) hide show
  1. package/assets/egregore-launcher.js +58 -6
  2. package/assets/egregore-launcher.sh +15 -2
  3. package/lib/claude-runtime.js +2 -0
  4. package/lib/codex-runtime.js +2 -0
  5. package/lib/setup.js +20 -3
  6. package/package.json +2 -2
  7. package/runtime/claude/.claude/context/commit-format.md +7 -4
  8. package/runtime/claude/.claude/context/handoff-claiming.md +32 -0
  9. package/runtime/claude/.claude/context/notification-consent.md +12 -9
  10. package/runtime/claude/.claude/hooks/boundary-check.sh +14 -331
  11. package/runtime/claude/.claude/hooks/memory-read-guard.sh +9 -1
  12. package/runtime/claude/.claude/rules/voice-bedrock.md +6 -2
  13. package/runtime/claude/.claude/settings.json +1 -1
  14. package/runtime/claude/.claude/skills/commit/SKILL.md +5 -3
  15. package/runtime/claude/.claude/skills/dark-mode/SKILL.md +48 -369
  16. package/runtime/claude/.claude/skills/records/SKILL.md +158 -0
  17. package/runtime/claude/.claude/skills/reflect/SKILL.md +50 -21
  18. package/runtime/claude/.claude/skills/review-pr/SKILL.md +4 -2
  19. package/runtime/claude/.claude/skills/save/SKILL.md +9 -3
  20. package/runtime/claude/.claude/skills/summon/SKILL.md +138 -207
  21. package/runtime/claude/.claude/skills/tui-design/SKILL.md +1 -1
  22. package/runtime/claude/.claude/skills/update/SKILL.md +1 -1
  23. package/runtime/claude/.claude/skills/view/SKILL.md +52 -16
  24. package/runtime/claude/.claude/skills/view/compose-scaffold.html +19 -13
  25. package/runtime/claude/CLAUDE.md +59 -95
  26. package/runtime/claude/bin/agent.sh +231 -7
  27. package/runtime/claude/bin/api-call.sh +44 -23
  28. package/runtime/claude/bin/artifact-register.sh +7 -1
  29. package/runtime/claude/bin/artifact-writeback.sh +1 -1
  30. package/runtime/claude/bin/artifacts.sh +66 -265
  31. package/runtime/claude/bin/attendant.sh +4 -1
  32. package/runtime/claude/bin/boundary-guard.cjs +1848 -0
  33. package/runtime/claude/bin/boundary-hook.sh +41 -0
  34. package/runtime/claude/bin/boundary.sh +15 -155
  35. package/runtime/claude/bin/capture-run.sh +32 -2
  36. package/runtime/claude/bin/codex-render-spec.mjs +24 -46
  37. package/runtime/claude/bin/codex-session-start.sh +19 -0
  38. package/runtime/claude/bin/codex-skill-render.mjs +18 -0
  39. package/runtime/claude/bin/config-get.sh +10 -1
  40. package/runtime/claude/bin/connect-refresh.sh +16 -0
  41. package/runtime/claude/bin/corpus_map.py +5 -0
  42. package/runtime/claude/bin/data/capabilities/claude.json +1480 -0
  43. package/runtime/claude/bin/genui.sh +19 -0
  44. package/runtime/claude/bin/graph-batch.sh +1 -1
  45. package/runtime/claude/bin/graph-op.sh +14 -0
  46. package/runtime/claude/bin/graph.sh +1 -1
  47. package/runtime/claude/bin/handoff-pr-backfill.sh +1 -1
  48. package/runtime/claude/bin/handoff-run.sh +11 -6
  49. package/runtime/claude/bin/ingest-item.sh +1 -1
  50. package/runtime/claude/bin/ingest-surface.html +22 -4
  51. package/runtime/claude/bin/issue.sh +1 -1
  52. package/runtime/claude/bin/knowledge.sh +1 -1
  53. package/runtime/claude/bin/lib/card-delivery.sh +329 -0
  54. package/runtime/claude/bin/lib/config.sh +148 -3
  55. package/runtime/claude/bin/lib/context.sh +38 -67
  56. package/runtime/claude/bin/lib/genui-entry.py +36 -0
  57. package/runtime/claude/bin/lib/git-message.sh +25 -6
  58. package/runtime/claude/bin/lib/git-sync.sh +12 -4
  59. package/runtime/claude/bin/lib/greeting.sh +255 -28
  60. package/runtime/claude/bin/lib/handoff_meta.py +294 -0
  61. package/runtime/claude/bin/lib/health-footer.sh +83 -2
  62. package/runtime/claude/bin/lib/identity.sh +31 -10
  63. package/runtime/claude/bin/lib/instance-registry.sh +71 -0
  64. package/runtime/claude/bin/lib/local_ci_receipt.py +249 -0
  65. package/runtime/claude/bin/lib/metrics.sh +121 -8
  66. package/runtime/claude/bin/lib/notices.sh +36 -0
  67. package/runtime/claude/bin/lib/record_outcomes.py +729 -0
  68. package/runtime/claude/bin/lib/reflexes.py +267 -0
  69. package/runtime/claude/bin/lib/retrieval_scorecard.py +624 -0
  70. package/runtime/claude/bin/lib/session-record-prompt.txt +18 -0
  71. package/runtime/claude/bin/lib/session_record.py +3747 -0
  72. package/runtime/claude/bin/lib/session_trail.py +1983 -0
  73. package/runtime/claude/bin/lib/settings-drift.sh +8 -5
  74. package/runtime/claude/bin/lib/startup-restart.sh +41 -0
  75. package/runtime/claude/bin/lib/worktree-links.sh +92 -0
  76. package/runtime/claude/bin/memory-push.sh +6 -0
  77. package/runtime/claude/bin/merge-gate.sh +498 -0
  78. package/runtime/claude/bin/notify.sh +5 -2
  79. package/runtime/claude/bin/page-access.sh +103 -0
  80. package/runtime/claude/bin/person.sh +13 -2
  81. package/runtime/claude/bin/pi-render-spec.mjs +0 -1
  82. package/runtime/claude/bin/pi-spirit-discovery.mjs +34 -0
  83. package/runtime/claude/bin/post-update.sh +181 -0
  84. package/runtime/claude/bin/prime-render-spec.mjs +0 -1
  85. package/runtime/claude/bin/publish-artifact.sh +89 -42
  86. package/runtime/claude/bin/qa-inventory.sh +2 -2
  87. package/runtime/claude/bin/quest.sh +1 -1
  88. package/runtime/claude/bin/records.sh +11 -0
  89. package/runtime/claude/bin/reflexes/05-vitals.sh +9 -0
  90. package/runtime/claude/bin/reflexes/10-open-items.sh +12 -0
  91. package/runtime/claude/bin/reflexes/15-retrieval.sh +8 -0
  92. package/runtime/claude/bin/reflexes/20-nightly.sh +100 -0
  93. package/runtime/claude/bin/reflexes/20-sandbox.sh +85 -0
  94. package/runtime/claude/bin/reflexes/30-cost.py +116 -0
  95. package/runtime/claude/bin/reflexes/40-shells.py +51 -0
  96. package/runtime/claude/bin/reflexes/README.md +61 -0
  97. package/runtime/claude/bin/reflexes.sh +7 -0
  98. package/runtime/claude/bin/runtime-identity.sh +140 -42
  99. package/runtime/claude/bin/screenshot.sh +77 -0
  100. package/runtime/claude/bin/scroll.sh +1 -1
  101. package/runtime/claude/bin/search.sh +31 -5
  102. package/runtime/claude/bin/session-autosave.sh +6 -3
  103. package/runtime/claude/bin/session-id.sh +147 -0
  104. package/runtime/claude/bin/session-log.sh +19 -0
  105. package/runtime/claude/bin/session-record.sh +26 -0
  106. package/runtime/claude/bin/session-start.sh +121 -151
  107. package/runtime/claude/bin/settings.sh +13 -8
  108. package/runtime/claude/bin/spirit-discovery-claude.sh +4 -0
  109. package/runtime/claude/bin/spirit-discovery-codex.sh +4 -0
  110. package/runtime/claude/bin/spirit-discovery-pi.sh +4 -0
  111. package/runtime/claude/bin/spirit-discovery-prime.sh +4 -0
  112. package/runtime/claude/bin/spirit-discovery.sh +4 -0
  113. package/runtime/claude/bin/startup-check.sh +1 -1
  114. package/runtime/claude/bin/telemetry.sh +11 -4
  115. package/runtime/claude/bin/test-baseline.sh +33 -5
  116. package/runtime/claude/bin/todo.sh +1 -1
  117. package/runtime/claude/bin/worktree-create.sh +15 -45
  118. package/runtime/claude/bin/worktree.sh +6 -0
  119. package/runtime/claude/docs/spirit-discovery.md +96 -0
  120. package/runtime/claude/egregore_runtime/__init__.py +18 -12
  121. package/runtime/claude/egregore_runtime/access.py +608 -0
  122. package/runtime/claude/egregore_runtime/access_cli.py +190 -0
  123. package/runtime/claude/egregore_runtime/adapters/invitation.py +5 -3
  124. package/runtime/claude/egregore_runtime/adapters/qmd.py +521 -47
  125. package/runtime/claude/egregore_runtime/admin_entry.py +56 -0
  126. package/runtime/claude/egregore_runtime/artifacts.py +222 -16
  127. package/runtime/claude/egregore_runtime/contracts.py +27 -0
  128. package/runtime/claude/egregore_runtime/eligibility.py +5 -12
  129. package/runtime/claude/egregore_runtime/episode_binding.py +16 -5
  130. package/runtime/claude/egregore_runtime/github_issues.py +2 -2
  131. package/runtime/claude/egregore_runtime/handoff_lookup.py +9 -20
  132. package/runtime/claude/egregore_runtime/harness_cli.py +674 -149
  133. package/runtime/claude/egregore_runtime/held.py +2436 -0
  134. package/runtime/claude/egregore_runtime/hosted_api.py +137 -0
  135. package/runtime/claude/egregore_runtime/identity.py +196 -65
  136. package/runtime/claude/egregore_runtime/identity_transfer.py +6 -2
  137. package/runtime/claude/egregore_runtime/ingest_cli.py +2 -2
  138. package/runtime/claude/egregore_runtime/ingest_index_cli.py +4 -16
  139. package/runtime/claude/egregore_runtime/installation.py +119 -0
  140. package/runtime/claude/egregore_runtime/investigation.py +64 -41
  141. package/runtime/claude/egregore_runtime/investigation_guidance.py +16 -11
  142. package/runtime/claude/egregore_runtime/issue_cli.py +51 -32
  143. package/runtime/claude/egregore_runtime/issue_reporting.py +4 -3
  144. package/runtime/claude/egregore_runtime/issue_triage_service.py +2 -2
  145. package/runtime/claude/egregore_runtime/issues.py +12 -6
  146. package/runtime/claude/egregore_runtime/knowledge.py +331 -5
  147. package/runtime/claude/egregore_runtime/knowledge_cli.py +57 -17
  148. package/runtime/claude/egregore_runtime/lifecycle.py +88 -22
  149. package/runtime/claude/egregore_runtime/lifecycle_cli.py +21 -13
  150. package/runtime/claude/egregore_runtime/line_ids.py +10 -0
  151. package/runtime/claude/egregore_runtime/memory_push.py +349 -0
  152. package/runtime/claude/egregore_runtime/observe.py +64 -25
  153. package/runtime/claude/egregore_runtime/observers.py +19 -0
  154. package/runtime/claude/egregore_runtime/optional_modules.py +13 -0
  155. package/runtime/claude/egregore_runtime/outputs_cli.py +321 -0
  156. package/runtime/claude/egregore_runtime/policy.py +651 -24
  157. package/runtime/claude/egregore_runtime/private_result.py +2 -1
  158. package/runtime/claude/egregore_runtime/projection.py +946 -0
  159. package/runtime/claude/egregore_runtime/quest_cli.py +20 -23
  160. package/runtime/claude/egregore_runtime/question_cli.py +15 -11
  161. package/runtime/claude/egregore_runtime/questions.py +10 -10
  162. package/runtime/claude/egregore_runtime/quests.py +10 -10
  163. package/runtime/claude/egregore_runtime/record_publish.py +548 -0
  164. package/runtime/claude/egregore_runtime/record_subject.py +564 -0
  165. package/runtime/claude/egregore_runtime/research_ingest.py +2 -4
  166. package/runtime/claude/egregore_runtime/runtime.py +169 -60
  167. package/runtime/claude/egregore_runtime/sandbox.py +194 -0
  168. package/runtime/claude/egregore_runtime/scroll_cli.py +22 -32
  169. package/runtime/claude/egregore_runtime/scrolls.py +23 -15
  170. package/runtime/claude/egregore_runtime/shadow.py +262 -0
  171. package/runtime/claude/egregore_runtime/spirit_discovery.py +487 -0
  172. package/runtime/claude/egregore_runtime/spirit_discovery_cli.py +25 -0
  173. package/runtime/claude/egregore_runtime/spirit_discovery_transport.py +18 -0
  174. package/runtime/claude/egregore_runtime/status.py +101 -44
  175. package/runtime/claude/egregore_runtime/status_cli.py +13 -5
  176. package/runtime/claude/egregore_runtime/sync.py +39 -21
  177. package/runtime/claude/egregore_runtime/taste.py +934 -0
  178. package/runtime/claude/egregore_runtime/taste_cli.py +242 -0
  179. package/runtime/claude/egregore_runtime/taste_rules.py +91 -0
  180. package/runtime/claude/egregore_runtime/telemetry.py +26 -3
  181. package/runtime/claude/egregore_runtime/todo_cli.py +15 -12
  182. package/runtime/claude/egregore_runtime/todos.py +3 -2
  183. package/runtime/claude/egregore_runtime/upgrade.py +85 -58
  184. package/runtime/claude/egregore_runtime/writeback.py +330 -24
  185. package/runtime/claude/manifest.json +65 -5
  186. package/runtime/codex/.claude/context/handoff-claiming.md +32 -0
  187. package/runtime/codex/.claude/context/notification-consent.md +12 -9
  188. package/runtime/codex/.claude/skills/view/SKILL.md +438 -0
  189. package/runtime/codex/.codex/hooks.json +11 -0
  190. package/runtime/codex/.codex/skills/dark-mode/SKILL.md +1 -1
  191. package/runtime/codex/.codex/skills/records/SKILL.md +29 -0
  192. package/runtime/codex/.codex/skills/summon/SKILL.md +1 -1
  193. package/runtime/codex/.codex/skills/view/assets/compose-scaffold.html +19 -13
  194. package/runtime/codex/.codex/spec-manifest.json +13 -19
  195. package/runtime/codex/AGENTS.md +54 -105
  196. package/runtime/codex/bin/agent.sh +231 -7
  197. package/runtime/codex/bin/api-call.sh +44 -23
  198. package/runtime/codex/bin/artifact-register.sh +7 -1
  199. package/runtime/codex/bin/artifact-writeback.sh +1 -1
  200. package/runtime/codex/bin/artifacts.sh +66 -265
  201. package/runtime/codex/bin/attendant.sh +4 -1
  202. package/runtime/codex/bin/boundary-guard.cjs +1848 -0
  203. package/runtime/codex/bin/boundary-hook.sh +41 -0
  204. package/runtime/codex/bin/capture-run.sh +32 -2
  205. package/runtime/codex/bin/codex-render-spec.mjs +24 -46
  206. package/runtime/codex/bin/codex-session-start.sh +19 -0
  207. package/runtime/codex/bin/codex-skill-render.mjs +18 -0
  208. package/runtime/codex/bin/config-get.sh +10 -1
  209. package/runtime/codex/bin/connect-refresh.sh +16 -0
  210. package/runtime/codex/bin/corpus_map.py +5 -0
  211. package/runtime/codex/bin/data/capabilities/codex.json +1458 -0
  212. package/runtime/codex/bin/genui.sh +19 -0
  213. package/runtime/codex/bin/graph-batch.sh +1 -1
  214. package/runtime/codex/bin/graph-op.sh +14 -0
  215. package/runtime/codex/bin/graph.sh +1 -1
  216. package/runtime/codex/bin/handoff-pr-backfill.sh +1 -1
  217. package/runtime/codex/bin/handoff-run.sh +11 -6
  218. package/runtime/codex/bin/ingest-item.sh +1 -1
  219. package/runtime/codex/bin/ingest-surface.html +22 -4
  220. package/runtime/codex/bin/issue.sh +1 -1
  221. package/runtime/codex/bin/knowledge.sh +1 -1
  222. package/runtime/codex/bin/lib/card-delivery.sh +329 -0
  223. package/runtime/codex/bin/lib/config.sh +148 -3
  224. package/runtime/codex/bin/lib/context.sh +38 -67
  225. package/runtime/codex/bin/lib/genui-entry.py +36 -0
  226. package/runtime/codex/bin/lib/git-message.sh +25 -6
  227. package/runtime/codex/bin/lib/git-sync.sh +12 -4
  228. package/runtime/codex/bin/lib/greeting.sh +255 -28
  229. package/runtime/codex/bin/lib/handoff_meta.py +294 -0
  230. package/runtime/codex/bin/lib/health-footer.sh +83 -2
  231. package/runtime/codex/bin/lib/identity.sh +31 -10
  232. package/runtime/codex/bin/lib/instance-registry.sh +71 -0
  233. package/runtime/codex/bin/lib/local_ci_receipt.py +249 -0
  234. package/runtime/codex/bin/lib/metrics.sh +121 -8
  235. package/runtime/codex/bin/lib/notices.sh +36 -0
  236. package/runtime/codex/bin/lib/record_outcomes.py +729 -0
  237. package/runtime/codex/bin/lib/reflexes.py +267 -0
  238. package/runtime/codex/bin/lib/retrieval_scorecard.py +624 -0
  239. package/runtime/codex/bin/lib/session-record-prompt.txt +18 -0
  240. package/runtime/codex/bin/lib/session_record.py +3747 -0
  241. package/runtime/codex/bin/lib/session_trail.py +1983 -0
  242. package/runtime/codex/bin/lib/settings-drift.sh +8 -5
  243. package/runtime/codex/bin/lib/startup-restart.sh +41 -0
  244. package/runtime/codex/bin/lib/worktree-links.sh +92 -0
  245. package/runtime/codex/bin/memory-push.sh +6 -0
  246. package/runtime/codex/bin/merge-gate.sh +498 -0
  247. package/runtime/codex/bin/notify.sh +5 -2
  248. package/runtime/codex/bin/page-access.sh +103 -0
  249. package/runtime/codex/bin/person.sh +13 -2
  250. package/runtime/codex/bin/pi-render-spec.mjs +0 -1
  251. package/runtime/codex/bin/pi-spirit-discovery.mjs +34 -0
  252. package/runtime/codex/bin/post-update.sh +181 -0
  253. package/runtime/codex/bin/prime-render-spec.mjs +0 -1
  254. package/runtime/codex/bin/publish-artifact.sh +89 -42
  255. package/runtime/codex/bin/qa-inventory.sh +2 -2
  256. package/runtime/codex/bin/quest.sh +1 -1
  257. package/runtime/codex/bin/records.sh +11 -0
  258. package/runtime/codex/bin/reflexes/05-vitals.sh +9 -0
  259. package/runtime/codex/bin/reflexes/10-open-items.sh +12 -0
  260. package/runtime/codex/bin/reflexes/15-retrieval.sh +8 -0
  261. package/runtime/codex/bin/reflexes/20-nightly.sh +100 -0
  262. package/runtime/codex/bin/reflexes/20-sandbox.sh +85 -0
  263. package/runtime/codex/bin/reflexes/30-cost.py +116 -0
  264. package/runtime/codex/bin/reflexes/40-shells.py +51 -0
  265. package/runtime/codex/bin/reflexes/README.md +61 -0
  266. package/runtime/codex/bin/reflexes.sh +7 -0
  267. package/runtime/codex/bin/runtime-identity.sh +140 -42
  268. package/runtime/codex/bin/screenshot.sh +77 -0
  269. package/runtime/codex/bin/scroll.sh +1 -1
  270. package/runtime/codex/bin/search.sh +31 -5
  271. package/runtime/codex/bin/session-autosave.sh +6 -3
  272. package/runtime/codex/bin/session-id.sh +147 -0
  273. package/runtime/codex/bin/session-log.sh +19 -0
  274. package/runtime/codex/bin/session-record.sh +26 -0
  275. package/runtime/codex/bin/settings.sh +13 -8
  276. package/runtime/codex/bin/spirit-discovery-claude.sh +4 -0
  277. package/runtime/codex/bin/spirit-discovery-codex.sh +4 -0
  278. package/runtime/codex/bin/spirit-discovery-pi.sh +4 -0
  279. package/runtime/codex/bin/spirit-discovery-prime.sh +4 -0
  280. package/runtime/codex/bin/spirit-discovery.sh +4 -0
  281. package/runtime/codex/bin/startup-check.sh +1 -1
  282. package/runtime/codex/bin/telemetry.sh +11 -4
  283. package/runtime/codex/bin/test-baseline.sh +33 -5
  284. package/runtime/codex/bin/todo.sh +1 -1
  285. package/runtime/codex/bin/worktree-create.sh +15 -45
  286. package/runtime/codex/bin/worktree.sh +6 -0
  287. package/runtime/codex/docs/spirit-discovery.md +96 -0
  288. package/runtime/codex/egregore_runtime/__init__.py +18 -12
  289. package/runtime/codex/egregore_runtime/access.py +608 -0
  290. package/runtime/codex/egregore_runtime/access_cli.py +190 -0
  291. package/runtime/codex/egregore_runtime/adapters/invitation.py +5 -3
  292. package/runtime/codex/egregore_runtime/adapters/qmd.py +521 -47
  293. package/runtime/codex/egregore_runtime/admin_entry.py +56 -0
  294. package/runtime/codex/egregore_runtime/artifacts.py +222 -16
  295. package/runtime/codex/egregore_runtime/contracts.py +27 -0
  296. package/runtime/codex/egregore_runtime/eligibility.py +5 -12
  297. package/runtime/codex/egregore_runtime/episode_binding.py +16 -5
  298. package/runtime/codex/egregore_runtime/github_issues.py +2 -2
  299. package/runtime/codex/egregore_runtime/handoff_lookup.py +9 -20
  300. package/runtime/codex/egregore_runtime/harness_cli.py +674 -149
  301. package/runtime/codex/egregore_runtime/held.py +2436 -0
  302. package/runtime/codex/egregore_runtime/hosted_api.py +137 -0
  303. package/runtime/codex/egregore_runtime/identity.py +196 -65
  304. package/runtime/codex/egregore_runtime/identity_transfer.py +6 -2
  305. package/runtime/codex/egregore_runtime/ingest_cli.py +2 -2
  306. package/runtime/codex/egregore_runtime/ingest_index_cli.py +4 -16
  307. package/runtime/codex/egregore_runtime/installation.py +119 -0
  308. package/runtime/codex/egregore_runtime/investigation.py +64 -41
  309. package/runtime/codex/egregore_runtime/investigation_guidance.py +16 -11
  310. package/runtime/codex/egregore_runtime/issue_cli.py +51 -32
  311. package/runtime/codex/egregore_runtime/issue_reporting.py +4 -3
  312. package/runtime/codex/egregore_runtime/issue_triage_service.py +2 -2
  313. package/runtime/codex/egregore_runtime/issues.py +12 -6
  314. package/runtime/codex/egregore_runtime/knowledge.py +331 -5
  315. package/runtime/codex/egregore_runtime/knowledge_cli.py +57 -17
  316. package/runtime/codex/egregore_runtime/lifecycle.py +88 -22
  317. package/runtime/codex/egregore_runtime/lifecycle_cli.py +21 -13
  318. package/runtime/codex/egregore_runtime/line_ids.py +10 -0
  319. package/runtime/codex/egregore_runtime/memory_push.py +349 -0
  320. package/runtime/codex/egregore_runtime/observe.py +64 -25
  321. package/runtime/codex/egregore_runtime/observers.py +19 -0
  322. package/runtime/codex/egregore_runtime/optional_modules.py +13 -0
  323. package/runtime/codex/egregore_runtime/outputs_cli.py +321 -0
  324. package/runtime/codex/egregore_runtime/policy.py +651 -24
  325. package/runtime/codex/egregore_runtime/private_result.py +2 -1
  326. package/runtime/codex/egregore_runtime/projection.py +946 -0
  327. package/runtime/codex/egregore_runtime/quest_cli.py +20 -23
  328. package/runtime/codex/egregore_runtime/question_cli.py +15 -11
  329. package/runtime/codex/egregore_runtime/questions.py +10 -10
  330. package/runtime/codex/egregore_runtime/quests.py +10 -10
  331. package/runtime/codex/egregore_runtime/record_publish.py +548 -0
  332. package/runtime/codex/egregore_runtime/record_subject.py +564 -0
  333. package/runtime/codex/egregore_runtime/research_ingest.py +2 -4
  334. package/runtime/codex/egregore_runtime/runtime.py +169 -60
  335. package/runtime/codex/egregore_runtime/sandbox.py +194 -0
  336. package/runtime/codex/egregore_runtime/scroll_cli.py +22 -32
  337. package/runtime/codex/egregore_runtime/scrolls.py +23 -15
  338. package/runtime/codex/egregore_runtime/shadow.py +262 -0
  339. package/runtime/codex/egregore_runtime/spirit_discovery.py +487 -0
  340. package/runtime/codex/egregore_runtime/spirit_discovery_cli.py +25 -0
  341. package/runtime/codex/egregore_runtime/spirit_discovery_transport.py +18 -0
  342. package/runtime/codex/egregore_runtime/status.py +101 -44
  343. package/runtime/codex/egregore_runtime/status_cli.py +13 -5
  344. package/runtime/codex/egregore_runtime/sync.py +39 -21
  345. package/runtime/codex/egregore_runtime/taste.py +934 -0
  346. package/runtime/codex/egregore_runtime/taste_cli.py +242 -0
  347. package/runtime/codex/egregore_runtime/taste_rules.py +91 -0
  348. package/runtime/codex/egregore_runtime/telemetry.py +26 -3
  349. package/runtime/codex/egregore_runtime/todo_cli.py +15 -12
  350. package/runtime/codex/egregore_runtime/todos.py +3 -2
  351. package/runtime/codex/egregore_runtime/upgrade.py +85 -58
  352. package/runtime/codex/egregore_runtime/writeback.py +330 -24
  353. package/runtime/codex/manifest.json +66 -5
  354. package/runtime/pi/.claude/context/handoff-claiming.md +32 -0
  355. package/runtime/pi/.claude/context/notification-consent.md +12 -9
  356. package/runtime/pi/.claude/skills/view/SKILL.md +438 -0
  357. package/runtime/pi/.codex/hooks.json +11 -0
  358. package/runtime/pi/.codex/skills/dark-mode/SKILL.md +1 -1
  359. package/runtime/pi/.codex/skills/records/SKILL.md +29 -0
  360. package/runtime/pi/.codex/skills/summon/SKILL.md +1 -1
  361. package/runtime/pi/.codex/skills/view/assets/compose-scaffold.html +19 -13
  362. package/runtime/pi/.codex/spec-manifest.json +13 -19
  363. package/runtime/pi/.pi/APPEND_SYSTEM.md +53 -99
  364. package/runtime/pi/.pi/extensions/egregore.ts +13 -1
  365. package/runtime/pi/.pi/spec-manifest.json +2 -2
  366. package/runtime/pi/AGENTS.md +54 -105
  367. package/runtime/pi/bin/agent.sh +231 -7
  368. package/runtime/pi/bin/api-call.sh +44 -23
  369. package/runtime/pi/bin/artifact-register.sh +7 -1
  370. package/runtime/pi/bin/artifact-writeback.sh +1 -1
  371. package/runtime/pi/bin/artifacts.sh +66 -265
  372. package/runtime/pi/bin/attendant.sh +4 -1
  373. package/runtime/pi/bin/boundary-guard.cjs +1848 -0
  374. package/runtime/pi/bin/boundary-hook.sh +41 -0
  375. package/runtime/pi/bin/capture-run.sh +32 -2
  376. package/runtime/pi/bin/codex-render-spec.mjs +24 -46
  377. package/runtime/pi/bin/codex-session-start.sh +19 -0
  378. package/runtime/pi/bin/codex-skill-render.mjs +18 -0
  379. package/runtime/pi/bin/config-get.sh +10 -1
  380. package/runtime/pi/bin/connect-refresh.sh +16 -0
  381. package/runtime/pi/bin/corpus_map.py +5 -0
  382. package/runtime/pi/bin/data/capabilities/pi.json +1458 -0
  383. package/runtime/pi/bin/genui.sh +19 -0
  384. package/runtime/pi/bin/graph-batch.sh +1 -1
  385. package/runtime/pi/bin/graph-op.sh +14 -0
  386. package/runtime/pi/bin/graph.sh +1 -1
  387. package/runtime/pi/bin/handoff-pr-backfill.sh +1 -1
  388. package/runtime/pi/bin/handoff-run.sh +11 -6
  389. package/runtime/pi/bin/ingest-item.sh +1 -1
  390. package/runtime/pi/bin/ingest-surface.html +22 -4
  391. package/runtime/pi/bin/issue.sh +1 -1
  392. package/runtime/pi/bin/knowledge.sh +1 -1
  393. package/runtime/pi/bin/lib/card-delivery.sh +329 -0
  394. package/runtime/pi/bin/lib/config.sh +148 -3
  395. package/runtime/pi/bin/lib/context.sh +38 -67
  396. package/runtime/pi/bin/lib/genui-entry.py +36 -0
  397. package/runtime/pi/bin/lib/git-message.sh +25 -6
  398. package/runtime/pi/bin/lib/git-sync.sh +12 -4
  399. package/runtime/pi/bin/lib/greeting.sh +255 -28
  400. package/runtime/pi/bin/lib/handoff_meta.py +294 -0
  401. package/runtime/pi/bin/lib/health-footer.sh +83 -2
  402. package/runtime/pi/bin/lib/identity.sh +31 -10
  403. package/runtime/pi/bin/lib/instance-registry.sh +71 -0
  404. package/runtime/pi/bin/lib/local_ci_receipt.py +249 -0
  405. package/runtime/pi/bin/lib/metrics.sh +121 -8
  406. package/runtime/pi/bin/lib/notices.sh +36 -0
  407. package/runtime/pi/bin/lib/record_outcomes.py +729 -0
  408. package/runtime/pi/bin/lib/reflexes.py +267 -0
  409. package/runtime/pi/bin/lib/retrieval_scorecard.py +624 -0
  410. package/runtime/pi/bin/lib/session-record-prompt.txt +18 -0
  411. package/runtime/pi/bin/lib/session_record.py +3747 -0
  412. package/runtime/pi/bin/lib/session_trail.py +1983 -0
  413. package/runtime/pi/bin/lib/settings-drift.sh +8 -5
  414. package/runtime/pi/bin/lib/startup-restart.sh +41 -0
  415. package/runtime/pi/bin/lib/worktree-links.sh +92 -0
  416. package/runtime/pi/bin/memory-push.sh +6 -0
  417. package/runtime/pi/bin/merge-gate.sh +498 -0
  418. package/runtime/pi/bin/notify.sh +5 -2
  419. package/runtime/pi/bin/page-access.sh +103 -0
  420. package/runtime/pi/bin/person.sh +13 -2
  421. package/runtime/pi/bin/pi-branch-policy.mjs +37 -0
  422. package/runtime/pi/bin/pi-observe-context.mjs +97 -4
  423. package/runtime/pi/bin/pi-render-spec.mjs +0 -1
  424. package/runtime/pi/bin/pi-session-start.sh +4 -1
  425. package/runtime/pi/bin/pi-spirit-discovery.mjs +34 -0
  426. package/runtime/pi/bin/post-update.sh +181 -0
  427. package/runtime/pi/bin/prime-render-spec.mjs +0 -1
  428. package/runtime/pi/bin/publish-artifact.sh +89 -42
  429. package/runtime/pi/bin/qa-inventory.sh +2 -2
  430. package/runtime/pi/bin/quest.sh +1 -1
  431. package/runtime/pi/bin/records.sh +11 -0
  432. package/runtime/pi/bin/reflexes/05-vitals.sh +9 -0
  433. package/runtime/pi/bin/reflexes/10-open-items.sh +12 -0
  434. package/runtime/pi/bin/reflexes/15-retrieval.sh +8 -0
  435. package/runtime/pi/bin/reflexes/20-nightly.sh +100 -0
  436. package/runtime/pi/bin/reflexes/20-sandbox.sh +85 -0
  437. package/runtime/pi/bin/reflexes/30-cost.py +116 -0
  438. package/runtime/pi/bin/reflexes/40-shells.py +51 -0
  439. package/runtime/pi/bin/reflexes/README.md +61 -0
  440. package/runtime/pi/bin/reflexes.sh +7 -0
  441. package/runtime/pi/bin/runtime-identity.sh +140 -42
  442. package/runtime/pi/bin/screenshot.sh +77 -0
  443. package/runtime/pi/bin/scroll.sh +1 -1
  444. package/runtime/pi/bin/search.sh +31 -5
  445. package/runtime/pi/bin/session-autosave.sh +6 -3
  446. package/runtime/pi/bin/session-id.sh +147 -0
  447. package/runtime/pi/bin/session-log.sh +19 -0
  448. package/runtime/pi/bin/session-record.sh +26 -0
  449. package/runtime/pi/bin/settings.sh +13 -8
  450. package/runtime/pi/bin/spirit-discovery-claude.sh +4 -0
  451. package/runtime/pi/bin/spirit-discovery-codex.sh +4 -0
  452. package/runtime/pi/bin/spirit-discovery-pi.sh +4 -0
  453. package/runtime/pi/bin/spirit-discovery-prime.sh +4 -0
  454. package/runtime/pi/bin/spirit-discovery.sh +4 -0
  455. package/runtime/pi/bin/startup-check.sh +1 -1
  456. package/runtime/pi/bin/telemetry.sh +11 -4
  457. package/runtime/pi/bin/test-baseline.sh +33 -5
  458. package/runtime/pi/bin/todo.sh +1 -1
  459. package/runtime/pi/bin/worktree-create.sh +15 -45
  460. package/runtime/pi/bin/worktree.sh +6 -0
  461. package/runtime/pi/docs/spirit-discovery.md +96 -0
  462. package/runtime/pi/egregore_runtime/__init__.py +18 -12
  463. package/runtime/pi/egregore_runtime/access.py +608 -0
  464. package/runtime/pi/egregore_runtime/access_cli.py +190 -0
  465. package/runtime/pi/egregore_runtime/adapters/invitation.py +5 -3
  466. package/runtime/pi/egregore_runtime/adapters/qmd.py +521 -47
  467. package/runtime/pi/egregore_runtime/admin_entry.py +56 -0
  468. package/runtime/pi/egregore_runtime/artifacts.py +222 -16
  469. package/runtime/pi/egregore_runtime/contracts.py +27 -0
  470. package/runtime/pi/egregore_runtime/eligibility.py +5 -12
  471. package/runtime/pi/egregore_runtime/episode_binding.py +16 -5
  472. package/runtime/pi/egregore_runtime/github_issues.py +2 -2
  473. package/runtime/pi/egregore_runtime/handoff_lookup.py +9 -20
  474. package/runtime/pi/egregore_runtime/harness_cli.py +674 -149
  475. package/runtime/pi/egregore_runtime/held.py +2436 -0
  476. package/runtime/pi/egregore_runtime/hosted_api.py +137 -0
  477. package/runtime/pi/egregore_runtime/identity.py +196 -65
  478. package/runtime/pi/egregore_runtime/identity_transfer.py +6 -2
  479. package/runtime/pi/egregore_runtime/ingest_cli.py +2 -2
  480. package/runtime/pi/egregore_runtime/ingest_index_cli.py +4 -16
  481. package/runtime/pi/egregore_runtime/installation.py +119 -0
  482. package/runtime/pi/egregore_runtime/investigation.py +64 -41
  483. package/runtime/pi/egregore_runtime/investigation_guidance.py +16 -11
  484. package/runtime/pi/egregore_runtime/issue_cli.py +51 -32
  485. package/runtime/pi/egregore_runtime/issue_reporting.py +4 -3
  486. package/runtime/pi/egregore_runtime/issue_triage_service.py +2 -2
  487. package/runtime/pi/egregore_runtime/issues.py +12 -6
  488. package/runtime/pi/egregore_runtime/knowledge.py +331 -5
  489. package/runtime/pi/egregore_runtime/knowledge_cli.py +57 -17
  490. package/runtime/pi/egregore_runtime/lifecycle.py +88 -22
  491. package/runtime/pi/egregore_runtime/lifecycle_cli.py +21 -13
  492. package/runtime/pi/egregore_runtime/line_ids.py +10 -0
  493. package/runtime/pi/egregore_runtime/memory_push.py +349 -0
  494. package/runtime/pi/egregore_runtime/observe.py +64 -25
  495. package/runtime/pi/egregore_runtime/observers.py +19 -0
  496. package/runtime/pi/egregore_runtime/optional_modules.py +13 -0
  497. package/runtime/pi/egregore_runtime/outputs_cli.py +321 -0
  498. package/runtime/pi/egregore_runtime/policy.py +651 -24
  499. package/runtime/pi/egregore_runtime/private_result.py +2 -1
  500. package/runtime/pi/egregore_runtime/projection.py +946 -0
  501. package/runtime/pi/egregore_runtime/quest_cli.py +20 -23
  502. package/runtime/pi/egregore_runtime/question_cli.py +15 -11
  503. package/runtime/pi/egregore_runtime/questions.py +10 -10
  504. package/runtime/pi/egregore_runtime/quests.py +10 -10
  505. package/runtime/pi/egregore_runtime/record_publish.py +548 -0
  506. package/runtime/pi/egregore_runtime/record_subject.py +564 -0
  507. package/runtime/pi/egregore_runtime/research_ingest.py +2 -4
  508. package/runtime/pi/egregore_runtime/runtime.py +169 -60
  509. package/runtime/pi/egregore_runtime/sandbox.py +194 -0
  510. package/runtime/pi/egregore_runtime/scroll_cli.py +22 -32
  511. package/runtime/pi/egregore_runtime/scrolls.py +23 -15
  512. package/runtime/pi/egregore_runtime/shadow.py +262 -0
  513. package/runtime/pi/egregore_runtime/spirit_discovery.py +487 -0
  514. package/runtime/pi/egregore_runtime/spirit_discovery_cli.py +25 -0
  515. package/runtime/pi/egregore_runtime/spirit_discovery_transport.py +18 -0
  516. package/runtime/pi/egregore_runtime/status.py +101 -44
  517. package/runtime/pi/egregore_runtime/status_cli.py +13 -5
  518. package/runtime/pi/egregore_runtime/sync.py +39 -21
  519. package/runtime/pi/egregore_runtime/taste.py +934 -0
  520. package/runtime/pi/egregore_runtime/taste_cli.py +242 -0
  521. package/runtime/pi/egregore_runtime/taste_rules.py +91 -0
  522. package/runtime/pi/egregore_runtime/telemetry.py +26 -3
  523. package/runtime/pi/egregore_runtime/todo_cli.py +15 -12
  524. package/runtime/pi/egregore_runtime/todos.py +3 -2
  525. package/runtime/pi/egregore_runtime/upgrade.py +85 -58
  526. package/runtime/pi/egregore_runtime/writeback.py +330 -24
  527. package/runtime/pi/manifest.json +66 -5
  528. package/runtime/prime/.claude/context/handoff-claiming.md +32 -0
  529. package/runtime/prime/.claude/context/notification-consent.md +12 -9
  530. package/runtime/prime/.claude/skills/view/SKILL.md +438 -0
  531. package/runtime/prime/.codex/hooks.json +11 -0
  532. package/runtime/prime/.codex/skills/dark-mode/SKILL.md +1 -1
  533. package/runtime/prime/.codex/skills/records/SKILL.md +29 -0
  534. package/runtime/prime/.codex/skills/summon/SKILL.md +1 -1
  535. package/runtime/prime/.codex/skills/view/assets/compose-scaffold.html +19 -13
  536. package/runtime/prime/.codex/spec-manifest.json +13 -19
  537. package/runtime/prime/.prime/agent/APPEND_SYSTEM.md +53 -99
  538. package/runtime/prime/.prime/agent/extensions/egregore.ts +14 -1
  539. package/runtime/prime/.prime/agent/skills/egregore/SKILL.md +14 -6
  540. package/runtime/prime/.prime/agent/skills/egregore/src/egregore/__init__.py +66 -1
  541. package/runtime/prime/.prime/agent/spec-manifest.json +2 -2
  542. package/runtime/prime/AGENTS.md +54 -105
  543. package/runtime/prime/bin/agent.sh +231 -7
  544. package/runtime/prime/bin/api-call.sh +44 -23
  545. package/runtime/prime/bin/artifact-register.sh +7 -1
  546. package/runtime/prime/bin/artifact-writeback.sh +1 -1
  547. package/runtime/prime/bin/artifacts.sh +66 -265
  548. package/runtime/prime/bin/attendant.sh +4 -1
  549. package/runtime/prime/bin/boundary-guard.cjs +1848 -0
  550. package/runtime/prime/bin/boundary-hook.sh +41 -0
  551. package/runtime/prime/bin/capture-run.sh +32 -2
  552. package/runtime/prime/bin/codex-render-spec.mjs +24 -46
  553. package/runtime/prime/bin/codex-session-start.sh +19 -0
  554. package/runtime/prime/bin/codex-skill-render.mjs +18 -0
  555. package/runtime/prime/bin/config-get.sh +10 -1
  556. package/runtime/prime/bin/connect-refresh.sh +16 -0
  557. package/runtime/prime/bin/corpus_map.py +5 -0
  558. package/runtime/prime/bin/data/capabilities/prime.json +1458 -0
  559. package/runtime/prime/bin/genui.sh +19 -0
  560. package/runtime/prime/bin/graph-batch.sh +1 -1
  561. package/runtime/prime/bin/graph-op.sh +14 -0
  562. package/runtime/prime/bin/graph.sh +1 -1
  563. package/runtime/prime/bin/handoff-pr-backfill.sh +1 -1
  564. package/runtime/prime/bin/handoff-run.sh +11 -6
  565. package/runtime/prime/bin/ingest-item.sh +1 -1
  566. package/runtime/prime/bin/ingest-surface.html +22 -4
  567. package/runtime/prime/bin/issue.sh +1 -1
  568. package/runtime/prime/bin/knowledge.sh +1 -1
  569. package/runtime/prime/bin/lib/card-delivery.sh +329 -0
  570. package/runtime/prime/bin/lib/config.sh +148 -3
  571. package/runtime/prime/bin/lib/context.sh +38 -67
  572. package/runtime/prime/bin/lib/genui-entry.py +36 -0
  573. package/runtime/prime/bin/lib/git-message.sh +25 -6
  574. package/runtime/prime/bin/lib/git-sync.sh +12 -4
  575. package/runtime/prime/bin/lib/greeting.sh +255 -28
  576. package/runtime/prime/bin/lib/handoff_meta.py +294 -0
  577. package/runtime/prime/bin/lib/health-footer.sh +83 -2
  578. package/runtime/prime/bin/lib/identity.sh +31 -10
  579. package/runtime/prime/bin/lib/instance-registry.sh +71 -0
  580. package/runtime/prime/bin/lib/local_ci_receipt.py +249 -0
  581. package/runtime/prime/bin/lib/metrics.sh +121 -8
  582. package/runtime/prime/bin/lib/notices.sh +36 -0
  583. package/runtime/prime/bin/lib/record_outcomes.py +729 -0
  584. package/runtime/prime/bin/lib/reflexes.py +267 -0
  585. package/runtime/prime/bin/lib/retrieval_scorecard.py +624 -0
  586. package/runtime/prime/bin/lib/session-record-prompt.txt +18 -0
  587. package/runtime/prime/bin/lib/session_record.py +3747 -0
  588. package/runtime/prime/bin/lib/session_trail.py +1983 -0
  589. package/runtime/prime/bin/lib/settings-drift.sh +8 -5
  590. package/runtime/prime/bin/lib/startup-restart.sh +41 -0
  591. package/runtime/prime/bin/lib/worktree-links.sh +92 -0
  592. package/runtime/prime/bin/memory-push.sh +6 -0
  593. package/runtime/prime/bin/merge-gate.sh +498 -0
  594. package/runtime/prime/bin/notify.sh +5 -2
  595. package/runtime/prime/bin/page-access.sh +103 -0
  596. package/runtime/prime/bin/person.sh +13 -2
  597. package/runtime/prime/bin/pi-branch-policy.mjs +37 -0
  598. package/runtime/prime/bin/pi-observe-context.mjs +97 -4
  599. package/runtime/prime/bin/pi-render-spec.mjs +0 -1
  600. package/runtime/prime/bin/pi-spirit-discovery.mjs +34 -0
  601. package/runtime/prime/bin/post-update.sh +181 -0
  602. package/runtime/prime/bin/prime-render-spec.mjs +0 -1
  603. package/runtime/prime/bin/prime-session-start.sh +3 -1
  604. package/runtime/prime/bin/publish-artifact.sh +89 -42
  605. package/runtime/prime/bin/qa-inventory.sh +2 -2
  606. package/runtime/prime/bin/quest.sh +1 -1
  607. package/runtime/prime/bin/records.sh +11 -0
  608. package/runtime/prime/bin/reflexes/05-vitals.sh +9 -0
  609. package/runtime/prime/bin/reflexes/10-open-items.sh +12 -0
  610. package/runtime/prime/bin/reflexes/15-retrieval.sh +8 -0
  611. package/runtime/prime/bin/reflexes/20-nightly.sh +100 -0
  612. package/runtime/prime/bin/reflexes/20-sandbox.sh +85 -0
  613. package/runtime/prime/bin/reflexes/30-cost.py +116 -0
  614. package/runtime/prime/bin/reflexes/40-shells.py +51 -0
  615. package/runtime/prime/bin/reflexes/README.md +61 -0
  616. package/runtime/prime/bin/reflexes.sh +7 -0
  617. package/runtime/prime/bin/runtime-identity.sh +140 -42
  618. package/runtime/prime/bin/screenshot.sh +77 -0
  619. package/runtime/prime/bin/scroll.sh +1 -1
  620. package/runtime/prime/bin/search.sh +31 -5
  621. package/runtime/prime/bin/session-autosave.sh +6 -3
  622. package/runtime/prime/bin/session-id.sh +147 -0
  623. package/runtime/prime/bin/session-log.sh +19 -0
  624. package/runtime/prime/bin/session-record.sh +26 -0
  625. package/runtime/prime/bin/settings.sh +13 -8
  626. package/runtime/prime/bin/spirit-discovery-claude.sh +4 -0
  627. package/runtime/prime/bin/spirit-discovery-codex.sh +4 -0
  628. package/runtime/prime/bin/spirit-discovery-pi.sh +4 -0
  629. package/runtime/prime/bin/spirit-discovery-prime.sh +4 -0
  630. package/runtime/prime/bin/spirit-discovery.sh +4 -0
  631. package/runtime/prime/bin/startup-check.sh +1 -1
  632. package/runtime/prime/bin/telemetry.sh +11 -4
  633. package/runtime/prime/bin/test-baseline.sh +33 -5
  634. package/runtime/prime/bin/todo.sh +1 -1
  635. package/runtime/prime/bin/worktree-create.sh +15 -45
  636. package/runtime/prime/bin/worktree.sh +6 -0
  637. package/runtime/prime/docs/spirit-discovery.md +96 -0
  638. package/runtime/prime/egregore_runtime/__init__.py +18 -12
  639. package/runtime/prime/egregore_runtime/access.py +608 -0
  640. package/runtime/prime/egregore_runtime/access_cli.py +190 -0
  641. package/runtime/prime/egregore_runtime/adapters/invitation.py +5 -3
  642. package/runtime/prime/egregore_runtime/adapters/qmd.py +521 -47
  643. package/runtime/prime/egregore_runtime/admin_entry.py +56 -0
  644. package/runtime/prime/egregore_runtime/artifacts.py +222 -16
  645. package/runtime/prime/egregore_runtime/contracts.py +27 -0
  646. package/runtime/prime/egregore_runtime/eligibility.py +5 -12
  647. package/runtime/prime/egregore_runtime/episode_binding.py +16 -5
  648. package/runtime/prime/egregore_runtime/github_issues.py +2 -2
  649. package/runtime/prime/egregore_runtime/handoff_lookup.py +9 -20
  650. package/runtime/prime/egregore_runtime/harness_cli.py +674 -149
  651. package/runtime/prime/egregore_runtime/held.py +2436 -0
  652. package/runtime/prime/egregore_runtime/hosted_api.py +137 -0
  653. package/runtime/prime/egregore_runtime/identity.py +196 -65
  654. package/runtime/prime/egregore_runtime/identity_transfer.py +6 -2
  655. package/runtime/prime/egregore_runtime/ingest_cli.py +2 -2
  656. package/runtime/prime/egregore_runtime/ingest_index_cli.py +4 -16
  657. package/runtime/prime/egregore_runtime/installation.py +119 -0
  658. package/runtime/prime/egregore_runtime/investigation.py +64 -41
  659. package/runtime/prime/egregore_runtime/investigation_guidance.py +16 -11
  660. package/runtime/prime/egregore_runtime/issue_cli.py +51 -32
  661. package/runtime/prime/egregore_runtime/issue_reporting.py +4 -3
  662. package/runtime/prime/egregore_runtime/issue_triage_service.py +2 -2
  663. package/runtime/prime/egregore_runtime/issues.py +12 -6
  664. package/runtime/prime/egregore_runtime/knowledge.py +331 -5
  665. package/runtime/prime/egregore_runtime/knowledge_cli.py +57 -17
  666. package/runtime/prime/egregore_runtime/lifecycle.py +88 -22
  667. package/runtime/prime/egregore_runtime/lifecycle_cli.py +21 -13
  668. package/runtime/prime/egregore_runtime/line_ids.py +10 -0
  669. package/runtime/prime/egregore_runtime/memory_push.py +349 -0
  670. package/runtime/prime/egregore_runtime/observe.py +64 -25
  671. package/runtime/prime/egregore_runtime/observers.py +19 -0
  672. package/runtime/prime/egregore_runtime/optional_modules.py +13 -0
  673. package/runtime/prime/egregore_runtime/outputs_cli.py +321 -0
  674. package/runtime/prime/egregore_runtime/policy.py +651 -24
  675. package/runtime/prime/egregore_runtime/private_result.py +2 -1
  676. package/runtime/prime/egregore_runtime/projection.py +946 -0
  677. package/runtime/prime/egregore_runtime/quest_cli.py +20 -23
  678. package/runtime/prime/egregore_runtime/question_cli.py +15 -11
  679. package/runtime/prime/egregore_runtime/questions.py +10 -10
  680. package/runtime/prime/egregore_runtime/quests.py +10 -10
  681. package/runtime/prime/egregore_runtime/record_publish.py +548 -0
  682. package/runtime/prime/egregore_runtime/record_subject.py +564 -0
  683. package/runtime/prime/egregore_runtime/research_ingest.py +2 -4
  684. package/runtime/prime/egregore_runtime/runtime.py +169 -60
  685. package/runtime/prime/egregore_runtime/sandbox.py +194 -0
  686. package/runtime/prime/egregore_runtime/scroll_cli.py +22 -32
  687. package/runtime/prime/egregore_runtime/scrolls.py +23 -15
  688. package/runtime/prime/egregore_runtime/shadow.py +262 -0
  689. package/runtime/prime/egregore_runtime/spirit_discovery.py +487 -0
  690. package/runtime/prime/egregore_runtime/spirit_discovery_cli.py +25 -0
  691. package/runtime/prime/egregore_runtime/spirit_discovery_transport.py +18 -0
  692. package/runtime/prime/egregore_runtime/status.py +101 -44
  693. package/runtime/prime/egregore_runtime/status_cli.py +13 -5
  694. package/runtime/prime/egregore_runtime/sync.py +39 -21
  695. package/runtime/prime/egregore_runtime/taste.py +934 -0
  696. package/runtime/prime/egregore_runtime/taste_cli.py +242 -0
  697. package/runtime/prime/egregore_runtime/taste_rules.py +91 -0
  698. package/runtime/prime/egregore_runtime/telemetry.py +26 -3
  699. package/runtime/prime/egregore_runtime/todo_cli.py +15 -12
  700. package/runtime/prime/egregore_runtime/todos.py +3 -2
  701. package/runtime/prime/egregore_runtime/upgrade.py +85 -58
  702. package/runtime/prime/egregore_runtime/writeback.py +330 -24
  703. package/runtime/prime/manifest.json +66 -5
  704. package/runtime/claude/bin/thread.sh +0 -9
  705. package/runtime/claude/egregore_runtime/admin_gate.py +0 -102
  706. package/runtime/claude/egregore_runtime/thread_cli.py +0 -173
  707. package/runtime/claude/egregore_runtime/threads.py +0 -521
  708. package/runtime/codex/bin/thread.sh +0 -9
  709. package/runtime/codex/egregore_runtime/admin_gate.py +0 -102
  710. package/runtime/codex/egregore_runtime/thread_cli.py +0 -173
  711. package/runtime/codex/egregore_runtime/threads.py +0 -521
  712. package/runtime/pi/bin/thread.sh +0 -9
  713. package/runtime/pi/egregore_runtime/admin_gate.py +0 -102
  714. package/runtime/pi/egregore_runtime/thread_cli.py +0 -173
  715. package/runtime/pi/egregore_runtime/threads.py +0 -521
  716. package/runtime/prime/bin/thread.sh +0 -9
  717. package/runtime/prime/egregore_runtime/admin_gate.py +0 -102
  718. package/runtime/prime/egregore_runtime/thread_cli.py +0 -173
  719. package/runtime/prime/egregore_runtime/threads.py +0 -521
@@ -10,6 +10,7 @@
10
10
  # bash bin/search.sh start
11
11
  # bash bin/search.sh stop
12
12
  # bash bin/search.sh open memory/path/to/source.md
13
+ # bash bin/search.sh mind publish
13
14
  #
14
15
  # The shell owns the established user-facing output. Retrieval infrastructure
15
16
  # is isolated behind the Egregore Retriever adapter.
@@ -47,6 +48,28 @@ _elapsed_s() {
47
48
  awk -v ms="$(( $(_now_ms) - $1 ))" 'BEGIN { printf "%.1f", ms / 1000 }'
48
49
  }
49
50
 
51
+ # Run a Runtime operation as an OpenTelemetry span when the harness traces
52
+ # this process (it exports TRACEPARENT). Untraced calls take the plain path.
53
+ # Usage: _traced <span-name> <original-args-array-name> <command...>
54
+ _traced() {
55
+ local name="$1" argv_ref="$2[@]"; shift 2
56
+ if [ -z "${TRACEPARENT:-}" ]; then "$@"; return $?; fi
57
+ local start out rc results degraded stale
58
+ start=$(_now_ms)
59
+ out=$(mktemp "${TMPDIR:-/tmp}/egregore-span.XXXXXX")
60
+ "$@" | tee "$out"
61
+ rc=${PIPESTATUS[0]}
62
+ results=$(grep -cE '^[0-9]+\. ' "$out" 2>/dev/null)
63
+ degraded=false; grep -q 'Search degraded' "$out" 2>/dev/null && degraded=true
64
+ stale=$(sed -nE 's/^Note: ([0-9]+) eligible document.*/\1/p' "$out" 2>/dev/null | head -1)
65
+ rm -f "$out"
66
+ ( python3 "$SCRIPT_DIR/bin/lib/otel_span.py" --name "$name" --start-ms "$start" \
67
+ --end-ms "$(_now_ms)" --rc "$rc" --attr "egregore.search.results=${results:-0}" \
68
+ --attr "egregore.search.degraded=$degraded" --attr "egregore.search.stale_documents=${stale:-}" \
69
+ --argv -- ${!argv_ref+"${!argv_ref}"} >/dev/null 2>&1 & ) 2>/dev/null
70
+ return "$rc"
71
+ }
72
+
50
73
  _result_paths() {
51
74
  local line path canonical_prefix
52
75
  canonical_prefix="**file:** \`memory/"
@@ -71,7 +94,7 @@ _result_paths() {
71
94
  # calls there. The dormant graph configuration is preserved untouched for
72
95
  # rollback only.
73
96
  _upgrade_instance_key() {
74
- # Mirrors egregore_runtime.upgrade.instance_key: stable org identity
97
+ # Mirrors egregore_runtime.installation.installation_key: stable org identity
75
98
  # composed with the main installation path. No org_id → fail closed.
76
99
  local org main gitdir
77
100
  org=$(jq -r '.org_id // empty' "$SCRIPT_DIR/egregore.json" 2>/dev/null)
@@ -371,11 +394,12 @@ case "${1:-}" in
371
394
  for arg in "$@"; do
372
395
  if [ "$arg" = --context-packet ]; then FIND_ARGS+=(--private-result); else FIND_ARGS+=("$arg"); fi
373
396
  done
374
- _runtime find "${FIND_ARGS[@]}"
397
+ _traced egregore.search.find FIND_ARGS _runtime find "${FIND_ARGS[@]}"
375
398
  ;;
376
399
  investigate) shift; cmd_investigate "$@" ;;
377
400
  start) shift; _runtime start "$@" ;;
378
401
  stop) shift; _runtime stop "$@" ;;
402
+ mind) shift; _runtime mind "$@" ;;
379
403
  open)
380
404
  shift
381
405
  OPEN_PACKET=0; OPEN_PATHS=()
@@ -393,19 +417,21 @@ case "${1:-}" in
393
417
  [ "$OPEN_PACKET" = 1 ] && OPEN_BINDING+=(--private-result)
394
418
  # Older Bash treats an empty array as unset under nounset. Optional flags
395
419
  # must expand to zero arguments without requiring an explicit episode ID.
396
- _runtime open ${OPEN_PATHS[@]+"${OPEN_PATHS[@]}"} ${OPEN_BINDING[@]+"${OPEN_BINDING[@]}"}
420
+ OPEN_ARGS=(${OPEN_PATHS[@]+"${OPEN_PATHS[@]}"} ${OPEN_BINDING[@]+"${OPEN_BINDING[@]}"})
421
+ _traced egregore.search.open OPEN_ARGS _runtime open ${OPEN_ARGS[@]+"${OPEN_ARGS[@]}"}
397
422
  ;;
398
423
  help|-h|--help)
399
424
  cat <<'USAGE'
400
- usage: bash bin/search.sh {find|investigate|query|handoffs|reindex|install|start|stop|status|readiness|open}
425
+ usage: bash bin/search.sh {find|investigate|query|handoffs|reindex|install|start|stop|status|readiness|open|mind}
401
426
  find "terms" [--kind keyword|semantic|hybrid|filename|literal|dates] [--recent-days N]
402
427
  open memory/path.md [memory/other.md ...] [--offset N] [--length N]
403
428
  handoffs --mine --status open --order newest --limit 1 --open
404
429
  handoffs [--addressed-to NAME|--sent|--sent-by NAME] [--status STATUS] [--order newest|oldest] [--limit N] [--json]
430
+ mind publish
405
431
  USAGE
406
432
  ;;
407
433
  *)
408
- echo "usage: bash bin/search.sh {find|investigate|query|handoffs|reindex|install|start|stop|status|readiness|open}" >&2
434
+ echo "usage: bash bin/search.sh {find|investigate|query|handoffs|reindex|install|start|stop|status|readiness|open|mind}" >&2
409
435
  exit 1
410
436
  ;;
411
437
  esac
@@ -133,9 +133,12 @@ if git -C "$DIR/memory" rev-parse --git-dir >/dev/null 2>&1; then
133
133
  fi
134
134
  if [ -n "$(git -C "$DIR/memory" log origin/main..HEAD --oneline 2>/dev/null)" ]; then
135
135
  for _try in 1 2 3; do
136
- if git -C "$DIR/memory" pull --rebase origin main --quiet 2>/dev/null \
137
- && git -C "$DIR/memory" push origin main --quiet 2>/dev/null; then
138
- break
136
+ if git -C "$DIR/memory" pull --rebase origin main --quiet 2>/dev/null; then
137
+ if bash "$SCRIPT_ROOT/bin/memory-push.sh" --repository "$DIR/memory" --branch main >/dev/null 2>&1; then
138
+ break
139
+ else
140
+ case "$?" in 75) ;; *) break ;; esac
141
+ fi
139
142
  fi
140
143
  sleep 1
141
144
  done
@@ -0,0 +1,147 @@
1
+ #!/usr/bin/env bash
2
+ # session-id.sh — the calling harness session's own Egregore session id.
3
+ #
4
+ # Every session start mints an Egregore session id and writes it to the
5
+ # checkout's .egregore-session-id, which each worktree links to. With several
6
+ # sessions open on one machine, the latest start owns that file, so a commit
7
+ # that reads it can carry another session's Egregore-Session trailer. This
8
+ # script keeps one small map file per harness session and resolves the
9
+ # caller's own id from the native session id its harness exports.
10
+ #
11
+ # session-id.sh [--root DIR]
12
+ # Print the caller's Egregore session id; print nothing and exit 1
13
+ # when there is none. A native id in the environment whose map was
14
+ # recorded for DIR's repository wins; otherwise DIR/.egregore-session-id.
15
+ # session-id.sh record <harness> <native-id> <egregore-id> [--root DIR]
16
+ # Map a starting session (bin/lib/identity.sh), replacing an old map.
17
+ # session-id.sh bind <harness> <native-id> [--root DIR]
18
+ # Map a session first seen after its start (a Codex thread, at its
19
+ # first prompt) to the id it resolves to now. A map this repository
20
+ # can use is kept; one recorded for a moved checkout is replaced.
21
+ #
22
+ # Native ids, in order: EGREGORE_NATIVE_SESSION_ID under
23
+ # EGREGORE_NATIVE_HARNESS (Claude, Pi and Prime tool commands), then
24
+ # CLAUDE_CODE_SESSION_ID, then CODEX_THREAD_ID. A Codex worker started from a
25
+ # Claude or Pi shell inherits that shell's ids and so resolves to the session
26
+ # that started it.
27
+ #
28
+ # Map files: ~/.egregore/sessions/<harness>-<native-id>.id, two lines: the
29
+ # Egregore id and the repository's physical git common dir, so a map never
30
+ # applies to another repository (a test fixture, another instance). Names are
31
+ # checked, never rewritten. Each record prunes maps unused for 30 days; every
32
+ # resolve and bind that uses a map marks it used.
33
+ set -u
34
+ export LC_ALL=C
35
+
36
+ ROOT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
37
+ MAP_DIR=""
38
+ [ -z "${HOME:-}" ] || MAP_DIR="$HOME/.egregore/sessions"
39
+ SCOPE=""
40
+
41
+ usage() {
42
+ awk 'NR == 1 { next } /^#/ { sub(/^# ?/, ""); print; next } { exit }' "$0"
43
+ }
44
+
45
+ valid_harness() {
46
+ case "$1" in ''|*[!a-z0-9]*) return 1 ;; esac
47
+ [ "${#1}" -le 16 ]
48
+ }
49
+
50
+ valid_native() {
51
+ case "$1" in ''|.*|*[!A-Za-z0-9._-]*) return 1 ;; esac
52
+ [ "${#1}" -le 128 ]
53
+ }
54
+
55
+ valid_session() {
56
+ case "$1" in ''|*[[:cntrl:]]*) return 1 ;; esac
57
+ [ "${#1}" -le 200 ]
58
+ }
59
+
60
+ # The repository's git common dir, physical, so worktrees and every spelling
61
+ # of one checkout agree.
62
+ scope_of() {
63
+ local dir
64
+ dir="$(git -C "$1" rev-parse --git-common-dir 2>/dev/null)" || return 1
65
+ case "$dir" in /*) ;; *) dir="$1/$dir" ;; esac
66
+ (cd "$dir" 2>/dev/null && pwd -P)
67
+ }
68
+
69
+ # Print a map's Egregore id when the map belongs to this repository, and mark
70
+ # it used so the age prune spares a session that is still working.
71
+ lookup() {
72
+ local harness="$1" native="$2" file id="" scope=""
73
+ [ -n "$MAP_DIR" ] && valid_harness "$harness" && valid_native "$native" || return 1
74
+ file="$MAP_DIR/$harness-$native.id"
75
+ [ -f "$file" ] || return 1
76
+ { IFS= read -r id; IFS= read -r scope; } < "$file" 2>/dev/null
77
+ valid_session "$id" && [ -n "$scope" ] || return 1
78
+ [ -n "$SCOPE" ] || SCOPE="$(scope_of "$ROOT_DIR")" || return 1
79
+ [ "$scope" = "$SCOPE" ] || return 1
80
+ touch -c "$file" 2>/dev/null # -c: a map pruned meanwhile stays gone, never empty
81
+ printf '%s\n' "$id"
82
+ }
83
+
84
+ resolve() {
85
+ local id=""
86
+ if [ -n "${EGREGORE_NATIVE_SESSION_ID:-}" ] && [ -n "${EGREGORE_NATIVE_HARNESS:-}" ]; then
87
+ if lookup "$EGREGORE_NATIVE_HARNESS" "$EGREGORE_NATIVE_SESSION_ID"; then return 0; fi
88
+ fi
89
+ if [ -n "${CLAUDE_CODE_SESSION_ID:-}" ]; then
90
+ if lookup claude "$CLAUDE_CODE_SESSION_ID"; then return 0; fi
91
+ fi
92
+ if [ -n "${CODEX_THREAD_ID:-}" ]; then
93
+ if lookup codex "$CODEX_THREAD_ID"; then return 0; fi
94
+ fi
95
+ [ -f "$ROOT_DIR/.egregore-session-id" ] || return 1
96
+ IFS= read -r id < "$ROOT_DIR/.egregore-session-id" 2>/dev/null
97
+ valid_session "$id" || return 1
98
+ printf '%s\n' "$id"
99
+ }
100
+
101
+ record() {
102
+ local harness="$1" native="$2" id="$3" scope tmp
103
+ [ -n "$MAP_DIR" ] && valid_harness "$harness" && valid_native "$native" && valid_session "$id" || return 1
104
+ scope="$(scope_of "$ROOT_DIR")" && [ -n "$scope" ] || return 1
105
+ mkdir -p "$MAP_DIR" 2>/dev/null || return 1
106
+ tmp="$MAP_DIR/.$harness-$native.$$"
107
+ printf '%s\n%s\n' "$id" "$scope" > "$tmp" 2>/dev/null \
108
+ && mv -f "$tmp" "$MAP_DIR/$harness-$native.id" 2>/dev/null || { rm -f "$tmp"; return 1; }
109
+ find "$MAP_DIR" -maxdepth 1 -type f \( -name '*.id' -o -name '.*' \) -mtime +30 \
110
+ -exec rm -f {} + 2>/dev/null
111
+ return 0
112
+ }
113
+
114
+ bind() {
115
+ local harness="$1" native="$2" id
116
+ [ -n "$MAP_DIR" ] && valid_harness "$harness" && valid_native "$native" || return 1
117
+ # A map this repository can use is kept; one recorded for a checkout that
118
+ # has since moved is replaced rather than left unusable.
119
+ lookup "$harness" "$native" >/dev/null && return 0
120
+ id="$(resolve)" || return 1
121
+ record "$harness" "$native" "$id"
122
+ }
123
+
124
+ ARGS=()
125
+ while [ $# -gt 0 ]; do
126
+ case "$1" in
127
+ --root)
128
+ [ -n "${2:-}" ] || { echo "session-id.sh: --root needs a directory" >&2; exit 2; }
129
+ ROOT_DIR="$2"; shift 2 ;;
130
+ -h|--help) usage; exit 0 ;;
131
+ *) ARGS+=("$1"); shift ;;
132
+ esac
133
+ done
134
+ set -- ${ARGS[@]+"${ARGS[@]}"}
135
+
136
+ case "${1:-resolve}" in
137
+ resolve)
138
+ [ $# -le 1 ] || { usage >&2; exit 2; }
139
+ resolve ;;
140
+ record)
141
+ [ $# -eq 4 ] || { usage >&2; exit 2; }
142
+ record "$2" "$3" "$4" ;;
143
+ bind)
144
+ [ $# -eq 3 ] || { usage >&2; exit 2; }
145
+ bind "$2" "$3" ;;
146
+ *) usage >&2; exit 2 ;;
147
+ esac
@@ -21,6 +21,25 @@ INPUT=$(cat /dev/stdin 2>/dev/null || echo "{}")
21
21
  SESSION_ID=$(echo "$INPUT" | jq -r '.session_id // empty' 2>/dev/null || true)
22
22
  TRANSCRIPT_PATH=$(echo "$INPUT" | jq -r '.transcript_path // empty' 2>/dev/null || true)
23
23
 
24
+ # Route known native transcript locations before reading their contents.
25
+ RUNTIME=$(printf '%s' "$INPUT" | jq -r '.runtime // empty' 2>/dev/null || true)
26
+ RECORD_TRANSCRIPT=false
27
+ if [ -n "${HOME:-}" ]; then
28
+ if [[ "$TRANSCRIPT_PATH" == "$HOME/.claude/projects/"* ]] && \
29
+ printf '%s' "$INPUT" | jq -e 'has("hook_event_name")' >/dev/null 2>&1; then
30
+ RECORD_TRANSCRIPT=true
31
+ elif { [ "$RUNTIME" = pi ] && [[ "$TRANSCRIPT_PATH" == "$HOME/.pi/agent/sessions/"* ]]; } || \
32
+ { [ "$RUNTIME" = prime ] && [[ "$TRANSCRIPT_PATH" == "$HOME/.prime/agent/sessions/"* ]]; }; then
33
+ RECORD_TRANSCRIPT=true
34
+ fi
35
+ fi
36
+ if [ "$RECORD_TRANSCRIPT" = true ]; then
37
+ source "$SCRIPT_DIR/bin/lib/config.sh"
38
+ if _session_records_enabled; then
39
+ exec bash "$SCRIPT_DIR/bin/session-record.sh" --mode end <<< "$INPUT"
40
+ fi
41
+ fi
42
+
24
43
  if [ -z "$SESSION_ID" ]; then
25
44
  exit 0
26
45
  fi
@@ -0,0 +1,26 @@
1
+ #!/usr/bin/env bash
2
+ # Session-record admission is silent and detached for hooks. Python uses only
3
+ # the standard library. Summarizer flags (all checked against claude --help):
4
+ # Private trails, durable holds, stamps and locks live in $HOME/.egregore/trails.
5
+ # --tools "" --strict-mcp-config --mcp-config '{"mcpServers":{}}'
6
+ # --setting-sources "" --model MODEL --output-format text -p PROMPT
7
+ # Built-in tools, MCP servers, project settings, hooks and plugins are disabled,
8
+ # so the call is a single turn without a separate turn-limit flag.
9
+ # A CLI missing any isolation flag (including the empty --tools allowlist)
10
+ # is never invoked for a build; the record is deterministic instead.
11
+ # Checkpoints only write the record file in the memory working tree. Session
12
+ # end commits and pushes it with this person's earlier uncommitted records.
13
+ # --mode sweep always refreshes local counts in a detached worker. Publication
14
+ # requires an answered offer and enabled recording; only publication is
15
+ # debounced for six hours unless --force is supplied.
16
+ # Publications and hold markers use the same canonical memory lock; holds wait
17
+ # for an active publication, then redact going forward without rewriting history.
18
+ # The one thing a hook prints: at a checkpoint, the session's cost line, once
19
+ # per mark ($200 priced, or ten million Codex input tokens) at the next stop.
20
+ # Descriptor 3 carries the hook's stdout past the silenced streams for it.
21
+ set -uo pipefail
22
+ SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" || exit 0
23
+ command -v jq >/dev/null 2>&1 || exit 0
24
+ command -v python3 >/dev/null 2>&1 || exit 0
25
+ [ -n "${HOME:-}" ] || exit 0
26
+ exec python3 "$SCRIPT_DIR/bin/lib/session_record.py" record --root "$SCRIPT_DIR" --notice-fd 3 "$@" 3>&1 >/dev/null 2>&1
@@ -23,6 +23,8 @@ set -euo pipefail
23
23
 
24
24
  SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
25
25
  CONFIG="$SCRIPT_DIR/egregore.json"
26
+ # shellcheck source=bin/lib/config.sh
27
+ source "$SCRIPT_DIR/bin/lib/config.sh"
26
28
 
27
29
  # ── helpers ──────────────────────────────────────────────────────────────
28
30
 
@@ -54,7 +56,7 @@ _save() {
54
56
  # start's settings sync (bin/lib/settings-drift.sh).
55
57
  _control_plane_push() {
56
58
  local api_url api_key payload actor response revision
57
- api_url=$(jq -r '.api_url // empty' "$CONFIG" 2>/dev/null)
59
+ api_url=$(_config_api_url) || return 0
58
60
  [ -n "$api_url" ] || return 0
59
61
  api_key=$(grep '^EGREGORE_API_KEY=' "$SCRIPT_DIR/.env" 2>/dev/null | cut -d'=' -f2- || true)
60
62
  [ -n "$api_key" ] || return 0
@@ -70,10 +72,13 @@ _control_plane_push() {
70
72
  --data-binary "$payload" 2>/dev/null) || return 0
71
73
  revision=$(printf '%s' "$response" | jq -r '.settings_revision // empty' 2>/dev/null)
72
74
  if [ -n "$revision" ] && [ -f "$SCRIPT_DIR/.egregore-state.json" ]; then
73
- local st
74
- st="$(mktemp "$SCRIPT_DIR/.egregore-state.json.XXXXXX")" || return 0
75
- if jq --arg rev "$revision" '.org_settings_revision = $rev' "$SCRIPT_DIR/.egregore-state.json" > "$st" 2>/dev/null && [ -s "$st" ]; then
76
- mv "$st" "$SCRIPT_DIR/.egregore-state.json"
75
+ local st state_file
76
+ # A worktree links the checkout's state file: the rename lands on the
77
+ # file it points to, so the link stays and the installation keeps one state.
78
+ state_file="$(realpath "$SCRIPT_DIR/.egregore-state.json" 2>/dev/null)" || state_file="$SCRIPT_DIR/.egregore-state.json"
79
+ st="$(mktemp "$state_file.XXXXXX")" || return 0
80
+ if jq --arg rev "$revision" '.org_settings_revision = $rev' "$state_file" > "$st" 2>/dev/null && [ -s "$st" ]; then
81
+ mv "$st" "$state_file"
77
82
  else
78
83
  rm -f "$st"
79
84
  fi
@@ -394,7 +399,7 @@ _people_file() {
394
399
  fi
395
400
  ( cd "$SCRIPT_DIR/memory" 2>/dev/null && git add -A people/ 2>/dev/null \
396
401
  && git commit -q -m "chore(settings): $op $user in people" 2>/dev/null \
397
- && git push -q 2>/dev/null ) || true
402
+ && bash "$SCRIPT_DIR/bin/memory-push.sh" --repository "$SCRIPT_DIR/memory" --branch main >/dev/null 2>&1 ) || true
398
403
  }
399
404
 
400
405
  cmd_people() {
@@ -469,7 +474,7 @@ set -- "${_args[@]+"${_args[@]}"}"
469
474
  # ── privacy & access (read snapshot) ─────────────────────────────────────
470
475
  # One composed JSON for the Settings Privacy & access panel. Identity,
471
476
  # membership, and capability values come from the Runtime authorization
472
- # backend (access-status); this shell layer adds only committed boundary
477
+ # backend (access show --json); this shell layer adds only committed boundary
473
478
  # config, the personal boundary-local file, isolation state, and honest
474
479
  # constant statements. Never includes secrets, tokens, or internal paths.
475
480
 
@@ -499,7 +504,7 @@ cmd_privacy() {
499
504
  local access posture locked org_reads personal_reads denied digest graph
500
505
  access=$(cd "$SCRIPT_DIR" && EGREGORE_ROOT="$SCRIPT_DIR" \
501
506
  PYTHONSAFEPATH=1 PYTHONPATH="$SCRIPT_DIR${PYTHONPATH:+:$PYTHONPATH}" \
502
- python3 -m egregore_runtime.harness_cli access-status 2>/dev/null) || true
507
+ python3 -m egregore_runtime.harness_cli access show --json 2>/dev/null) || true
503
508
  printf '%s' "$access" | jq -e . >/dev/null 2>&1 || access='{"status":"attention"}'
504
509
  posture=$(jq -r '.boundary.posture // "standard"' "$CONFIG" 2>/dev/null || echo standard)
505
510
  locked=$(jq -r 'if (.boundary.locked // false) == true then "true" else "false" end' "$CONFIG" 2>/dev/null || echo false)
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env bash
2
+ set -eu
3
+ ROOT="$(cd "$(dirname "$0")/.." && pwd)"
4
+ PYTHONDONTWRITEBYTECODE=1 PYTHONSAFEPATH=1 PYTHONPATH="$ROOT" python3 -c 'from egregore_runtime.spirit_discovery_cli import main; raise SystemExit(main(runtime="claude"))' "$@"
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env bash
2
+ set -eu
3
+ ROOT="$(cd "$(dirname "$0")/.." && pwd)"
4
+ PYTHONDONTWRITEBYTECODE=1 PYTHONSAFEPATH=1 PYTHONPATH="$ROOT" python3 -c 'from egregore_runtime.spirit_discovery_cli import main; raise SystemExit(main(runtime="codex"))' "$@"
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env bash
2
+ set -eu
3
+ ROOT="$(cd "$(dirname "$0")/.." && pwd)"
4
+ PYTHONDONTWRITEBYTECODE=1 PYTHONSAFEPATH=1 PYTHONPATH="$ROOT" python3 -c 'from egregore_runtime.spirit_discovery_cli import main; raise SystemExit(main(runtime="pi"))' "$@"
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env bash
2
+ set -eu
3
+ ROOT="$(cd "$(dirname "$0")/.." && pwd)"
4
+ PYTHONDONTWRITEBYTECODE=1 PYTHONSAFEPATH=1 PYTHONPATH="$ROOT" python3 -c 'from egregore_runtime.spirit_discovery_cli import main; raise SystemExit(main(runtime="prime"))' "$@"
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env bash
2
+ set -eu
3
+ ROOT="$(cd "$(dirname "$0")/.." && pwd)"
4
+ PYTHONDONTWRITEBYTECODE=1 PYTHONSAFEPATH=1 PYTHONPATH="$ROOT" python3 -c 'from egregore_runtime.spirit_discovery_cli import main; raise SystemExit(main(runtime=None))' "$@"
@@ -13,7 +13,6 @@ STATE_FILE="$SCRIPT_DIR/.egregore-state.json"
13
13
  [ -f "$ENV_FILE" ] || exit 0
14
14
 
15
15
  # --- Read config ---
16
- API_URL=$(jq -r '.api_url // empty' "$CONFIG" 2>/dev/null)
17
16
  MODE=$(jq -r '.mode // "local"' "$CONFIG" 2>/dev/null)
18
17
  CONFIG_SLUG=$(jq -r '.slug // empty' "$CONFIG" 2>/dev/null)
19
18
  ORG_NAME=$(jq -r '.org_name // empty' "$CONFIG" 2>/dev/null)
@@ -21,6 +20,7 @@ GITHUB_ORG=$(jq -r '.github_org // empty' "$CONFIG" 2>/dev/null)
21
20
 
22
21
  # shellcheck source=bin/lib/config.sh
23
22
  source "$SCRIPT_DIR/bin/lib/config.sh"
23
+ API_URL=$(_config_api_url)
24
24
 
25
25
  # Runtime telemetry and diagnostics remain on-device by default. Historical
26
26
  # Connected health reporting is retained only as an explicit operator action;
@@ -7,6 +7,8 @@ set -euo pipefail
7
7
  umask 077
8
8
 
9
9
  SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
10
+ # shellcheck source=bin/lib/config.sh
11
+ source "$SCRIPT_DIR/bin/lib/config.sh"
10
12
  if [ -n "${EGREGORE_TELEMETRY_DIR:-}" ]; then
11
13
  BUFFER_DIR="$EGREGORE_TELEMETRY_DIR"
12
14
  else
@@ -516,12 +518,16 @@ cmd_export() {
516
518
  _resolve_share_target() {
517
519
  local requested_endpoint="$1"
518
520
  if [ -n "$requested_endpoint" ]; then
519
- printf '%s\n' "$requested_endpoint"
520
- return
521
+ # An explicit endpoint never gets the org key (cmd_share adds it only for
522
+ # the configured sink), so it needs the retired host mapped and nothing
523
+ # more; any other address goes to cmd_share's scheme check as typed.
524
+ _hosted_api_target "$requested_endpoint" 2>/dev/null || printf '%s\n' "$requested_endpoint"
525
+ return 0
521
526
  fi
522
527
  local api_url="" api_key=""
523
528
  if [ -f "$CONFIG" ]; then
524
- api_url=$(jq -r '.api_url // empty' "$CONFIG" 2>/dev/null || true)
529
+ # A refused saved address names no sink: never fall through to the relay.
530
+ api_url=$(_hosted_api_url "$(jq -r '.api_url // empty' "$CONFIG" 2>/dev/null || true)") || return 0
525
531
  fi
526
532
  if [ -f "$ENV_FILE" ]; then
527
533
  api_key=$(grep '^EGREGORE_API_KEY=' "$ENV_FILE" 2>/dev/null | cut -d'=' -f2- || true)
@@ -691,7 +697,8 @@ cmd_share() {
691
697
  : > "$share_file"
692
698
  fi
693
699
 
694
- local curl_args=(-s -o /dev/null -w '%{http_code}' -X POST "$endpoint"
700
+ # -q first (no ~/.curlrc), --globoff: the endpoint reaches the one host it names.
701
+ local curl_args=(-q --globoff -s -o /dev/null -w '%{http_code}' -X POST "$endpoint"
695
702
  -H "Content-Type: application/x-ndjson" --data-binary "@$share_file" --max-time 15)
696
703
  local api_key="" configured_endpoint=""
697
704
  configured_endpoint=$(_resolve_share_target "")
@@ -39,6 +39,9 @@ json=false
39
39
  head_first=false
40
40
  strict_head=false
41
41
  timeout=""
42
+ # A suite may declare a longer deadline than --timeout, up to 900 seconds,
43
+ # with a line "# test-baseline: timeout=N" in its first 30 lines.
44
+ child_limit=""
42
45
  selected=()
43
46
  add_suite() {
44
47
  local existing
@@ -147,8 +150,23 @@ run_dir=$(mktemp -d "${TMPDIR:-/tmp}/qa-baseline.XXXXXX") || error "cannot creat
147
150
  # Use the physical spelling consistently in Git, logs, and failure normalization.
148
151
  run_dir=$(cd -P "$run_dir" && pwd)
149
152
  mkdir -p "$run_dir/logs/base" "$run_dir/logs/head" || error "cannot create scratch logs"
150
- if ! git -C "$SCRIPT_DIR" worktree add --detach --quiet "$run_dir/base" "$base_oid" \
151
- > "$run_dir/worktree.out" 2> "$run_dir/worktree.err"; then
153
+ # A worktree another run is adding at the same moment can make Git read its
154
+ # half-written entry ("failed to read .git/worktrees/<name>/commondir"), so a
155
+ # failed add is tried again before it counts as an environment failure.
156
+ add_base_tree() {
157
+ local attempt
158
+ for attempt in 1 2 3; do
159
+ if git -C "$SCRIPT_DIR" worktree add --detach --quiet "$run_dir/base" "$base_oid" \
160
+ > "$run_dir/worktree.out" 2> "$run_dir/worktree.err"; then
161
+ return 0
162
+ fi
163
+ [ "$attempt" -lt 3 ] || return 1
164
+ git -C "$SCRIPT_DIR" worktree remove --force "$run_dir/base" >/dev/null 2>&1 || true
165
+ rm -rf "$run_dir/base"
166
+ sleep "$attempt"
167
+ done
168
+ }
169
+ if ! add_base_tree; then
152
170
  echo 'test-baseline: cannot create the base worktree:' >&2
153
171
  cat "$run_dir/worktree.err" >&2
154
172
  exit 2
@@ -169,13 +187,14 @@ run_child() {
169
187
  set -m
170
188
  (cd "$tree" && exec "$@") < /dev/null > "$log" 2>&1 &
171
189
  child_pid=$!
172
- if [ -n "$timeout" ]; then
190
+ local limit="${child_limit:-$timeout}"
191
+ if [ -n "$limit" ]; then
173
192
  watched_pid=$child_pid
174
193
  (
175
194
  # This watchdog owns a separate group, including its sleep process, so
176
195
  # normal completion and external interruption cancel the whole timer.
177
196
  set +m
178
- if ! sleep "$timeout"; then
197
+ if ! sleep "$limit"; then
179
198
  : > "$run_dir/timer-failed"
180
199
  fi
181
200
  if kill -0 -- "-$watched_pid" 2>/dev/null; then
@@ -270,6 +289,13 @@ for suite in "${selected[@]}"; do
270
289
  note=""
271
290
  status=""
272
291
  runner=""
292
+ suite_limit="$timeout"
293
+ if [ -n "$timeout" ] && [ -f "$SCRIPT_DIR/$suite" ]; then
294
+ declared=$(head -n 30 "$SCRIPT_DIR/$suite" | sed -n 's/^# test-baseline: timeout=\([1-9][0-9]*\)$/\1/p' | head -n 1)
295
+ if [ -n "$declared" ] && [ "$declared" -gt "$timeout" ]; then
296
+ suite_limit=$(( declared > 900 ? 900 : declared ))
297
+ fi
298
+ fi
273
299
  printf 'test-baseline: suite %s\n' "$suite" >&2
274
300
  case "$suite" in
275
301
  *.sh) runner=bash ;;
@@ -345,7 +371,9 @@ for suite in "${selected[@]}"; do
345
371
  bats) command_args=(bats) ;;
346
372
  esac
347
373
  printf 'test-baseline: %s %s starting\n' "$side" "$suite" >&2
374
+ child_limit="$suite_limit"
348
375
  run_child "$tree" "$run_dir/logs/$side/$log_name" "${command_args[@]}" "./$suite"
376
+ child_limit=""
349
377
  printf 'test-baseline: %s %s exit=%s seconds=%s timed_out=%s\n' \
350
378
  "$side" "$suite" "$run_exit" "$run_seconds" "$run_timed_out" >&2
351
379
  failure_lines "$run_dir/logs/$side/$log_name" "$run_dir/$side.lines"
@@ -355,7 +383,7 @@ for suite in "${selected[@]}"; do
355
383
  head_exit=$run_exit; head_seconds=$run_seconds; head_timed_out=$run_timed_out
356
384
  fi
357
385
  if $run_timed_out; then
358
- status=blocked; note="$side timed out after ${timeout}s"; break
386
+ status=blocked; note="$side timed out after ${suite_limit}s"; break
359
387
  fi
360
388
  if $head_first && [ "$side" = head ] && [ "$head_exit" -eq 0 ]; then break; fi
361
389
  done
@@ -3,7 +3,7 @@ set -euo pipefail
3
3
 
4
4
  ROOT="$(cd "$(dirname "$0")/.." && pwd)"
5
5
  export EGREGORE_ROOT="$ROOT"
6
- export EGREGORE_SESSION_ID="${EGREGORE_SESSION_ID:-$(cat "$ROOT/.egregore-session-id" 2>/dev/null || true)}"
6
+ export EGREGORE_SESSION_ID="${EGREGORE_SESSION_ID:-$(bash "$ROOT/bin/session-id.sh" --root "$ROOT" 2>/dev/null || cat "$ROOT/.egregore-session-id" 2>/dev/null || true)}"
7
7
  export PYTHONSAFEPATH=1 PYTHONPATH="$ROOT${PYTHONPATH:+:$PYTHONPATH}"
8
8
 
9
9
  exec python3 -m egregore_runtime.todo_cli "$@"
@@ -94,52 +94,22 @@ fi
94
94
  # egregore.json
95
95
  [ -f "$REPO_ROOT/egregore.json" ] && [ ! -f "$WT_PATH/egregore.json" ] && ln -sfn "$REPO_ROOT/egregore.json" "$WT_PATH/egregore.json"
96
96
 
97
+ # Installed tools (node_modules, .egregore/tools), so tests and the renderer
98
+ # run without an install step. Same helper as worktree.sh setup, loaded from
99
+ # this script's own bin/. Its one diagnostic, a link git cannot be made to
100
+ # ignore, goes to stderr, keeping stdout the worktree path only.
101
+ # shellcheck source=bin/lib/worktree-links.sh
102
+ source "$(dirname "${BASH_SOURCE[0]}")/lib/worktree-links.sh" && egregore_link_tools "$WT_PATH" "$REPO_ROOT" >&2
103
+
97
104
  # --- Compute boundary for worktree (so isolation hook works) ---
98
- # session-start.sh doesn't re-run for worktrees, so we compute it here.
99
- HASH=$(echo -n "$WT_PATH" | md5 2>/dev/null || echo -n "$WT_PATH" | md5sum 2>/dev/null | cut -d' ' -f1)
100
- BOUNDARY_FILE="/tmp/egregore-boundary-${HASH}.json"
101
- MEMORY_DIR=""
102
- [ -L "$WT_PATH/memory" ] && MEMORY_DIR=$(realpath "$WT_PATH/memory" 2>/dev/null || true)
103
- # Managed repos: include main repo (worktree symlinks resolve there) + sibling repos
104
- MANAGED_REPOS_JSON="[\"$REPO_ROOT\""
105
- PARENT_DIR="$(dirname "$REPO_ROOT")"
106
- _repos=$(jq -r '(.repos[]? // empty) | if type == "object" then .name else . end' "$WT_PATH/egregore.json" 2>/dev/null || true)
107
- for _r in $_repos; do
108
- [[ "$_r" == *".."* ]] && continue
109
- _resolved=$(realpath "$PARENT_DIR/$_r" 2>/dev/null || true)
110
- [ -z "$_resolved" ] && continue
111
- MANAGED_REPOS_JSON="$MANAGED_REPOS_JSON,\"$_resolved\""
112
- done
113
- MANAGED_REPOS_JSON="$MANAGED_REPOS_JSON]"
114
- # Denied paths: shared computation (bin/boundary.sh compute-denied). The main
115
- # repo is passed as the caller-proven same-instance allowance — this worktree
116
- # was just created from it and physically shares its git dir — so it stays
117
- # excluded even on legacy registries whose entries carry no org_id yet.
118
- DENIED_JSON="[]"
119
- REGISTRY="$HOME/.egregore/instances.json"
120
- if [ -f "$REGISTRY" ]; then
121
- WT_ORG=$(jq -r '.org_id // empty' "$WT_PATH/egregore.json" 2>/dev/null || true)
122
- DENIED_JSON=$(bash "$REPO_ROOT/bin/boundary.sh" compute-denied \
123
- "$REGISTRY" "$WT_PATH" "$WT_ORG" "$REPO_ROOT" 2>/dev/null || echo "[]")
124
- case "$DENIED_JSON" in "["*) ;; *) DENIED_JSON="[]" ;; esac
125
- fi
126
- # Inherit posture, locked, and read roots from the main checkout's boundary
127
- # cache: a worktree that silently dropped them fell back to `standard` and
128
- # stopped honoring `locked: true` (found in the 6b.3 enforcement audit).
129
- MAIN_DIGEST=$(printf '%s' "$REPO_ROOT" | md5 2>/dev/null || printf '%s' "$REPO_ROOT" | md5sum | cut -d' ' -f1)
130
- MAIN_BOUNDARY="/tmp/egregore-boundary-${MAIN_DIGEST}.json"
131
- POSTURE_JSON='{}'
132
- if [ -f "$MAIN_BOUNDARY" ]; then
133
- POSTURE_JSON=$(jq -c '{posture: (.posture // "standard"), locked: (.locked // false), read_roots: (.read_roots // [])}' "$MAIN_BOUNDARY" 2>/dev/null || echo '{}')
134
- fi
135
- jq -n \
136
- --arg project_dir "$WT_PATH" \
137
- --arg memory_dir "$MEMORY_DIR" \
138
- --argjson managed_repos "$MANAGED_REPOS_JSON" \
139
- --argjson denied_paths "$DENIED_JSON" \
140
- --argjson inherited "$POSTURE_JSON" \
141
- '{project_dir: $project_dir, memory_dir: $memory_dir, managed_repos: $managed_repos, denied_paths: $denied_paths} + $inherited' \
142
- > "$BOUNDARY_FILE.tmp" 2>/dev/null && mv "$BOUNDARY_FILE.tmp" "$BOUNDARY_FILE" 2>/dev/null || true
105
+ # session-start.sh doesn't re-run for worktrees, so we compute it here through
106
+ # the shared computation (bin/boundary-guard.cjs write-cache). It recognizes a
107
+ # linked worktree: the main checkout it physically shares a git dir with is the
108
+ # caller-proven same instance (excluded from denied paths even on legacy
109
+ # registries without org_id) and a managed repo, and posture, lock and read
110
+ # roots come from the main checkout's config — a worktree that dropped them
111
+ # fell back to `standard` and stopped honoring `locked: true` (6b.3 audit).
112
+ bash "$REPO_ROOT/bin/node-run.sh" "$REPO_ROOT/bin/boundary-guard.cjs" write-cache "$WT_PATH" >/dev/null 2>&1 || true
143
113
 
144
114
  # --- Session topic on the graph (fire-and-forget, detached) ---
145
115
  # CLAUDE.md used to ask the model to run this after EnterWorktree with a
@@ -57,6 +57,12 @@ case "$CMD" in
57
57
  ln -sfn "$MAIN_DIR/egregore.json" "$WT_PATH/egregore.json"
58
58
  fi
59
59
 
60
+ # Installed tools (node_modules, .egregore/tools), through the same helper
61
+ # as the WorktreeCreate hook; a link git cannot be made to ignore is
62
+ # reported on stderr.
63
+ # shellcheck source=bin/lib/worktree-links.sh
64
+ source "$(dirname "${BASH_SOURCE[0]}")/lib/worktree-links.sh" && egregore_link_tools "$WT_PATH" "$MAIN_DIR"
65
+
60
66
  # Find terminal TTY for statusline matching
61
67
  _pid=$$
62
68
  _tty=""