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
@@ -38,11 +38,6 @@ Internal handoffs use `bin/agent.sh handoff` (`memory/handoffs/` + index,
38
38
  via `bin/handoff-run.sh`). External capsules use `egregore-emissary`.
39
39
  Never use deprecated `egregore-handoff` for internal handoffs.
40
40
 
41
- ## Compatibility
42
-
43
- Claude Code follows `CLAUDE.md`; other shell agents use the generated
44
- contract below. All runtimes share canonical memory.
45
-
46
41
  <!-- BEGIN GENERATED EGREGORE CODEX SPEC — derived from CLAUDE.md by bin/codex-render-spec.mjs; do not edit by hand -->
47
42
 
48
43
  ## Egregore on Codex
@@ -77,13 +72,14 @@ When a user reports broken or missing framework behavior, the first question is
77
72
 
78
73
  ## Cross-Runtime Compatibility
79
74
 
80
- Framework behavior must work across Claude Code, Codex, and Pi Egregores. Put
81
- shared mechanics in runtime-neutral `bin/` scripts; keep `.claude/`, `.codex/`,
82
- and `.pi/` as thin adapters to those mechanics. When changing startup, session
83
- lifecycle, capture, skills, or commands, trace all three runtime entry points
84
- and add or update a parity test. Do not call a framework change complete based
85
- on one runtime alone. Regenerate derived Codex and Pi specifications or runtime
86
- bundles whenever their sources change.
75
+ Share `bin/` mechanics through thin Claude/Codex/Pi/Prime adapters. Startup,
76
+ lifecycle, capture, skill and command changes require tracing every runtime,
77
+ parity tests and regenerated specs/bundles before completion.
78
+
79
+ Discover via `bash bin/spirit-discovery-codex.sh capabilities.list` (Pi/Prime:
80
+ registered tool). Follow `docs/spirit-discovery.md`: keep seven facets separate;
81
+ generic shell needs one snapshot. Discovery reads code/install evidence, not
82
+ memory, and grants no authority.
87
83
 
88
84
  ---
89
85
 
@@ -142,25 +138,7 @@ For continued project work: **continuation intent → prior workspace → restor
142
138
 
143
139
  ### Handoff claiming
144
140
 
145
- If `addressed_to_user` handoffs exist and the user is picking one up, create the IMPLEMENTS link after branch creation:
146
- ```bash
147
- bash bin/graph-op.sh claim-handoff "$SESSION_ID" "$HANDOFF_SESSION_ID" 2>/dev/null &
148
- ```
149
-
150
- **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:
151
-
152
- ```bash
153
- PARENT_DIR="$(cd .. && pwd)"
154
- # For each entry in repoState:
155
- REPO_DIR="$PARENT_DIR/$REPO_NAME"
156
- if [ -d "$REPO_DIR/.git" ] || [ -f "$REPO_DIR/.git" ]; then
157
- git -C "$REPO_DIR" fetch origin "$BRANCH" --quiet 2>/dev/null
158
- git -C "$REPO_DIR" checkout "$BRANCH" 2>/dev/null || \
159
- git -C "$REPO_DIR" checkout -b "$BRANCH" "origin/$BRANCH" 2>/dev/null
160
- fi
161
- ```
162
-
163
- 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.
141
+ 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.
164
142
 
165
143
  **Exceptions** — skip branching when the user explicitly created or named a branch themselves, or the intent continues the current working branch's topic.
166
144
 
@@ -221,7 +199,7 @@ answers it: `open-handoffs`, `pending-questions`, `lineage`, or
221
199
  `meeting-history`. Verify projection freshness/coverage and open its canonical
222
200
  `evidencePath` before acting. Canonical Markdown wins on disagreement.
223
201
 
224
- Run `catalog` only when the route is unclear. Named reads return bounded stable fields and exact canonical `evidencePath` pointers; open only the returned files needed to answer. When a read reports partial coverage, use `unprojectedPaths` rather than claiming those files are represented in the graph. Use `bin/graph.sh` for unsupported Neo4j queries and never construct curl calls directly. See DEVELOPMENT.md §1 for the schema. Local recall uses Runtime `find`/`open`.
202
+ Run `catalog` only when the route is unclear. Open only the returned `evidencePath` files needed to answer; on partial coverage, name `unprojectedPaths` instead of claiming them. Use `bin/graph.sh` for unsupported Neo4j queries and never construct curl calls directly (schema: DEVELOPMENT.md §1).
225
203
 
226
204
  ---
227
205
 
@@ -234,60 +212,42 @@ For each user-directed organizational lookup, show exactly one visible line:
234
212
  - retrieval that actually queries the connected graph:
235
213
  `⌕ Egregore Connect · searching your organization’s memory and relationships`
236
214
 
237
- When `EGREGORE_ORG_CONTEXT_V1` is attached, reuse its authorized evidence.
238
- For a remaining gap continue a Runtime investigation, preserving earlier findings.
239
- Follow `.claude/context/retrieval-investigation.md`: the model chooses keyword,
240
- semantic, hybrid, filename, literal, or date inventory; Runtime owns permissions,
241
- evidence history, pages and per-prompt limits. Empty results allow refinements
242
- within the requested dates. Never relax the date boundary to manufacture coverage.
243
-
244
- **Scope.** Egregore Runtime is for organizational recall only: team memory,
245
- decisions, handoffs, prior work. Code, files, Git, and tests use the harness's
246
- normal tools, with no beat and no Runtime call.
247
-
248
215
  **Visibility is the contract.** Emit it verbatim as a standalone assistant
249
216
  message before the first tool call that performs the organizational recall
250
217
  (the `bin/search.sh` query or a graph read). Tool output does not satisfy it.
251
- Do not paraphrase the line.
218
+ Do not paraphrase the line. Emit once per episode.
219
+ Never name `Egregore Connect` unless a graph read will actually run.
252
220
 
253
- Use Connect only for a graph traversal that actually runs. Emit once per
254
- episode.
221
+ **Scope.** Egregore Runtime is for organizational recall only: team memory,
222
+ decisions, handoffs, prior work. Code, files, Git, and tests use the harness's
223
+ normal tools, with no beat and no Runtime call. Startup hydration, graph
224
+ writes, ingestion, background sync, maintenance, and internal queries get no beat.
255
225
 
256
226
  **Routing:** Organizational recall always enters Egregore Runtime. The model is
257
227
  the semantic intent authority, deciding from meaning rather than fixed phrases.
228
+ Do not run retrieval on unrelated prompts or infer graph from recall intent.
258
229
  Prompt hooks attach identity and guidance only; they never retrieve evidence.
259
- Without attached context, choose the appropriate Runtime operation:
230
+ The full retrieval contract arrives with the session's first prompt as
231
+ `EGREGORE_ACTOR_CONTEXT_V1` (later prompts carry a reminder); follow it.
232
+ When `EGREGORE_ORG_CONTEXT_V1` is attached, reuse its authorized evidence.
233
+ When the full contract is not in your context (a subagent, a missed hook, or
234
+ after a compaction), start with
260
235
 
261
236
  ```bash
262
237
  bash bin/search.sh find "<query>" --kind <kind>
263
238
  ```
264
239
 
265
- Choose `filename`, `literal`, or `dates` for canonical file lookups; `keyword`
266
- for BM25; `semantic` for paraphrases; `hybrid` for combined ranking. No mode
267
- must run first. Open necessary sources together with `bash bin/search.sh open
268
- memory/path-a.md memory/path-b.md`. Runtime retains request state; do not write
269
- JSON operations, episode arguments, or gap explanations for normal retrieval.
270
- Use `find` for model-led discovery; `query` is a compatibility command. Read
271
- canonical sources through `search.sh open`, never a raw file-read tool or shell
272
- read. An adequate excerpt already supports an answer; no extra open is needed.
240
+ and follow `.claude/context/retrieval-investigation.md`.
241
+ Open necessary sources together with `bash bin/search.sh open`; never read
242
+ memory with a raw file tool, `grep` or `ls`. Do not `cd` into the sibling memory repository.
243
+ Never relax the date boundary to manufacture coverage.
273
244
 
274
245
  Search output is model-internal: show only the retrieval line and receipts —
275
246
  never ranked blocks, file/rank/excerpt metadata, or raw JSON.
276
247
 
277
- Do not resolve `memory/` to its sibling repo or start with raw `grep`/`ls`.
278
- Search attaches no graph by default. Open a source only when its excerpt
279
- cannot support a necessary claim. For current
280
- team/person synthesis, retain the requested subject and choose a `recent_days`
281
- window. Use date filters for a known topic, or a bounded date inventory for
282
- a recent-work overview. `$activity`, `$dashboard`, and `$project`
283
- display bounded status surfaces only when named or directly requested as a
284
- card. Explained syntheses of current organizational work and prior-work
285
- discovery are Runtime/QMD recall. Do not run retrieval on unrelated prompts or
286
- infer graph from recall intent.
287
-
288
- Do not emit the beat for code search, Git inspection, startup hydration, graph
289
- writes, ingestion, background sync, maintenance, or internal queries.
290
- Never name `Egregore Connect` unless a graph read will actually run.
248
+ `$activity`, `$dashboard`, and `$project` display bounded status surfaces only
249
+ when named or directly requested as a card.
250
+ Explained syntheses of current organizational work and prior-work discovery are Runtime/QMD recall.
291
251
 
292
252
  ---
293
253
 
@@ -337,12 +297,15 @@ Never repeat it.
337
297
 
338
298
  ## Memory
339
299
 
340
- `memory/` is a symlink to the memory repo defined in `egregore.json`. Key directories:
341
- - `people/` — team directory
342
- - `handoffs/` — session handoffs + `index.md`
343
- - `knowledge/decisions/` — org decisions
344
- - `knowledge/patterns/` — emergent patterns
345
- - `infrastructure/` — service registry (URLs, names, credential locations)
300
+ `memory/` links to the repo in `egregore.json`:
301
+ - `people/` — team
302
+ - `handoffs/` — handoffs and index
303
+ - `knowledge/decisions/` — decisions
304
+ - `knowledge/patterns/` — patterns
305
+ - `infrastructure/` — services and credential locations
306
+
307
+ Write memory through its commands, never the files: `$reflect` for decisions, `$handoff` for handoffs.
308
+
346
309
 
347
310
  Always use HTTPS for git operations — `github-auth.sh` handles credential storage.
348
311
 
@@ -357,9 +320,8 @@ Loom is Claude-specific; skip its preambles and `bin/loom.sh` calls. Use native
357
320
  ## Git Workflow
358
321
 
359
322
  `develop` is the default integration branch. A top-level
360
- `egregore.json.base_branch` replaces it for instances using another integration
361
- branch; `base_branch: "main"` is single-branch mode. Users never interact with
362
- git directly.
323
+ `egregore.json.base_branch` replaces it; `base_branch: "main"` is single-branch
324
+ mode. Users never interact with git directly.
363
325
 
364
326
  ```
365
327
  main ← selected `/release` candidates
@@ -373,10 +335,9 @@ develop ← CL integration (available internally)
373
335
  - **On launch**: syncs the configured base branch + memory. Does NOT create a branch.
374
336
  - **Branch creation**: required before project changes; read-only work stays put.
375
337
  - **Resuming**: rebase onto the configured base branch and continue.
376
- - **Read-only sessions**: no branch creation based on message count.
377
338
  - **`$save`**: pushes the working branch and opens a PR to the configured base. Auto-merges markdown-only PRs.
378
339
  - **Memory repo**: stays on main (separate repo, auto-merge).
379
- - **Never push directly to the configured base, main, or develop.** All changes flow through PRs.
340
+ - **Never push directly to the configured base, main, or develop.** Changes flow through PRs, merged with `bash bin/agent.sh merge <pr>`, never `gh pr merge`; a red check needs a receipt naming each failing job and why.
380
341
 
381
342
  ### Pull request format (all harnesses)
382
343
 
@@ -384,7 +345,7 @@ Every PR body follows `.claude/context/pr-format.md`, enforced by the `pr-format
384
345
 
385
346
  ### Commit format (all harnesses)
386
347
 
387
- Every commit follows `.claude/context/commit-format.md`: subject `type(scope): imperative summary` (≤ 72 chars, aim ≤ 50, lowercase, same grammar and type set as PR titles), body wrapped at 72 explaining what and why — never how, and git trailers on agent-authored commits (`Egregore-Session: <id>` from `.egregore-session-id`, plus the harness `Co-Authored-By` line). Background scripts commit as `chore(<subsystem>): …`, but a commit carrying real work derives its type/scope from the diff — the transport never masks the work. Git-generated messages (merges, reverts, autosquash fixups) keep their native form. Wording for commits and PRs follows `.claude/context/git-language.md`.
348
+ Every commit follows `.claude/context/commit-format.md`: subject `type(scope): imperative summary` (≤ 72 chars, aim ≤ 50, lowercase, same grammar and type set as PR titles), body wrapped at 72 explaining what and why — never how, and git trailers on agent-authored commits (`Egregore-Session: <id>` from `bash bin/session-id.sh`, plus the harness `Co-Authored-By` line). Background scripts commit as `chore(<subsystem>): …`, but a commit carrying real work derives its type/scope from the diff — the transport never masks the work. Git-generated messages (merges, reverts, autosquash fixups) keep their native form. Wording for commits and PRs follows `.claude/context/git-language.md`.
388
349
 
389
350
  ### Managed Repos
390
351
 
@@ -392,21 +353,13 @@ Repos in `egregore.json` → `repos[]` are cloned as siblings (`../{repo}/`). Ea
392
353
 
393
354
  ---
394
355
 
395
- ## Working Conventions
396
-
397
- - For unfamiliar org work, use Observe context; if absent, run `bash bin/search.sh find` with an appropriate lookup kind.
398
- - Document significant decisions in `memory/knowledge/decisions/`
399
- - After substantial sessions, log to `memory/handoffs/` and update `index.md`
400
-
401
- ---
402
-
403
356
  ## Command Awareness
404
357
 
405
- 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.
358
+ 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.
406
359
 
407
360
  Invoke commands from user intent — don't wait for the slash. Each command file has a `## When to invoke` section. Load it for the full spec.
408
361
 
409
- **Core loop** — `$activity` `$dashboard` `$handoff` `$wrap` `$save` `$reflect` `$todo`
362
+ **Core loop** — `$activity` `$dashboard` `$handoff` `$wrap` `$save` `$reflect` `$todo` `$records`
410
363
  **Knowledge** — `$search` `$deep-reflect` `$archive` `$note` `$add` `$meeting` `$ingest` `$scroll` `$mock` `$audit`
411
364
  **Identity** — `$me` (view profile or set display name)
412
365
  **Coordination** — `$ask` `$quest` `$issue` `$invite` `$delete-user` `$announce`
@@ -418,16 +371,10 @@ Invoke commands from user intent — don't wait for the slash. Each command file
418
371
 
419
372
  **Disambiguation:**
420
373
  - Knowledge: `$reflect` (share-ready) · `$note` (half-baked) · `$deep-reflect` (deep research over memory — questions AND cross-referencing) · `$archive` (AI patterns) · `$audit` (evidence-mined forensic sweep of the org's own record — any target)
421
- - Finding things — **the model chooses organizational retrieval through Runtime**.
422
- Reuse equivalent evidence and investigate distinct gaps through the same Runtime.
423
- Use `bash bin/search.sh find` or `open` and the shared investigation contract. Use Grep/Glob for code and exact errors, not org
424
- recall. Do not `cd` into the sibling memory repository.
425
- - Finding **something you generated** (a scroll, handoff, emissary, decision, any hosted egregore.xyz link): `bash bin/artifacts.sh find <query>`. Every generative surface records into memory — hosted artifacts self-register into `memory/artifacts/` at publish (committed+pushed, findable from any session); handoffs in `memory/handoffs/`, emissaries in `memory/handoffs/outbound/`, decisions/findings/patterns in `memory/knowledge/`. The finder searches all of them by **content, not just name**, ranks title/topic matches above body mentions, tags hits by type (`[document]`/`[handoff]`/`[emissary]`/`[decision]`), and surfaces the shareable URL — grep-first in OSS, search + graph when available. *"bring me the artifact where I laid out our GTM plan"* → this.
374
+ - Finding things — organizational recall through Runtime (Egregore Retrieval Beat); Grep/Glob for code and exact errors.
375
+ - Finding **something you generated** (a scroll, handoff, emissary, decision, any hosted egregore.xyz link): `bash bin/artifacts.sh find <query>` searches every generated record by content, tags its type and returns the shareable URL. *"bring me the artifact where I laid out our GTM plan"* → this.
426
376
  - Artifacts with questions: `$scroll` (living paper + embedded harvest, updates in place) · `$view` (static render) · `$harvest` (elicitation, no published face) · `$mock` (pre-build walkthrough of decided design — gauge per stop, verdict copy-back)
427
- - Explicit bounded status: `$dashboard` (personal) · `$activity` (org-wide) ·
428
- `$project` (named project). These display cards when named or directly
429
- requested. Analytical questions about organizational work and specific
430
- prior-work continuation route through Runtime/QMD recall.
377
+ - Status cards: `$dashboard` (personal) · `$activity` (org-wide) · `$project` (named project), only when named or requested as a card.
431
378
  - Ending: `$wrap` (personal closure) · `$handoff` (notes for others) · `$save` (still working)
432
379
  - Tasks: `$todo` (personal) · `$quest` (team exploration) · `$issue` (something broken)
433
380
  - Questions: `$ask [person]` (async) · just ask (agent answers from context)
@@ -441,6 +388,8 @@ Invoke commands from user intent — don't wait for the slash. Each command file
441
388
  - Agents: `$summon` (design through questions) · `/loop` (quick recurring schedule)
442
389
  - Announcements: `$announce` (broadcast to group) · `$handoff` (structured to a person) · `bin/notify.sh send` (DM one person)
443
390
 
391
+ **Interface taste** — when someone likes or dislikes a generated interface, follow the contract in `bash bin/genui.sh --help`.
392
+
444
393
  ---
445
394
 
446
395
  ## Socratic Questioning (MANDATORY)
@@ -483,22 +432,22 @@ Egregore runs in one of two configurations, set by `mode` in `egregore.json`. De
483
432
 
484
433
  ## Environment Isolation
485
434
 
486
- 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.
435
+ 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).
487
436
 
488
- - **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.
437
+ - **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.
489
438
  - **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.
490
- - When a request needs soft-tier consent, do not improvise a workaround. Ask in plain text with numbered options:
439
+ - When the check asks for consent, do not improvise a workaround. Ask in plain text with numbered options:
491
440
 
492
441
  ```text
493
442
  That path is outside this Egregore's boundary. How should we proceed?
494
443
  1. Allow its directory for this session (recorded in .egregore-boundary-consent)
495
- 2. Always allow on this instance (added to read[] in .egregore-boundary.local.json)
444
+ 2. Always allow on this instance (added to read[] in .egregore-boundary.local.json; reads only)
496
445
  3. Paste the contents inline
497
446
  4. Cancel
498
447
  ```
499
448
 
500
449
  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.
501
450
 
502
- See DEVELOPMENT.md §3 for boundary details and `memory/knowledge/decisions/2026-07-08-boundary-hook-consent-design.md` for the design decisions.
451
+ Details: DEVELOPMENT.md §3; design: `memory/knowledge/decisions/2026-07-08-boundary-hook-consent-design.md`.
503
452
 
504
453
  <!-- END GENERATED EGREGORE CODEX SPEC -->
@@ -34,6 +34,9 @@ fi
34
34
  type egregore_commit >/dev/null 2>&1 || egregore_commit() {
35
35
  local gd="$1" m="$3"; shift 3; git -C "$gd" commit -m "$m" "$@"
36
36
  }
37
+ type egregore_session_id >/dev/null 2>&1 || egregore_session_id() {
38
+ head -n 1 "$1/.egregore-session-id" 2>/dev/null; return 0
39
+ }
37
40
  type egregore_pr_skeleton >/dev/null 2>&1 || egregore_pr_skeleton() {
38
41
  printf '## What\n%s\n\n## Why\n%s\n\n## Verification\n%s\n\n%s\n' "$1" "$2" "$3" "$4"
39
42
  }
@@ -54,7 +57,12 @@ Runtime-neutral commands:
54
57
  Commit and push current repo + memory changes;
55
58
  PR body follows .claude/context/pr-format.md
56
59
  (auto-generated skeleton if not provided);
57
- new code PRs stay draft until --ready
60
+ new code PRs stay draft until --ready, which
61
+ first runs the checks CI would select here
62
+ merge <pr> [--receipt FILE] [--dry-run] [--local-receipt FILE]
63
+ Merge a PR into the integration branch through
64
+ the gate: green merges; a red check needs a
65
+ receipt naming it and why (bin/merge-gate.sh)
58
66
  autosave [status|on|off|scope|publish|merge] Personal ambient-save settings + consent
59
67
  wrap --topic T --summary TEXT Write a session wrap to memory/wraps
60
68
  handoff --from A --to B --topic T [--intent action|feedback|fyi]
@@ -148,9 +156,13 @@ save_memory() {
148
156
  branch="$(memory_branch)"
149
157
  [ -z "$branch" ] && branch="main"
150
158
  for _try in 1 2 3; do
151
- if git -C "$MEMORY_DIR" pull --rebase origin "$branch" --quiet 2>/dev/null \
152
- && git -C "$MEMORY_DIR" push origin "$branch" --quiet 2>/dev/null; then
153
- return 0
159
+ if git -C "$MEMORY_DIR" pull --rebase origin "$branch" --quiet 2>/dev/null; then
160
+ if bash "$SCRIPT_DIR/bin/memory-push.sh" --repository "$MEMORY_DIR" --branch "$branch" >/dev/null 2>&1; then
161
+ return 0
162
+ else
163
+ local push_status=$?
164
+ case "$push_status" in 75) ;; *) die "memory saved locally; guarded publication is pending review or reconciliation" ;; esac
165
+ fi
154
166
  fi
155
167
  sleep 1
156
168
  done
@@ -229,6 +241,7 @@ Egregore portable agent protocol
229
241
  7. Run `bin/agent.sh search "<query>"` to recall shared memory (decisions, handoffs, knowledge) before answering questions about past work.
230
242
  8. Run `bin/agent.sh branch --topic "<what you are working on>"` before code changes when you need a task branch/worktree.
231
243
  9. Run `bin/agent.sh save` and `bin/agent.sh wrap` for portable save/wrap flows.
244
+ 10. Run `bin/agent.sh merge <pr>` to merge a PR into its integration branch, never `gh pr merge`; a red check needs `--receipt <file>` naming each failing job and why.
232
245
 
233
246
  This protocol is runtime-neutral. Claude Code may still use .claude hooks and
234
247
  skills, while Codex or another agent can call this script directly.
@@ -403,9 +416,188 @@ build_pr_body() {
403
416
  "🤖 Saved via bin/agent.sh"
404
417
  }
405
418
 
419
+ # Inputs of each step the save regenerates, as Git pathspecs. The generators
420
+ # are the authority; re-derive a list when its generator changes. A step's
421
+ # own outputs count as inputs, so a hand edit is regenerated, not committed.
422
+ # codex-skills bin/codex-sync-skills.sh: the .codex/skills adapters, from
423
+ # .claude/skills frontmatter classified by the skill inventory
424
+ # (capability-distribution.json, egregore.json owned_skills)
425
+ # codex-spec bin/codex-render-spec.mjs: AGENTS.md and
426
+ # .codex/spec-manifest.json, from CLAUDE.md alone
427
+ # pi-spec bin/pi-render-spec.mjs: .pi/APPEND_SYSTEM.md, from AGENTS.md
428
+ # prime-spec bin/prime-render-spec.mjs: .prime/agent/APPEND_SYSTEM.md,
429
+ # from AGENTS.md
430
+ # bundles `npm run build:runtime` in packages/create-egregore, chaining
431
+ # bin/capability-distribution.mjs generate-skill-view and
432
+ # packages/create-egregore/scripts/build-runtime-bundle.mjs (Codex):
433
+ # AGENTS.md, .claude/context, .codex, .agents, docs/{credential-entry,spirit-discovery}.md,
434
+ # egregore_runtime and the bin allowlist; Pi and Prime copy this tree
435
+ # packages/create-egregore/scripts/build-claude-runtime-bundle.mjs:
436
+ # CLAUDE.md, .claude/{context,hooks,rules,skills}, the same docs, bin
437
+ # packages/create-egregore/scripts/build-pi-runtime-bundle.mjs: .pi, bin
438
+ # packages/create-egregore/scripts/build-prime-runtime-bundle.mjs: .prime, bin
439
+ # api/scripts/build-connect-runtime-pack.mjs: .claude/skills, .codex/skills
440
+ # Each reads capability-distribution.json, which selects what ships; the
441
+ # builders and the package.json script that chains them are inputs too.
442
+ # A directory stands in for the curated list inside it (bin for the
443
+ # allowlist): an unrelated change there costs a no-op build of about a
444
+ # second, while a missing input ships a stale bundle.
445
+ derivation_inputs() {
446
+ case "$1" in
447
+ codex-skills) printf '%s\n' .claude/skills .codex/skills capability-distribution.json \
448
+ egregore.json bin/codex-sync-skills.sh bin/capability-distribution.mjs ;;
449
+ codex-spec) printf '%s\n' CLAUDE.md AGENTS.md .codex/spec-manifest.json bin/codex-render-spec.mjs ;;
450
+ pi-spec) printf '%s\n' AGENTS.md .pi/APPEND_SYSTEM.md .pi/spec-manifest.json bin/pi-render-spec.mjs ;;
451
+ prime-spec) printf '%s\n' AGENTS.md .prime/agent/APPEND_SYSTEM.md \
452
+ .prime/agent/spec-manifest.json bin/prime-render-spec.mjs ;;
453
+ bundles) printf '%s\n' \
454
+ AGENTS.md CLAUDE.md capability-distribution.json docs/credential-entry.md docs/spirit-discovery.md \
455
+ bin egregore_runtime .agents .codex .pi .prime \
456
+ .claude/context .claude/hooks .claude/rules .claude/skills \
457
+ packages/create-egregore/package.json packages/create-egregore/scripts \
458
+ api/scripts/build-connect-runtime-pack.mjs ;;
459
+ esac
460
+ }
461
+
462
+ # What the counted steps write.
463
+ derivation_outputs() {
464
+ case "$1" in
465
+ codex-spec) printf '%s\n' AGENTS.md .codex/spec-manifest.json ;;
466
+ pi-spec) printf '%s\n' .pi/APPEND_SYSTEM.md .pi/spec-manifest.json ;;
467
+ prime-spec) printf '%s\n' .prime/agent/APPEND_SYSTEM.md .prime/agent/spec-manifest.json ;;
468
+ bundles) printf '%s\n' packages/create-egregore/runtime api/assets/connect-runtime-pack.json \
469
+ skill-distribution.json ;;
470
+ esac
471
+ }
472
+
473
+ # derivation_due BASE STEP: whether an input of STEP differs in the working
474
+ # tree or, on a task branch, since origin/BASE. Only a task branch's own
475
+ # commits reach its PR: a save from a protected branch starts a new one from
476
+ # origin/BASE. An unavailable comparison counts as a change: regenerating is
477
+ # idempotent, while skipping can commit a stale view.
478
+ derivation_due() {
479
+ local base="$1" path="" diff=""
480
+ local -a inputs=()
481
+ while IFS= read -r path; do inputs+=("$path"); done < <(derivation_inputs "$2")
482
+ [ -z "$(git -C "$SCRIPT_DIR" status --porcelain --untracked-files=normal -- "${inputs[@]}" 2>/dev/null | head -1)" ] \
483
+ || return 0
484
+ case "$(git -C "$SCRIPT_DIR" branch --show-current 2>/dev/null || true)" in
485
+ dev/*|feature/*|bugfix/*) ;;
486
+ *) return 1 ;;
487
+ esac
488
+ diff="$(git -C "$SCRIPT_DIR" diff --name-only "origin/$base...HEAD" -- "${inputs[@]}" 2>/dev/null)" || return 0
489
+ [ -n "$diff" ]
490
+ }
491
+
492
+ # derivation_changes STEP: how many of STEP's outputs differ from HEAD.
493
+ derivation_changes() {
494
+ local path=""
495
+ local -a outputs=()
496
+ while IFS= read -r path; do outputs+=("$path"); done < <(derivation_outputs "$1")
497
+ git -C "$SCRIPT_DIR" status --porcelain --untracked-files=all -- "${outputs[@]}" | wc -l | tr -d ' '
498
+ }
499
+
500
+ # run_derivation LABEL COMMAND...: run one step, keeping its output in
501
+ # DERIVED_OUTPUT; a failure shows the last lines and stops the save.
502
+ run_derivation() {
503
+ local label="$1"
504
+ shift
505
+ if ! DERIVED_OUTPUT="$("$@" 2>&1)"; then
506
+ printf '%s\n' "$DERIVED_OUTPUT" | tail -n 20 >&2
507
+ die "$label failed (output above); the save stopped before the project commit"
508
+ fi
509
+ }
510
+
511
+ # npm_build_runtime NPM NODE_DIR: the build's script chain calls bare node, so
512
+ # the node bin/node-run.sh resolved goes first on PATH, as in
513
+ # bin/artifact-renderer-install.sh.
514
+ npm_build_runtime() {
515
+ cd "$SCRIPT_DIR/packages/create-egregore" && PATH="$2:$PATH" "$1" run build:runtime
516
+ }
517
+
518
+ # Regenerate the derived views and runtime bundles before the save commits, so
519
+ # the commit carries them and CI's checks stay a backstop. Steps run in the
520
+ # order their inputs require: the Codex adapters and the three specs feed the
521
+ # bundles, and the Codex render's AGENTS.md feeds the Pi and Prime specs. Each
522
+ # runs only when derivation_due says so and prints one receipt line; a failure
523
+ # stops the save. Sets DERIVED_SUBJECT for a commit of regeneration alone.
524
+ regenerate_derived() {
525
+ local base="$1" spec="" specs="" rendered="" made="" count="" review="" path="" node_bin="" npm_bin=""
526
+ local -a inputs=() fresh=()
527
+
528
+ if [ ! -f "$SCRIPT_DIR/bin/codex-sync-skills.sh" ]; then
529
+ echo "codex skills: not applicable"
530
+ elif ! derivation_due "$base" codex-skills; then
531
+ echo "codex skills: current"
532
+ else
533
+ run_derivation "codex skill sync" bash "$SCRIPT_DIR/bin/codex-sync-skills.sh"
534
+ count="$(printf '%s\n' "$DERIVED_OUTPUT" | grep -c '^generated adapter: ' || true)"
535
+ case "$count" in
536
+ 0) echo "codex skills: current" ;;
537
+ 1) echo "codex skills: synced (1 file)"; made="codex adapters" ;;
538
+ *) echo "codex skills: synced ($count files)"; made="codex adapters" ;;
539
+ esac
540
+ fi
541
+
542
+ for spec in codex pi prime; do
543
+ [ -f "$SCRIPT_DIR/bin/$spec-render-spec.mjs" ] || continue
544
+ specs="$specs $spec"
545
+ derivation_due "$base" "$spec-spec" || continue
546
+ run_derivation "$spec spec render" bash "$SCRIPT_DIR/bin/node-run.sh" "$SCRIPT_DIR/bin/$spec-render-spec.mjs"
547
+ [ "$(derivation_changes "$spec-spec")" = 0 ] || rendered="${rendered:+$rendered, }$spec"
548
+ done
549
+ if [ -z "$specs" ]; then
550
+ echo "specs: not applicable"
551
+ elif [ -z "$rendered" ]; then
552
+ echo "specs: current"
553
+ else
554
+ echo "specs: rendered ($rendered)"
555
+ made="${made:+$made, }specs"
556
+ fi
557
+ # A hand-written Codex section keeps its text when CLAUDE.md changes under
558
+ # it; the render refreshes only the source hash that --check used to flag.
559
+ case "$rendered" in
560
+ codex*)
561
+ review="$(git -C "$SCRIPT_DIR" show HEAD:.codex/spec-manifest.json 2>/dev/null \
562
+ | jq -r --slurpfile now "$SCRIPT_DIR/.codex/spec-manifest.json" '
563
+ (reduce (.sections // [])[] as $s ({}; .[$s.section] = $s.sourceHash)) as $was
564
+ | [$now[0].sections[] | select(.action == "replace" and $was[.section] != .sourceHash) | .section]
565
+ | join(", ")' 2>/dev/null)" || review=""
566
+ [ -z "$review" ] || echo "specs: review the hand-written Codex sections in bin/codex-render-spec.mjs: $review"
567
+ ;;
568
+ esac
569
+
570
+ DERIVED_SUBJECT="chore(bundles): regenerate ${made:+$made and }runtime bundles"
571
+ if ! derivation_due "$base" bundles; then
572
+ echo "bundles: current"
573
+ return 0
574
+ fi
575
+ # The builders copy only files Git tracks, so new and deleted inputs enter
576
+ # the index first: a new module ships beside its callers, and a deleted one
577
+ # leaves the bundle instead of failing the copy.
578
+ while IFS= read -r path; do inputs+=("$path"); done < <(derivation_inputs bundles)
579
+ while IFS= read -r -d '' path; do fresh+=("$path"); done \
580
+ < <(git -C "$SCRIPT_DIR" ls-files -z --others --deleted --exclude-standard -- "${inputs[@]}")
581
+ if [ "${#fresh[@]}" -gt 0 ]; then
582
+ git -C "$SCRIPT_DIR" add -A -- "${fresh[@]}" >/dev/null 2>&1 || die "could not stage new bundle inputs"
583
+ fi
584
+ node_bin="$(bash "$SCRIPT_DIR/bin/node-run.sh" -p 'process.execPath')" \
585
+ || die "the bundle rebuild needs Node; install Node 22, then save again"
586
+ npm_bin="$(command -v npm 2>/dev/null || true)"
587
+ [ -n "$npm_bin" ] || npm_bin="${node_bin%/*}/npm"
588
+ [ -x "$npm_bin" ] || die "the bundle rebuild needs npm; install Node with npm, then save again"
589
+ run_derivation "bundle rebuild" npm_build_runtime "$npm_bin" "${node_bin%/*}"
590
+ count="$(derivation_changes bundles)" || die "could not read the bundles after the rebuild"
591
+ case "$count" in
592
+ 0) echo "bundles: current" ;;
593
+ 1) echo "bundles: rebuilt (1 file changed)" ;;
594
+ *) echo "bundles: rebuilt ($count files changed)" ;;
595
+ esac
596
+ }
597
+
406
598
  cmd_save() {
407
599
  local message="" topic="" no_pr=0 branch base pushed="false" committed="false" pr_url="" existing_pr="" pr_number="" merged="false" pr_body="" pr_body_file=""
408
- local readiness="" pr_draft="" changed_paths="" non_code="" use_pr=0
600
+ local readiness="" pr_draft="" changed_paths="" non_code="" use_pr=0 commit_message="" tree_was_clean=0 checks_failed=0
409
601
  local -a create_args
410
602
 
411
603
  while [ $# -gt 0 ]; do
@@ -450,12 +642,26 @@ cmd_save() {
450
642
  echo "memory: synced"
451
643
  fi
452
644
 
645
+ commit_message="$message"
646
+ # Installed instances carry the derived views and bundles but not the
647
+ # builders; /update regenerates their views.
648
+ if [ -f "$SCRIPT_DIR/packages/create-egregore/package.json" ]; then
649
+ [ -n "$(git -C "$SCRIPT_DIR" status --porcelain --untracked-files=normal 2>/dev/null | head -1)" ] \
650
+ || tree_was_clean=1
651
+ regenerate_derived "$base"
652
+ # On a clean tree the regeneration makes the only changes, so they commit
653
+ # under their own subject; the caller's message describes committed work.
654
+ [ "$tree_was_clean" = "0" ] || commit_message="$DERIVED_SUBJECT"
655
+ else
656
+ printf '%s\n' "codex skills: not applicable" "specs: not applicable" "bundles: not applicable"
657
+ fi
658
+
453
659
  branch="$(git -C "$SCRIPT_DIR" branch --show-current 2>/dev/null || echo "")"
454
660
  if [ -n "$(git -C "$SCRIPT_DIR" status --porcelain 2>/dev/null | head -1)" ]; then
455
661
  branch="$(ensure_working_branch "$topic")"
456
662
  git -C "$SCRIPT_DIR" add -A >/dev/null 2>&1 || die "git add failed"
457
663
  if ! git -C "$SCRIPT_DIR" diff --cached --quiet 2>/dev/null; then
458
- egregore_commit "$SCRIPT_DIR" "$SCRIPT_DIR" "$message" --quiet || die "git commit failed"
664
+ egregore_commit "$SCRIPT_DIR" "$SCRIPT_DIR" "$commit_message" --quiet || die "git commit failed"
459
665
  committed="true"
460
666
  fi
461
667
  fi
@@ -486,6 +692,18 @@ cmd_save() {
486
692
  if [ -n "$pr_url" ]; then
487
693
  pr_number="$(printf '%s' "$existing_pr" | jq -r '.[0].number')"
488
694
  pr_draft="$(printf '%s' "$existing_pr" | jq -r '.[0].isDraft')"
695
+ fi
696
+ # A PR goes ready only after the checks CI would select pass here. On a
697
+ # failure the work is still pushed, as a draft, so GitHub never spends
698
+ # a run on what this machine already saw fail. Installed instances do
699
+ # not ship the runner.
700
+ if [ "$readiness" = "--ready" ] && [ -f "$SCRIPT_DIR/bin/ci-local.py" ]; then
701
+ if ! python3 "$SCRIPT_DIR/bin/ci-local.py" --base "$base"; then
702
+ checks_failed=1
703
+ readiness="--draft"
704
+ fi
705
+ fi
706
+ if [ -n "$pr_url" ]; then
489
707
  # Convert before push: a synchronize event must already see the draft.
490
708
  if [ "$readiness" = "--draft" ] && [ "$pr_draft" = "false" ]; then
491
709
  (cd "$SCRIPT_DIR" && gh pr ready "$pr_number" --undo) \
@@ -545,6 +763,10 @@ cmd_save() {
545
763
  [ -n "$pr_url" ] && echo "pr: $pr_url"
546
764
  [ -n "$pr_draft" ] && echo "pr-draft: $pr_draft"
547
765
  [ "$merged" = "true" ] && echo "merge: non-coding, merged to $base"
766
+ if [ "$checks_failed" = "1" ]; then
767
+ echo "local checks failed: the work is pushed and the PR stays a draft; fix the checks above, then save again with --ready" >&2
768
+ return 1
769
+ fi
548
770
  return 0
549
771
  }
550
772
 
@@ -608,7 +830,7 @@ cmd_wrap() {
608
830
  local capture_args=(--mode personal)
609
831
  tmpd="$(mktemp -d -t egregore-agent-wrap-XXXXXX)"
610
832
  trap 'rm -rf "$tmpd"' RETURN
611
- session_id="$(cat "$SCRIPT_DIR/.egregore-session-id" 2>/dev/null || true)"
833
+ session_id="$(egregore_session_id "$SCRIPT_DIR")"
612
834
  branch="$(git -C "$SCRIPT_DIR" branch --show-current 2>/dev/null || true)"
613
835
  [ "$no_push" = "1" ] && capture_args+=(--no-push)
614
836
 
@@ -884,7 +1106,9 @@ case "${1:-}" in
884
1106
  people) shift; cmd_people "$@" ;;
885
1107
  branch) shift; cmd_branch "$@" ;;
886
1108
  save) shift; cmd_save "$@" ;;
1109
+ merge) shift; exec bash "$SCRIPT_DIR/bin/merge-gate.sh" "$@" ;;
887
1110
  autosave) shift; bash "$SCRIPT_DIR/bin/autosave.sh" "$@" ;;
1111
+ records) shift; bash "$SCRIPT_DIR/bin/records.sh" "$@" ;;
888
1112
  wrap) shift; cmd_wrap "$@" ;;
889
1113
  wrap-card) shift; render_wrap_card "$@" ;;
890
1114
  handoff) shift; cmd_handoff "$@" ;;