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
@@ -0,0 +1,41 @@
1
+ #!/usr/bin/env bash
2
+ # boundary-hook.sh — runtime-neutral PreToolUse entry for the instance wall.
3
+ # Usage: boundary-hook.sh claude|codex (hook JSON on stdin)
4
+ # Claude Code reaches it through .claude/hooks/boundary-check.sh, Codex
5
+ # through .codex/hooks.json. The policy lives in bin/boundary-guard.cjs; this
6
+ # file only starts it and keeps the exit contract: 0 allows, 2 blocks with the
7
+ # reason on stderr. A hook host treats any other status as a non-blocking
8
+ # error, so every failure to start or finish the check becomes a denial here.
9
+
10
+ deny() {
11
+ echo "Environment isolation: the boundary check could not run ($1), so this action is blocked. Ask the user to install Node 22 or run /update, then restart the session." >&2
12
+ exit 2
13
+ }
14
+
15
+ missing() {
16
+ echo "Environment isolation: boundary guard missing ($1) — run /update, then restart the session. Every action is blocked until the guard is back." >&2
17
+ exit 2
18
+ }
19
+
20
+ BIN_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" || deny "its directory cannot be resolved"
21
+ ROOT="$(dirname "$BIN_DIR")"
22
+ GUARD="$BIN_DIR/boundary-guard.cjs"
23
+ case "${1:-claude}" in
24
+ codex) PROJECT_DIR="${EGREGORE_CODEX_PROJECT_DIR:-$ROOT}" ;;
25
+ *) PROJECT_DIR="${CLAUDE_PROJECT_DIR:-$ROOT}" ;;
26
+ esac
27
+ [ -f "$GUARD" ] || missing "bin/boundary-guard.cjs"
28
+
29
+ NODE_BIN="$(command -v node 2>/dev/null || true)"
30
+ if [ -z "$NODE_BIN" ] && [ -f "$BIN_DIR/node-run.sh" ]; then
31
+ NODE_BIN="$(bash "$BIN_DIR/node-run.sh" -e 'process.stdout.write(process.execPath)' 2>/dev/null || true)"
32
+ fi
33
+ [ -n "$NODE_BIN" ] || deny "Node is missing"
34
+
35
+ # The check runs with no inherited Node options: a preload cannot replace it.
36
+ env -u NODE_OPTIONS "$NODE_BIN" "$GUARD" --project-dir "$PROJECT_DIR"
37
+ status=$?
38
+ case "$status" in
39
+ 0|2) exit "$status" ;;
40
+ *) deny "it exited with status $status" ;;
41
+ esac
@@ -23,41 +23,17 @@ if [[ "${1:-}" == "--help" || "${1:-}" == "-h" ]]; then
23
23
  fi
24
24
 
25
25
  SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
26
-
27
- # --- Load boundary file ---
28
- # Boundary file is written by session-start.sh at /tmp/egregore-boundary-{hash}.json
29
- # Hash is md5 of the project directory path for uniqueness
30
- load_boundary() {
31
- local hash
32
- hash=$(echo -n "$SCRIPT_DIR" | md5 2>/dev/null || echo -n "$SCRIPT_DIR" | md5sum 2>/dev/null | cut -d' ' -f1)
33
- BOUNDARY_FILE="/tmp/egregore-boundary-${hash}.json"
34
-
35
- if [ ! -f "$BOUNDARY_FILE" ]; then
36
- # No boundary file — fall back to project dir only
37
- PROJECT_DIR="$SCRIPT_DIR"
38
- MEMORY_DIR=""
39
- MANAGED_REPOS=""
40
- DENIED_PATHS=""
41
- return
42
- fi
43
-
44
- PROJECT_DIR=$(jq -r '.project_dir // empty' "$BOUNDARY_FILE" 2>/dev/null)
45
- MEMORY_DIR=$(jq -r '.memory_dir // empty' "$BOUNDARY_FILE" 2>/dev/null)
46
- MANAGED_REPOS=$(jq -r '.managed_repos[]? // empty' "$BOUNDARY_FILE" 2>/dev/null)
47
- DENIED_PATHS=$(jq -r '.denied_paths[]? // empty' "$BOUNDARY_FILE" 2>/dev/null)
48
- }
49
-
50
- # --- Resolve path to absolute ---
51
- resolve_path() {
52
- local path="$1"
53
- # Expand ~ to $HOME
54
- path="${path/#\~/$HOME}"
55
- # Resolve to absolute
56
- if [[ "$path" != /* ]]; then
57
- path="$SCRIPT_DIR/$path"
26
+ # The isolation policy (boundary cache, instance identity, core boundary, hard
27
+ # tier) has one implementation, shared by every runtime's pre-action check:
28
+ # bin/boundary-guard.cjs. `check` and `compute-denied` delegate to it.
29
+ GUARD="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/boundary-guard.cjs"
30
+
31
+ guard() {
32
+ if [ ! -f "$GUARD" ]; then
33
+ echo "boundary.sh: $GUARD is missing" >&2
34
+ return 1
58
35
  fi
59
- # Resolve symlinks and ../ components
60
- realpath "$path" 2>/dev/null || echo "$path"
36
+ bash "$(dirname "$GUARD")/node-run.sh" "$GUARD" "$@"
61
37
  }
62
38
 
63
39
  # --- Check if path is within an allowed directory ---
@@ -67,91 +43,6 @@ path_starts_with() {
67
43
  [[ "$path" == "$prefix" || "$path" == "$prefix/"* ]]
68
44
  }
69
45
 
70
- # --- Is a resolved path covered by a denied entry? ---
71
- # Self-scope carve-out, per entry: an ENCLOSING denied checkout (different or
72
- # unproven organization identity) never covers the project's own files — the
73
- # enclosing tree stays denied while the project stays usable. A denied entry
74
- # nested INSIDE the project is still enforced: residence under the project
75
- # proves nothing about identity.
76
- denied_covers() {
77
- local resolved="$1" denied
78
- local in_project=1
79
- if [ -n "${PROJECT_DIR:-}" ] && path_starts_with "$resolved" "$PROJECT_DIR"; then
80
- in_project=0
81
- fi
82
- for denied in $DENIED_PATHS; do
83
- if path_starts_with "$resolved" "$denied"; then
84
- if [ "$in_project" = "0" ] && path_starts_with "$PROJECT_DIR" "$denied"; then
85
- continue
86
- fi
87
- echo "$denied"
88
- return 0
89
- fi
90
- done
91
- return 1
92
- }
93
-
94
- # --- MODE: check <path> ---
95
- check_path() {
96
- local target="$1"
97
- local resolved
98
- resolved=$(resolve_path "$target")
99
-
100
- load_boundary
101
-
102
- # Always-allowed system paths
103
- if path_starts_with "$resolved" "/tmp"; then return 0; fi
104
- if path_starts_with "$resolved" "$HOME/.claude"; then return 0; fi
105
- if path_starts_with "$resolved" "/usr"; then return 0; fi
106
- if path_starts_with "$resolved" "/etc"; then return 0; fi
107
- if path_starts_with "$resolved" "/var"; then return 0; fi
108
- if path_starts_with "$resolved" "/bin"; then return 0; fi
109
- if path_starts_with "$resolved" "/sbin"; then return 0; fi
110
- if path_starts_with "$resolved" "/opt"; then return 0; fi
111
-
112
- # Explicitly denied paths (other instances) — per-entry self-scope carve-out
113
- local covering
114
- if covering=$(denied_covers "$resolved"); then
115
- echo "BLOCKED: $resolved is inside another Egregore instance ($covering)"
116
- return 1
117
- fi
118
-
119
- # Allow instance registry (read-only, needed for multi-instance features)
120
- if path_starts_with "$resolved" "$HOME/.egregore"; then
121
- return 0
122
- fi
123
-
124
- # Allowed: project directory
125
- if [ -n "$PROJECT_DIR" ] && path_starts_with "$resolved" "$PROJECT_DIR"; then
126
- return 0
127
- fi
128
-
129
- # Allowed: memory directory (resolved symlink target)
130
- if [ -n "$MEMORY_DIR" ] && path_starts_with "$resolved" "$MEMORY_DIR"; then
131
- return 0
132
- fi
133
-
134
- # Allowed: managed repos
135
- for repo_path in $MANAGED_REPOS; do
136
- if path_starts_with "$resolved" "$repo_path"; then
137
- return 0
138
- fi
139
- done
140
-
141
- # Allowed: parent directory (for sibling repo operations like git clone)
142
- local parent_dir
143
- parent_dir="$(dirname "$PROJECT_DIR")"
144
- if path_starts_with "$resolved" "$parent_dir"; then
145
- # But NOT if it resolves into a denied path (denied_covers already ran
146
- # above and returns first, so reaching here means no covering entry)
147
- return 0
148
- fi
149
-
150
- # Default: block
151
- echo "BLOCKED: $resolved is outside the session boundary"
152
- return 1
153
- }
154
-
155
46
  # --- MODE: validate-repos ---
156
47
  validate_repos() {
157
48
  local config="$SCRIPT_DIR/egregore.json"
@@ -193,40 +84,6 @@ validate_repos() {
193
84
  return $exit_code
194
85
  }
195
86
 
196
- # --- MODE: compute-denied <registry> <project_dir> [org_id] [allow_path] ---
197
- # Emits the denied_paths JSON array for a session boundary: every registered
198
- # instance not proven to share this project's identity. An entry is excluded
199
- # only when one of these proofs holds:
200
- # - it IS the project (.path == project_dir)
201
- # - caller-proven same instance: .path == allow_path, passed only when the
202
- # caller holds a stronger proof (worktree-create passes the enclosing repo
203
- # whose git dir this worktree physically shares)
204
- # - registry-proven same organization: both the project's org_id and the
205
- # entry's org_id are present and equal
206
- # No path relationship proves identity: not ancestry, not residence under the
207
- # project's own .claude/worktrees (legitimate task worktrees are covered by
208
- # matching org_id or the caller-proven allowance), and a slug is presentation,
209
- # not identity. Entries with a different or missing org_id stay denied (fail
210
- # closed) — the enforcement layers' self-scope carve-out keeps a nested
211
- # project usable while its unproven enclosing tree stays denied, and a denied
212
- # entry nested inside the project is still enforced.
213
- compute_denied() {
214
- local registry="$1" project_dir="$2" org_id="${3:-}" allow_path="${4:-}"
215
- if [ ! -f "$registry" ]; then
216
- echo "[]"
217
- return 0
218
- fi
219
- jq --arg self "$project_dir" \
220
- --arg org "$org_id" \
221
- --arg allow "$allow_path" \
222
- '[.[]
223
- | select(.path != $self)
224
- | select(if $allow == "" then true else (.path != $allow) end)
225
- | select(if $org == "" then true else ((.org_id // "") != $org) end)
226
- | .path]' \
227
- "$registry" 2>/dev/null || echo "[]"
228
- }
229
-
230
87
  # --- Main ---
231
88
  case "${1:-}" in
232
89
  check)
@@ -234,17 +91,20 @@ case "${1:-}" in
234
91
  echo "Usage: boundary.sh check <path>"
235
92
  exit 1
236
93
  fi
237
- check_path "$2"
94
+ guard check "$2" --project-dir "$SCRIPT_DIR"
238
95
  ;;
239
96
  validate-repos)
240
97
  validate_repos
241
98
  ;;
242
99
  compute-denied)
100
+ # Every registered instance not proven to share <project_dir>'s identity
101
+ # (computeDenied in bin/boundary-guard.cjs). Exits 1 when the registry
102
+ # exists but cannot be read: callers fail closed, never read it as [].
243
103
  if [ -z "${2:-}" ] || [ -z "${3:-}" ]; then
244
104
  echo "Usage: boundary.sh compute-denied <registry> <project_dir> [org_id] [allow_path]"
245
105
  exit 1
246
106
  fi
247
- compute_denied "$2" "$3" "${4:-}" "${5:-}"
107
+ guard compute-denied "$2" "$3" "${4:-}" "${5:-}"
248
108
  ;;
249
109
  *)
250
110
  echo "Usage: boundary.sh {check <path>|validate-repos|compute-denied <registry> <project_dir> [org_id] [allow_path]}"
@@ -60,7 +60,7 @@ Usage:
60
60
  capture-run.sh --mode personal|baseline --author HANDLE --topic TOPIC
61
61
  --summary SUMMARY [--session-id ID] [--branch BRANCH] [--date ISO]
62
62
  [--duration TEXT] [--open-threads-json JSON] [--no-push]
63
- [--async-push] [--no-reconcile] < details.md
63
+ [--async-push] [--no-reconcile] [--replace-session] < details.md
64
64
  EOF
65
65
  }
66
66
 
@@ -139,6 +139,11 @@ OPEN_THREADS_JSON="[]"
139
139
  NO_PUSH=0
140
140
  ASYNC_PUSH=0
141
141
  NO_RECONCILE=0
142
+ REPLACE_SESSION=0
143
+ RECORD_METADATA=""
144
+ RECORD_ROOT="$SCRIPT_DIR"
145
+ RECORD_FOLDER=""
146
+ RECORD_STAGING=""
142
147
 
143
148
  while [ $# -gt 0 ]; do
144
149
  case "$1" in
@@ -154,11 +159,32 @@ while [ $# -gt 0 ]; do
154
159
  --no-push) NO_PUSH=1; shift ;;
155
160
  --async-push) ASYNC_PUSH=1; shift ;;
156
161
  --no-reconcile) NO_RECONCILE=1; shift ;;
162
+ --replace-session) REPLACE_SESSION=1; shift ;;
163
+ --record-metadata) RECORD_METADATA="${2:-}"; shift 2 ;;
164
+ --project-root) RECORD_ROOT="${2:-}"; shift 2 ;;
165
+ --record-folder) RECORD_FOLDER="${2:-}"; shift 2 ;;
166
+ --staging) RECORD_STAGING="${2:-}"; shift 2 ;;
157
167
  --no-index|--no-publish|--no-notify) shift ;; # addressed-only compatibility flags
158
168
  *) echo "Unknown capture option: $1" >&2; exit 1 ;;
159
169
  esac
160
170
  done
161
171
 
172
+ # Session records use the same capture entry point with an isolated writer.
173
+ # Replacement, revision guards, staging, and the canonical memory lock apply
174
+ # only to this path; checkpoint records write files without committing.
175
+ if [ "$REPLACE_SESSION" = "1" ] && [ "$CAPTURE_MODE" = "baseline" ]; then
176
+ RECORD_ARGS=(capture --root "$RECORD_ROOT")
177
+ if [ -n "$RECORD_METADATA" ]; then
178
+ RECORD_ARGS+=(--data "$RECORD_METADATA")
179
+ else
180
+ RECORD_ARGS+=(--author "$AUTHOR" --topic "$TOPIC" --summary "$SUMMARY"
181
+ --session-id "$SESSION_ID" --branch "$BRANCH" --date "$CAPTURE_DATE" --duration "$DURATION")
182
+ fi
183
+ [ -z "$RECORD_FOLDER" ] || RECORD_ARGS+=("--folder=$RECORD_FOLDER")
184
+ [ -z "$RECORD_STAGING" ] || RECORD_ARGS+=(--staging "$RECORD_STAGING")
185
+ exec python3 "$SCRIPT_DIR/bin/lib/session_record.py" "${RECORD_ARGS[@]}"
186
+ fi
187
+
162
188
  AUTHOR="$(printf '%s' "$AUTHOR" | tr -cd 'a-zA-Z0-9_-')"
163
189
  [ -n "$AUTHOR" ] || { echo "Missing --author" >&2; exit 1; }
164
190
  [ -n "$TOPIC" ] || { echo "Missing --topic" >&2; exit 1; }
@@ -253,7 +279,11 @@ memory_save() {
253
279
  local _
254
280
  for _ in 1 2 3; do
255
281
  git pull --rebase origin main --quiet >/dev/null 2>&1 || true
256
- git push origin main --quiet >/dev/null 2>&1 && exit 0
282
+ if bash "$SCRIPT_DIR/bin/memory-push.sh" --repository "$SCRIPT_DIR/memory" --branch main >/dev/null 2>&1; then
283
+ exit 0
284
+ else
285
+ case "$?" in 75) ;; *) exit 1 ;; esac
286
+ fi
257
287
  sleep 1
258
288
  done
259
289
  exit 1
@@ -80,12 +80,9 @@ formats: \`docs/AGENT-PROTOCOL.md\`. Follow the generated contract below.
80
80
 
81
81
  Internal handoffs use \`bin/agent.sh handoff\` (\`memory/handoffs/\` + index,
82
82
  via \`bin/handoff-run.sh\`). External capsules use \`egregore-emissary\`.
83
- Never use deprecated \`egregore-handoff\` for internal handoffs.
84
-
85
- ## Compatibility
86
-
87
- Claude Code follows \`CLAUDE.md\`; other shell agents use the generated
88
- contract below. All runtimes share canonical memory.`;
83
+ Never use deprecated \`egregore-handoff\` for internal handoffs.`;
84
+ // A "Compatibility" section used to restate the precedence guard above; it was
85
+ // dropped (2026-09) to keep AGENTS.md inside the 32 KiB budget.
89
86
 
90
87
  function sha(text) {
91
88
  return crypto.createHash('sha256').update(text).digest('hex').slice(0, 12);
@@ -130,18 +127,8 @@ attribution line alone. Never re-print ranked results or raw JSON.`;
130
127
  const SHELL_PACKET_NOTE = `Search output is model-internal: show only the retrieval line and receipts —
131
128
  never ranked blocks, file/rank/excerpt metadata, or raw JSON.`;
132
129
 
133
- // The Command Awareness lifecycle bullet is Claude-surface routing prose; on
134
- // Codex the same typed-lookup routing arrives through the shared hook
135
- // contract, and the 32 KiB project-doc budget has no room to restate it.
136
- // Decided 2026-09: drop the bullet from the render rather than ship a stale
137
- // hand-reverted AGENTS.md.
138
- const CLAUDE_LIFECYCLE_BULLET_PREFIX = '- Exact lifecycle questions (';
139
-
140
130
  function transformSearchHygiene(body) {
141
131
  return body
142
- .split('\n')
143
- .filter((line) => !line.startsWith(CLAUDE_LIFECYCLE_BULLET_PREFIX))
144
- .join('\n')
145
132
  .replaceAll(CLAUDE_PACKET_NOTE, SHELL_PACKET_NOTE)
146
133
  .replace(/(\bbin\/search\.sh[^\n]*?) --context-packet\b/g, '$1');
147
134
  }
@@ -209,25 +196,7 @@ For continued project work: **continuation intent → prior workspace → restor
209
196
 
210
197
  ### Handoff claiming
211
198
 
212
- If \`addressed_to_user\` handoffs exist and the user is picking one up, create the IMPLEMENTS link after branch creation:
213
- \`\`\`bash
214
- bash bin/graph-op.sh claim-handoff "$SESSION_ID" "$HANDOFF_SESSION_ID" 2>/dev/null &
215
- \`\`\`
216
-
217
- **Auto-checkout repos from handoff**: after claiming, if \`addressed_rich\` carries a non-empty \`repoState\`, check out each entry's branch in its managed repo:
218
-
219
- \`\`\`bash
220
- PARENT_DIR="$(cd .. && pwd)"
221
- # For each entry in repoState:
222
- REPO_DIR="$PARENT_DIR/$REPO_NAME"
223
- if [ -d "$REPO_DIR/.git" ] || [ -f "$REPO_DIR/.git" ]; then
224
- git -C "$REPO_DIR" fetch origin "$BRANCH" --quiet 2>/dev/null
225
- git -C "$REPO_DIR" checkout "$BRANCH" 2>/dev/null || \\
226
- git -C "$REPO_DIR" checkout -b "$BRANCH" "origin/$BRANCH" 2>/dev/null
227
- fi
228
- \`\`\`
229
-
230
- Report \`✓ Checked out {branch} in {repo1}, {repo2}\`; for a merged-away branch, \`◐ {repo}: PR #{N} merged — on {base}\`. If \`repoState\` is absent or empty, skip silently.
199
+ When the user picks up a handoff addressed to them, follow \`.claude/context/handoff-claiming.md\` after branch creation: it claims the handoff and checks out the branches its \`repoState\` names in each managed repo.
231
200
 
232
201
  **Exceptions** — skip branching when the user explicitly created or named a branch themselves, or the intent continues the current working branch's topic.
233
202
 
@@ -262,7 +231,9 @@ only for dependencies. Deletion needs no rewrite unless purging secrets.
262
231
 
263
232
  If the startup card output contains \`onboarding_needed\`, invoke the \`$onboarding\` skill instead of greeting.`;
264
233
 
265
- const COMMAND_AWARENESS_PREPEND = `Codex reserves leading \`/\` for built-ins. Invoke Egregore skills with \`$name\` or natural language ("show activity", "make a handoff"). Every framework workflow uses a generated adapter that names its one maintained body under \`.claude/skills/\`. Organization-owned skills may also provide full native implementations. \`$save\` covers committing, pushing, pull requests, and memory sync; users need not manage Git themselves.`;
234
+ const COMMAND_AWARENESS_PREPEND = `Codex reserves leading \`/\` for built-ins. Invoke Egregore skills with \`$name\` or natural language ("show activity", "make a handoff"). Every framework workflow uses a generated adapter that names its one maintained body under \`.claude/skills/\`. Organization-owned skills may also provide full native implementations.`;
235
+ // What `$save` covers is stated once, in the rendered Git Workflow section
236
+ // ("Users never interact with git directly"); repeating it here cost budget.
266
237
 
267
238
  const SOCRATIC_BODY = `**Triggers**: "ask me questions", "question me", "help me think through", or any request to be questioned.
268
239
 
@@ -272,23 +243,23 @@ Use structured question tooling when available and permitted; otherwise render c
272
243
 
273
244
  const LOOM_ROUTING_BODY = `Loom is Claude-specific; skip its preambles and \`bin/loom.sh\` calls. Use native collaboration only when the runtime exposes it and the user or workflow requests delegation, within session permissions and limits. Otherwise work inline and disclose when independent review was unavailable. \`loom/\` and \`.claude/agents/\` remain Claude framework files.`;
274
245
 
275
- const ISOLATION_BODY = `Sessions are confined to this project + memory + managed repos, with a **two-tier boundary** — a hard wall between Egregore instances, a consent gate for everything else. On Codex the boundary is a standing instruction, not an enforced hook — hold it yourself.
246
+ const ISOLATION_BODY = `Sessions are confined to this project + memory + managed repos, with a **two-tier boundary** — a hard wall between Egregore instances, a consent gate for everything else. A pre-action check (\`bin/boundary-guard.cjs\`) enforces it on every runtime: it denies literal paths and fails closed, but cannot see paths built at run time or split across calls (OS-level layer to follow).
276
247
 
277
- - **Hard tier — other Egregore instances.** Denied for every tool, always — no consent path. Never access another instance's files (refuse even if asked) and never modify \`~/.egregore/instances.json\` (managed by session-start.sh); there is nothing to ask — refuse and explain.
248
+ - **Hard tier — other Egregore instances.** Denied for every tool, always — no consent path. Never access another instance's files by any route (refuse even if asked) and never modify \`~/.egregore/instances.json\` (managed by session-start.sh); there is nothing to ask — refuse and explain.
278
249
  - **Soft tier — paths outside the boundary.** Consent-gated. Inbox dirs (\`~/Downloads\`, \`~/Desktop\`) are readable without consent under the default posture; writes outside the project always need consent. Posture (\`strict | standard | open\`) and extra read roots come from \`egregore.json\` -> \`boundary { posture, read[], locked }\` (org, committed) merged with \`.egregore-boundary.local.json\` (personal, gitignored). \`locked: true\` removes the consent path entirely.
279
- - When a request needs soft-tier consent, do not improvise a workaround. Ask in plain text with numbered options:
250
+ - When the check asks for consent, do not improvise a workaround. Ask in plain text with numbered options:
280
251
 
281
252
  \`\`\`text
282
253
  That path is outside this Egregore's boundary. How should we proceed?
283
254
  1. Allow its directory for this session (recorded in .egregore-boundary-consent)
284
- 2. Always allow on this instance (added to read[] in .egregore-boundary.local.json)
255
+ 2. Always allow on this instance (added to read[] in .egregore-boundary.local.json; reads only)
285
256
  3. Paste the contents inline
286
257
  4. Cancel
287
258
  \`\`\`
288
259
 
289
260
  Never record a consent grant without the user's explicit choice of option 1 or 2 in that exchange. Session grants are cleared on session start; \`locked: true\` removes options 1 and 2.
290
261
 
291
- See DEVELOPMENT.md §3 for boundary details and \`memory/knowledge/decisions/2026-07-08-boundary-hook-consent-design.md\` for the design decisions.`;
262
+ Details: DEVELOPMENT.md §3; design: \`memory/knowledge/decisions/2026-07-08-boundary-hook-consent-design.md\`.`;
292
263
 
293
264
  // ── per-section rules ────────────────────────────────────────────────────
294
265
  const RULES = {
@@ -302,8 +273,16 @@ const RULES = {
302
273
  note: 'Kept; /update, /contribute, /save tokens rendered as $skill tokens.',
303
274
  },
304
275
  'Cross-Runtime Compatibility': {
305
- action: 'keep',
306
- note: 'Kept verbatim — framework parity applies equally to Claude Code, Codex, and Pi.',
276
+ action: 'replace',
277
+ body: `Share \`bin/\` mechanics through thin Claude/Codex/Pi/Prime adapters. Startup,
278
+ lifecycle, capture, skill and command changes require tracing every runtime,
279
+ parity tests and regenerated specs/bundles before completion.
280
+
281
+ Discover via \`bash bin/spirit-discovery-codex.sh capabilities.list\` (Pi/Prime:
282
+ registered tool). Follow \`docs/spirit-discovery.md\`: keep seven facets separate;
283
+ generic shell needs one snapshot. Discovery reads code/install evidence, not
284
+ memory, and grants no authority.`,
285
+ note: 'Compact translation preserves shared mechanics, thin adapters, every-runtime tracing/parity and regeneration, and neutral discovery without authority. Full query/facet and fixed-adapter details remain in shipped docs/spirit-discovery.md. Fits the 32 KiB project-doc budget.',
307
286
  },
308
287
  'Voice': {
309
288
  action: 'keep',
@@ -317,7 +296,7 @@ const RULES = {
317
296
  'Before Project Changes — WORKING BRANCH': {
318
297
  action: 'replace',
319
298
  body: AFTER_GREETING_BODY,
320
- note: 'EnterWorktree -> bin/agent.sh branch with git checkout fallback; AskUserQuestion -> numbered options in plain text; branch-guard mapped to .codex/hooks/branch-guard.js with instruction fallback; plan-mode note dropped (no plan mode on Codex); /branch + /onboarding -> skill tokens. Handoff claiming and repoState auto-checkout bash kept verbatim (pure git); surrounding prose compressed 2026-08 for the 32 KiB budget, every rule retained.',
299
+ note: 'EnterWorktree -> bin/agent.sh branch with git checkout fallback; AskUserQuestion -> numbered options in plain text; branch-guard mapped to .codex/hooks/branch-guard.js with instruction fallback; plan-mode note dropped (no plan mode on Codex); /branch + /onboarding -> skill tokens. Handoff claiming points to the shared .claude/context/handoff-claiming.md procedure; surrounding prose compressed 2026-08 for the 32 KiB budget, every rule retained.',
321
300
  },
322
301
  'Config Files': { action: 'keep', note: 'Kept verbatim — shell facts, runtime-neutral.' },
323
302
  'Optional Knowledge Graph Projection': {
@@ -338,7 +317,6 @@ const RULES = {
338
317
  action: 'keep',
339
318
  note: 'Kept; slash tokens rendered as $skill tokens. Branch diagram unchanged (code fence).',
340
319
  },
341
- 'Working Conventions': { action: 'keep', note: 'Kept verbatim.' },
342
320
  'Command Awareness': {
343
321
  action: 'keep',
344
322
  prepend: COMMAND_AWARENESS_PREPEND,
@@ -354,7 +332,7 @@ const RULES = {
354
332
  'Environment Isolation': {
355
333
  action: 'replace',
356
334
  body: ISOLATION_BODY,
357
- note: 'boundary-check is a Claude PreToolUse hook with no .codex equivalent — two-tier model stated as a standing instruction; AskUserQuestion remediation -> numbered options, now including the two consent-grant options (session grant -> .egregore-boundary-consent, instance grant -> .egregore-boundary.local.json read[]).',
335
+ note: 'The boundary policy is shared (bin/boundary-guard.cjs): Claude (boundary-check.sh) and Codex (.codex/hooks.json) run it through bin/boundary-hook.sh (PreToolUse), Pi and Prime from their tool_call gate. AskUserQuestion remediation -> numbered options, including the two consent-grant options (session grant -> .egregore-boundary-consent, instance grant -> .egregore-boundary.local.json read[], reads only).',
358
336
  },
359
337
  };
360
338
 
@@ -26,6 +26,16 @@ rm -f "$SCRIPT_DIR/.egregore-branch-consent" "$MAIN_PROJECT_DIR/.egregore-branch
26
26
  rm -f "$SCRIPT_DIR/.egregore-boundary-consent" "$MAIN_PROJECT_DIR/.egregore-boundary-consent" 2>/dev/null
27
27
  # Prune abandoned scratch without blocking startup or fresh sibling work.
28
28
  ( bash "$SCRIPT_DIR/bin/scratch-sweep.sh" --older-than 60 >/dev/null 2>&1 & ) 2>/dev/null
29
+ # Compute the session boundary the pre-action checks read (Codex hook, Pi and
30
+ # Prime tool_call gate) — the same shared computation Claude's SessionStart
31
+ # runs. If it fails, the checks recompute it themselves instead of failing open.
32
+ bash "$SCRIPT_DIR/bin/node-run.sh" "$SCRIPT_DIR/bin/boundary-guard.cjs" write-cache "$SCRIPT_DIR" >/dev/null 2>&1 || true
33
+ # Registry maintenance shared with Claude's SessionStart: drop entries that are
34
+ # another instance's runtime state (bin/lib/instance-registry.sh).
35
+ if command -v jq >/dev/null 2>&1 && [ -f "$SCRIPT_DIR/bin/lib/instance-registry.sh" ]; then
36
+ ( ( source "$SCRIPT_DIR/bin/lib/instance-registry.sh" \
37
+ && egregore_registry_prune "$HOME/.egregore/instances.json" ) >/dev/null 2>&1 & ) 2>/dev/null || true
38
+ fi
29
39
 
30
40
  if [ -f "$SCRIPT_DIR/bin/lib/worktree-links.sh" ]; then
31
41
  source "$SCRIPT_DIR/bin/lib/worktree-links.sh" >/dev/null 2>/dev/null || true
@@ -77,7 +87,12 @@ if [ "$LOCAL_MODE" != "true" ]; then
77
87
  fi
78
88
  fi
79
89
 
90
+ source "$SCRIPT_DIR/bin/lib/startup-restart.sh"
91
+ _STARTUP_HEAD=$(egregore_startup_head)
80
92
  source "$SCRIPT_DIR/bin/lib/git-sync.sh" >/dev/null 2>/dev/null
93
+ # A sync that pulled a newer startup finishes on it (bin/lib/startup-restart.sh).
94
+ egregore_startup_restart "$_STARTUP_HEAD" "$SCRIPT_DIR/bin/codex-session-start.sh" "$@"
95
+ unset _STARTUP_HEAD
81
96
  source "$SCRIPT_DIR/bin/lib/health-footer.sh"
82
97
  source "$SCRIPT_DIR/bin/lib/notices.sh"
83
98
  _notice_init
@@ -237,6 +252,10 @@ render_card() {
237
252
  case "${1:---card}" in
238
253
  --card|card)
239
254
  render_card
255
+ EGREGORE_GREETING_RECORDS_ONLY=1 source "$SCRIPT_DIR/bin/lib/greeting.sh"
256
+ _print_session_records
257
+ EGREGORE_HARNESS="${EGREGORE_HARNESS:-codex}" _print_reflexes
258
+ ( bash "$SCRIPT_DIR/bin/session-record.sh" --mode sweep >/dev/null 2>&1 & ) 2>/dev/null
240
259
  ;;
241
260
  --prompt|prompt)
242
261
  native_tokens="$(bash "$SCRIPT_DIR/bin/codex-sync-skills.sh" --list-native | awk 'BEGIN { sep="" } NF { printf "%s$%s", sep, $0; sep=", " }')"
@@ -148,6 +148,20 @@ function classifyGraph(data, options = {}) {
148
148
  };
149
149
  }
150
150
 
151
+ function spiritRows(data, personal = false) {
152
+ const rows = firstArray(data, personal ? ['my_spirit_records'] : ['spirit_records']);
153
+ if (!rows.length && !data.unsupported_native_records && !data.held_records?.length) return [];
154
+ const lines = [rule(), padLine('SPIRIT RECORDS')];
155
+ rows.slice(0, 5).forEach((row) => {
156
+ const state = row.state || {};
157
+ lines.push(padLine(`${row.producer_principal_id || 'spirit'} · ${state.execution || 'unknown'}`, `outcome ${state.outcome || 'unknown'}`));
158
+ lines.push(padLine(`verification ${state.verification || 'unknown'} · partial coverage`));
159
+ });
160
+ if (data.unsupported_native_records) lines.push(padLine(`${data.unsupported_native_records} unsupported records · metadata unavailable`));
161
+ if (data.held_records?.length) lines.push(padLine(`${data.held_records.length} held records · details withheld`));
162
+ return lines;
163
+ }
164
+
151
165
  function renderActivity(data) {
152
166
  const graph = classifyGraph(data, { mode: data.mode || 'connected', attempt: 'retry' });
153
167
  const org = data.org || data.organization || 'Egregore';
@@ -219,6 +233,8 @@ function renderActivity(data) {
219
233
  });
220
234
  }
221
235
 
236
+ lines.push(...spiritRows(data));
237
+
222
238
  lines.push(rule());
223
239
  if (handoffs.length > 0) {
224
240
  lines.push(padLine('Handoff actions: done N · expire N · reopen N'));
@@ -305,6 +321,8 @@ function renderDashboard(data) {
305
321
  });
306
322
  }
307
323
 
324
+ lines.push(...spiritRows(data, true));
325
+
308
326
  lines.push(rule());
309
327
  const total = stats.totalSessions ?? data.local_sessions?.session_count ?? sessions.length;
310
328
  const wrapped = stats.wrappedSessions ?? sessions.filter((s) => valueOf(s, ['status', 'type'], '').includes('wrap')).length;
@@ -4,6 +4,7 @@ set -euo pipefail
4
4
  unset GIT_DIR GIT_WORK_TREE GIT_INDEX_FILE GIT_OBJECT_DIRECTORY GIT_ALTERNATE_OBJECT_DIRECTORIES GIT_COMMON_DIR
5
5
 
6
6
  # Print one configuration value for skill instructions to name and reuse.
7
+ # api_url prints the address to send requests to (the saved one, resolved).
7
8
  # Present-but-empty and non-string values are unset; repo_name defaults to
8
9
  # egregore. The composed repo requires a nonempty string github_org.
9
10
  # Exit 0 = value printed (or unset), Exit 1 = invalid/unreadable configuration
@@ -35,7 +36,15 @@ fi
35
36
 
36
37
  case "$1" in
37
38
  mode) _detect_mode ;;
38
- api_url|github_org|org_name|slug|memory_repo|upstream_url)
39
+ api_url)
40
+ # Skills send credentials to this address: never hand them the retired
41
+ # origin, or an address that is not plain (bin/lib/config.sh
42
+ # _hosted_api_url). A refused one prints nothing and fails, so the
43
+ # skill sends nothing.
44
+ value=$(_hosted_api_url "$(jq -r '.api_url | select(type == "string" and length > 0)' "$CONFIG")") || exit 1
45
+ if [ -n "$value" ]; then printf '%s\n' "$value"; fi
46
+ ;;
47
+ github_org|org_name|slug|memory_repo|upstream_url)
39
48
  value=$(jq -r --arg key "$1" '.[$key] | select(type == "string" and length > 0)' "$CONFIG")
40
49
  if [ -n "$value" ]; then printf '%s\n' "$value"; fi
41
50
  ;;
@@ -16,6 +16,22 @@ if [ "$MODE" != "connected" ] && [ -z "$API_URL" ]; then
16
16
  exit 0
17
17
  fi
18
18
 
19
+ # The refresh runs whichever create-egregore npx has cached, which may be a
20
+ # release from before the October 2026 security reset: it sends the org key
21
+ # to the saved address exactly as written. Run it only when that address needs
22
+ # no resolving, so it never reaches the retired origin or an address the
23
+ # resolver refuses (bin/lib/config.sh). Those wait for /update, quietly.
24
+ # shellcheck source=lib/config.sh
25
+ source "$SCRIPT_DIR/lib/config.sh" 2>/dev/null || exit 0
26
+ SAVED="$API_URL"
27
+ SAVED="${SAVED#"${SAVED%%[![:space:]]*}"}"
28
+ SAVED="${SAVED%"${SAVED##*[![:space:]]}"}"
29
+ while [ "${SAVED%/}" != "$SAVED" ]; do SAVED="${SAVED%/}"; done
30
+ RESOLVED="$(EGREGORE_ADDRESS_NOTICE=shown _hosted_api_url "$API_URL" 2>/dev/null)" || exit 0
31
+ if [ -z "$RESOLVED" ] || [ "$RESOLVED" != "$SAVED" ]; then
32
+ exit 0
33
+ fi
34
+
19
35
  LOG_DIR="$ROOT/.egregore"
20
36
  mkdir -p "$LOG_DIR" 2>/dev/null || true
21
37
  LOG="$LOG_DIR/connect-refresh.log"
@@ -799,6 +799,11 @@ def parser() -> argparse.ArgumentParser:
799
799
 
800
800
  def main() -> int:
801
801
  args = parser().parse_args()
802
+ root = Path(__file__).resolve().parent.parent
803
+ sys.path.insert(0, str(root))
804
+ from egregore_runtime.admin_entry import require_admin
805
+
806
+ require_admin("The corpus map", root) # admin-only: it reads the corpus outside the predicate
802
807
  return args.func(args)
803
808
 
804
809