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
@@ -3,11 +3,40 @@ set -o pipefail
3
3
 
4
4
  # Framework version — bumped on greeting/startup changes.
5
5
  # Used for drift detection across team members.
6
- FRAMEWORK_VERSION="7"
6
+ FRAMEWORK_VERSION="8"
7
7
 
8
8
  SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
9
9
  cd "$SCRIPT_DIR"
10
10
 
11
+ # --- Card delivery by contract (bin/lib/card-delivery.sh) ---
12
+ # Inside a Claude Code hook the harness shows the card to the user (hook
13
+ # systemMessage) and the model receives only the context, so the model never
14
+ # retypes it. The launcher-printed card (#1420/#1472) could not do this: Claude
15
+ # Code ≥2.1.89 boots into the alternate screen and hid it (#1493).
16
+ # The startup runs as an inner pass with its stdout captured to a file:
17
+ # anything printed before the greeting (worktree warnings, repo checks,
18
+ # onboarding_needed) stays out of the JSON, and detached jobs inherit the file
19
+ # rather than the hook's pipe. With a fresh saved card the outer pass instead
20
+ # runs a quick pass (per-session work only), shows the saved card, and runs
21
+ # the full startup detached as a refresh pass. Harness mode exists only inside
22
+ # these passes, so a run that cannot capture falls back to the plain greeting
23
+ # and its display instruction.
24
+ source "$SCRIPT_DIR/bin/lib/card-delivery.sh"
25
+ _CARD_PASS=""
26
+ case "${_EGREGORE_CARD_PASS:-}" in
27
+ inner|quick|refresh)
28
+ _CARD_PASS="$_EGREGORE_CARD_PASS"
29
+ EGREGORE_CARD_DELIVERY="harness"
30
+ export -n EGREGORE_CARD_DELIVERY _EGREGORE_CARD_PASS 2>/dev/null || true
31
+ ;;
32
+ *)
33
+ if [ "$(egregore_card_delivery_mode)" = "harness" ]; then
34
+ egregore_card_outer_pass "$SCRIPT_DIR" "$FRAMEWORK_VERSION"
35
+ fi
36
+ EGREGORE_CARD_DELIVERY="text"
37
+ ;;
38
+ esac
39
+
11
40
  # --- Transient development-checkout detection ---
12
41
  # Git worktrees have .git as a FILE. The launcher also marks standalone
13
42
  # development clones as transient so startup preserves their feature branch
@@ -30,6 +59,9 @@ if [ -f "$SCRIPT_DIR/bin/lib/worktree-links.sh" ]; then
30
59
  egregore_link_shared_state "$SCRIPT_DIR" "$MAIN_PROJECT_DIR" >/dev/null 2>/dev/null || true
31
60
  fi
32
61
 
62
+ # A refresh pass runs after the session is live: the quick pass already reset
63
+ # consent, and a grant the user gave since then must survive.
64
+ if [ "$_CARD_PASS" != "refresh" ]; then
33
65
  # Clear any branch-guard consent from a previous session — consent to write on
34
66
  # a protected branch is asked fresh each session (see CLAUDE.md branch-guard protocol).
35
67
  rm -f "$SCRIPT_DIR/.egregore-branch-consent" "$MAIN_PROJECT_DIR/.egregore-branch-consent" 2>/dev/null
@@ -38,6 +70,7 @@ rm -f "$SCRIPT_DIR/.egregore-branch-consent" "$MAIN_PROJECT_DIR/.egregore-branch
38
70
  rm -f "$SCRIPT_DIR/.egregore-boundary-consent" "$MAIN_PROJECT_DIR/.egregore-boundary-consent" 2>/dev/null
39
71
  # Prune abandoned scratch without blocking startup or fresh sibling work.
40
72
  ( bash "$SCRIPT_DIR/bin/scratch-sweep.sh" --older-than 60 >/dev/null 2>&1 & ) 2>/dev/null
73
+ fi
41
74
 
42
75
  # --- Health tracking (rendered as dots in greeting) ---
43
76
  HEALTH_GITHUB="skip"
@@ -68,6 +101,22 @@ egregore_trace_mark "libs-loaded" 2>/dev/null || true
68
101
  # ============================================================
69
102
  # 1. Resolve identity
70
103
  # ============================================================
104
+ # Claude Code hands this hook its own session id on stdin. identity.sh maps
105
+ # it to the Egregore id it mints (bin/session-id.sh), so this session's
106
+ # commits resolve their own id. Shell variables only: daemons started here
107
+ # outlive the session and must not inherit it. Only a SessionStart hook run
108
+ # (Claude Code sets CLAUDE_ENV_FILE for those alone) reads stdin; every other
109
+ # run, manual or scripted, never waits on it and maps nothing.
110
+ if [ -n "${CLAUDE_ENV_FILE:-}" ] && [ ! -t 0 ] && command -v jq >/dev/null 2>&1; then
111
+ _HOOK_INPUT=""
112
+ IFS= read -r -t 1 -d '' _HOOK_INPUT || true
113
+ _HOOK_SESSION=$(printf '%s' "$_HOOK_INPUT" | jq -r '.session_id // empty' 2>/dev/null || true)
114
+ if [ -n "$_HOOK_SESSION" ]; then
115
+ EGREGORE_NATIVE_SESSION_ID="$_HOOK_SESSION" EGREGORE_NATIVE_HARNESS=claude
116
+ EGREGORE_START_HARNESS=claude
117
+ fi
118
+ unset _HOOK_INPUT _HOOK_SESSION
119
+ fi
71
120
  source "$SCRIPT_DIR/bin/lib/identity.sh"
72
121
  egregore_trace_mark "identity" 2>/dev/null || true
73
122
 
@@ -171,7 +220,7 @@ if [ "$LOCAL_MODE" != "true" ]; then
171
220
  if [ -n "$EXPECTED_SLUG" ] && [ "$KEY_SLUG" != "$EXPECTED_SLUG" ] \
172
221
  && _graph_projection_enabled; then
173
222
  # Slug differs from config — ask the API whether the key actually works
174
- PROBE_URL=$(jq -r '.api_url // empty' "$CONFIG" 2>/dev/null)
223
+ PROBE_URL=$(_config_api_url) || PROBE_URL=""
175
224
  PROBE_CODE="000"
176
225
  if [ -n "$PROBE_URL" ]; then
177
226
  PROBE_CODE=$(curl -s -o /dev/null -w '%{http_code}' \
@@ -200,7 +249,7 @@ if [ "$LOCAL_MODE" != "true" ]; then
200
249
  fi
201
250
  fi
202
251
 
203
- if [ "$KEY_NEEDS_FIX" = "true" ]; then
252
+ if [ "$KEY_NEEDS_FIX" = "true" ] && [ "$_CARD_PASS" != "quick" ]; then
204
253
  # Plain background job, NOT double-forked: git-sync's `wait` must join this
205
254
  # before the graph bootstrap runs — a repaired key that lands after boot
206
255
  # means that launch already skipped auto-capture with no WAL entry to
@@ -208,7 +257,7 @@ if [ "$KEY_NEEDS_FIX" = "true" ]; then
208
257
  # fine, this block never runs) and bounds broken-key boots at curl's 10s cap.
209
258
  (
210
259
  GITHUB_TOKEN=$(grep '^GITHUB_TOKEN=' "$ENV_FILE" 2>/dev/null | cut -d'=' -f2-)
211
- API_URL=$(jq -r '.api_url // empty' "$CONFIG" 2>/dev/null)
260
+ API_URL=$(_config_api_url) || API_URL=""
212
261
  GITHUB_ORG=$(jq -r '.github_org // empty' "$CONFIG" 2>/dev/null)
213
262
 
214
263
  if [ -n "$GITHUB_TOKEN" ] && [ -n "$API_URL" ] && [ -n "$GITHUB_ORG" ]; then
@@ -245,158 +294,48 @@ fi
245
294
  # 4. Instance registry + boundary
246
295
  # ============================================================
247
296
 
248
- # --- Self-register in instance registry (for pre-registry installs) ---
249
- # Worktrees should NOT register as separate instances
250
- # Wrapped in subshell — registration is optional, must not block session start
251
- if [ "$IS_WORKTREE" = "false" ] && command -v jq &>/dev/null && [ -f "$CONFIG" ]; then
297
+ # --- Instance registry maintenance (bin/lib/instance-registry.sh) ---
298
+ # Prune entries that are runtime state of another instance (a checkout inside
299
+ # its .egregore/, such as an evaluation sandbox), then self-register this
300
+ # checkout (for pre-registry installs). Worktrees should NOT register as
301
+ # separate instances, and neither does runtime state. Wrapped in a subshell —
302
+ # maintenance is optional and must not block session start.
303
+ if [ "$_CARD_PASS" != "quick" ] && command -v jq &>/dev/null && [ -f "$SCRIPT_DIR/bin/lib/instance-registry.sh" ]; then
252
304
  ( (
253
305
  REGISTRY_DIR="$HOME/.egregore"
254
306
  REGISTRY="$REGISTRY_DIR/instances.json"
255
- INST_SLUG=$(jq -r '.slug // empty' "$CONFIG")
256
- if [ -z "$INST_SLUG" ]; then
257
- # No slug in egregore.json — skip instance registration
258
- exit 0
259
- fi
260
- INST_NAME=$(jq -r '.org_name // empty' "$CONFIG")
261
- INST_ORG=$(jq -r '.org_id // empty' "$CONFIG")
262
-
263
- if [ -n "$INST_SLUG" ] && [ -n "$INST_NAME" ]; then
264
- mkdir -p "$REGISTRY_DIR"
265
- if [ ! -f "$REGISTRY" ]; then echo "[]" > "$REGISTRY"; fi
266
-
267
- ALREADY=$(jq --arg p "$SCRIPT_DIR" '[.[] | select(.path == $p)] | length' "$REGISTRY")
268
- if [ "$ALREADY" = "0" ]; then
269
- # org_id is the stable identity other sessions use to prove this
270
- # checkout is same-organization rather than foreign
271
- ENTRY=$(jq -n --arg s "$INST_SLUG" --arg n "$INST_NAME" --arg p "$SCRIPT_DIR" --arg o "$INST_ORG" \
272
- '{slug: $s, name: $n, path: $p} + (if $o == "" then {} else {org_id: $o} end)')
273
- jq --argjson e "$ENTRY" '. + [$e]' "$REGISTRY" > "$REGISTRY.tmp" \
274
- && mv "$REGISTRY.tmp" "$REGISTRY"
275
- elif [ -n "$INST_ORG" ]; then
276
- # Backward compatibility: patch this checkout's own legacy entry with
277
- # its org_id so other sessions can prove identity instead of failing
278
- # closed against it
279
- jq --arg p "$SCRIPT_DIR" --arg o "$INST_ORG" \
280
- 'map(if .path == $p and ((.org_id // "") == "") then . + {org_id: $o} else . end)' \
281
- "$REGISTRY" > "$REGISTRY.tmp" \
282
- && mv "$REGISTRY.tmp" "$REGISTRY"
283
- fi
307
+ source "$SCRIPT_DIR/bin/lib/instance-registry.sh"
308
+ egregore_registry_prune "$REGISTRY"
309
+ if [ "$IS_WORKTREE" = "false" ] && [ -f "$CONFIG" ]; then
310
+ # Registration needs a slug and org_name in egregore.json; without them it does nothing.
311
+ INST_SLUG=$(jq -r '.slug // empty' "$CONFIG")
312
+ INST_NAME=$(jq -r '.org_name // empty' "$CONFIG")
313
+ INST_ORG=$(jq -r '.org_id // empty' "$CONFIG")
314
+ egregore_registry_register "$REGISTRY" "$SCRIPT_DIR" "$INST_SLUG" "$INST_NAME" "$INST_ORG"
284
315
  fi
285
316
  ) >/dev/null 2>&1 & ) 2>/dev/null || true
286
317
  fi
287
318
 
288
319
  # --- Compute session boundary for environment isolation ---
289
320
  compute_boundary() {
290
- local hash
291
- hash=$(echo -n "$SCRIPT_DIR" | md5 2>/dev/null || echo -n "$SCRIPT_DIR" | md5sum 2>/dev/null | cut -d' ' -f1)
292
- local boundary_file="/tmp/egregore-boundary-${hash}.json"
293
- local project_dir="$SCRIPT_DIR"
294
-
295
- # Resolve memory directory (follow symlink)
296
- local memory_dir=""
297
- if [ -L "$SCRIPT_DIR/memory" ]; then
298
- memory_dir=$(realpath "$SCRIPT_DIR/memory" 2>/dev/null || echo "")
299
- fi
300
-
301
- # Validate and resolve managed repos
302
- local managed_repos_json="[]"
303
- local parent_dir
304
- parent_dir="$(dirname "$SCRIPT_DIR")"
305
- local repos
306
- repos=$(jq -r '(.repos[]? // empty) | if type == "object" then .name else . end' "$SCRIPT_DIR/egregore.json" 2>/dev/null)
307
- if [ -n "$repos" ]; then
308
- # Validate repos first
321
+ # repos[] traversal warnings stay visible in the greeting.
322
+ if [ -n "$(jq -r '(.repos[]? // empty)' "$SCRIPT_DIR/egregore.json" 2>/dev/null)" ]; then
309
323
  bash "$SCRIPT_DIR/bin/boundary.sh" validate-repos 2>/dev/null || true
310
- managed_repos_json="["
311
- local first=true
312
- for repo in $repos; do
313
- # Skip entries with path traversal or absolute paths
314
- [[ "$repo" == *".."* ]] && continue
315
- [[ "$repo" == /* ]] && continue
316
- local resolved
317
- resolved=$(realpath "$parent_dir/$repo" 2>/dev/null || echo "")
318
- [ -z "$resolved" ] && continue
319
- # Must resolve under parent directory
320
- [[ "$resolved" != "$parent_dir"/* ]] && continue
321
- $first || managed_repos_json="$managed_repos_json,"
322
- managed_repos_json="$managed_repos_json\"$resolved\""
323
- first=false
324
- done
325
- managed_repos_json="$managed_repos_json]"
326
- fi
327
-
328
- # Collect denied paths from instance registry. Only checkouts proven to
329
- # share this instance's stable organization identity (org_id) are excluded;
330
- # ancestry or a matching slug proves nothing, and entries without org_id
331
- # stay denied (fail closed). Shared logic: bin/boundary.sh compute-denied.
332
- local denied_paths_json="[]"
333
- local registry="$HOME/.egregore/instances.json"
334
- if [ -f "$registry" ]; then
335
- local self_org
336
- self_org=$(jq -r '.org_id // empty' "$SCRIPT_DIR/egregore.json" 2>/dev/null)
337
- denied_paths_json=$(bash "$SCRIPT_DIR/bin/boundary.sh" compute-denied \
338
- "$registry" "$project_dir" "$self_org" 2>/dev/null || echo "[]")
339
- case "$denied_paths_json" in "["*) ;; *) denied_paths_json="[]" ;; esac
340
- fi
341
-
342
- # --- Boundary policy: posture + read roots (two-tier consent model) ---
343
- # Org layer: egregore.json .boundary { posture, read[], locked } — committed.
344
- # Personal layer: .egregore-boundary.local.json { posture, read[] } — gitignored,
345
- # ignored entirely when the org layer sets locked: true.
346
- local posture locked personal_file="$SCRIPT_DIR/.egregore-boundary.local.json"
347
- posture=$(jq -r '.boundary.posture // "standard"' "$SCRIPT_DIR/egregore.json" 2>/dev/null)
348
- locked=$(jq -r '.boundary.locked // false' "$SCRIPT_DIR/egregore.json" 2>/dev/null)
349
- case "$posture" in strict|standard|open) ;; *) posture="standard" ;; esac
350
- [ "$locked" = "true" ] || locked="false"
351
- if [ "$locked" != "true" ] && [ -f "$personal_file" ]; then
352
- local p_posture
353
- p_posture=$(jq -r '.posture // empty' "$personal_file" 2>/dev/null)
354
- case "$p_posture" in strict|standard|open) posture="$p_posture" ;; esac
355
324
  fi
356
325
 
357
- # Read roots: inbox defaults (unless strict) + org read[] + personal read[] (unless locked)
358
- local read_roots_json="[]" raw_roots=""
359
- if [ "$posture" != "strict" ]; then
360
- raw_roots="$HOME/Downloads
361
- $HOME/Desktop"
362
- fi
363
- local org_roots
364
- org_roots=$(jq -r '.boundary.read[]? // empty' "$SCRIPT_DIR/egregore.json" 2>/dev/null)
365
- [ -n "$org_roots" ] && raw_roots="$raw_roots
366
- $org_roots"
367
- if [ "$locked" != "true" ] && [ -f "$personal_file" ]; then
368
- local personal_roots
369
- personal_roots=$(jq -r '.read[]? // empty' "$personal_file" 2>/dev/null)
370
- [ -n "$personal_roots" ] && raw_roots="$raw_roots
371
- $personal_roots"
372
- fi
373
- if [ -n "$raw_roots" ]; then
374
- read_roots_json=$(printf '%s\n' "$raw_roots" | sed -e '/^$/d' -e "s|^~|$HOME|" | sort -u | jq -R . | jq -s -c .)
375
- [ -z "$read_roots_json" ] && read_roots_json="[]"
376
- fi
326
+ # Memory, managed repos, denied instances (only checkouts proven to share
327
+ # this instance's org_id are excluded; ancestry or a slug proves nothing),
328
+ # posture and read roots come from one shared computation — the same one the
329
+ # Codex/Pi/Prime session start, worktree creation, and every pre-action
330
+ # check use. An unreadable registry is recorded, never read as empty.
331
+ local deny_rules settings_local="$SCRIPT_DIR/.claude/settings.local.json"
332
+ bash "$SCRIPT_DIR/bin/node-run.sh" "$SCRIPT_DIR/bin/boundary-guard.cjs" write-cache "$SCRIPT_DIR" >/dev/null 2>&1 || true
377
333
 
378
- # Write boundary file (atomic: write to tmp, then mv)
379
- jq -n \
380
- --arg project_dir "$project_dir" \
381
- --arg memory_dir "$memory_dir" \
382
- --arg posture "$posture" \
383
- --argjson locked "$locked" \
384
- --argjson read_roots "$read_roots_json" \
385
- --argjson managed_repos "$managed_repos_json" \
386
- --argjson denied_paths "$denied_paths_json" \
387
- '{project_dir: $project_dir, memory_dir: $memory_dir, posture: $posture, locked: $locked, read_roots: $read_roots, managed_repos: $managed_repos, denied_paths: $denied_paths}' \
388
- > "$boundary_file.tmp" && mv "$boundary_file.tmp" "$boundary_file"
389
-
390
- # Generate dynamic deny rules in .claude/settings.local.json
391
- local settings_local="$SCRIPT_DIR/.claude/settings.local.json"
392
- local deny_rules="[]"
393
- if [ "$denied_paths_json" != "[]" ]; then
394
- deny_rules=$(echo "$denied_paths_json" | jq '[.[] | "Read(" + . + "/**)", "Edit(" + . + "/**)"]')
395
- fi
396
- # Deny writing to instance registry (reads allowed for multi-instance features).
397
- # Edit() alone covers Write/NotebookEdit too — Write() rules are never matched by
398
- # the permission checker and only trigger a startup "not matched" warning if included.
399
- deny_rules=$(echo "$deny_rules" | jq '. + ["Edit(~/.egregore/instances.json)"]')
334
+ # Claude's native deny rules (a second line of defence behind the hook):
335
+ # generated by the same module, so they carry its self-scope carve-out and
336
+ # registry protection instead of a second copy of the rules.
337
+ deny_rules=$(bash "$SCRIPT_DIR/bin/node-run.sh" "$SCRIPT_DIR/bin/boundary-guard.cjs" native-denials "$SCRIPT_DIR" 2>/dev/null) || return 0
338
+ printf '%s' "$deny_rules" | jq -e 'type == "array"' >/dev/null 2>&1 || return 0
400
339
 
401
340
  # Merge with existing settings.local.json — only touch permissions.deny
402
341
  mkdir -p "$SCRIPT_DIR/.claude"
@@ -409,15 +348,49 @@ $personal_roots"
409
348
  fi
410
349
  }
411
350
 
412
- # Run boundary computation (non-blocking, but fast — just file I/O)
413
- compute_boundary 2>/dev/null || true
351
+ # Run boundary computation (non-blocking, but fast — just file I/O). The
352
+ # quick pass already wrote it for a refreshing session.
353
+ [ "$_CARD_PASS" != "refresh" ] && { compute_boundary 2>/dev/null || true; }
354
+
355
+ # The quick pass ends here: the per-session work is done and the outer pass
356
+ # shows the saved card, then runs everything below as a detached refresh.
357
+ # That refresh leaves working trees alone under the live session
358
+ # (EGREGORE_GIT_SYNC_LIVE), so the checkout and the managed repos on their
359
+ # base branch catch up to the last fetch here: local, no network. The fast
360
+ # path runs only on the base branch.
361
+ if [ "$_CARD_PASS" = "quick" ]; then
362
+ # No hooks: a post-merge hook must never stall the hook's quick path.
363
+ if [ "$(git branch --show-current 2>/dev/null)" = "$BASE_BRANCH" ]; then
364
+ git -c core.hooksPath=/dev/null merge --ff-only "origin/$BASE_BRANCH" --quiet >/dev/null 2>&1 || true
365
+ fi
366
+ for _REPO in $(jq -r '(.repos[]? // empty) | if type == "object" then .name else . end' "$SCRIPT_DIR/egregore.json" 2>/dev/null); do
367
+ case "$_REPO" in *..*|/*) continue ;; esac # as bin/boundary.sh: siblings only
368
+ _REPO_DIR="$SCRIPT_DIR/../$_REPO"
369
+ [ -d "$_REPO_DIR/.git" ] || continue
370
+ _REPO_BASE=$(_get_base_branch "$_REPO" 2>/dev/null) || continue
371
+ [ "$(git -C "$_REPO_DIR" branch --show-current 2>/dev/null)" = "$_REPO_BASE" ] || continue
372
+ git -C "$_REPO_DIR" -c core.hooksPath=/dev/null merge --ff-only "origin/$_REPO_BASE" --quiet >/dev/null 2>&1 || true
373
+ done
374
+ egregore_trace_end 2>/dev/null || true
375
+ printf 'egregore-quick-ok %s\n' "$EGREGORE_SESSION_ID"
376
+ exit 0
377
+ fi
378
+ [ "$_CARD_PASS" = "refresh" ] && EGREGORE_GIT_SYNC_LIVE=1
414
379
 
415
380
  # ============================================================
416
381
  # 5. Git sync
417
382
  # ============================================================
418
383
  egregore_trace_mark "branch-onboarding-mode-boundary" 2>/dev/null || true
384
+ source "$SCRIPT_DIR/bin/lib/startup-restart.sh"
385
+ _STARTUP_HEAD=$(egregore_startup_head)
419
386
  source "$SCRIPT_DIR/bin/lib/git-sync.sh"
420
387
  egregore_trace_mark "git-sync" 2>/dev/null || true
388
+ # A sync that pulled a newer startup finishes on it (bin/lib/startup-restart.sh),
389
+ # in the same card pass.
390
+ [ -n "$_CARD_PASS" ] && export _EGREGORE_CARD_PASS="$_CARD_PASS"
391
+ egregore_startup_restart "$_STARTUP_HEAD" "$SCRIPT_DIR/bin/session-start.sh"
392
+ export -n _EGREGORE_CARD_PASS 2>/dev/null || true
393
+ unset _STARTUP_HEAD
421
394
 
422
395
  # Resolve a legacy instance's stable Runtime identity before SessionStart
423
396
  # finishes and UserPromptSubmit can invoke Observe. Once persisted this is a
@@ -689,12 +662,9 @@ if [ "$IS_WORKTREE" != "true" ]; then
689
662
  || rm -f "$_CARD_FILE.tmp.$$" 2>/dev/null || true
690
663
  fi
691
664
 
692
- # The greeting always renders in-chat — identical across OSS and Connect and
693
- # across launch paths. The launcher-rendered card fast path (EGREGORE_CARD_SHOWN)
694
- # was reverted: Claude Code ≥2.1.89 boots into the alternate screen buffer,
695
- # which hides anything a launcher prints pre-launch (see PR #1493 for the
696
- # parked re-enable). The card cache write above stays — it is harmless and the
697
- # re-enable path depends on it.
665
+ # In a Claude Code hook this output is captured by the outer pass at the top
666
+ # of this script, which turns it into the card-delivery envelope.
698
667
  cat "$_GREETING_BUF"
668
+ ( bash "$SCRIPT_DIR/bin/session-record.sh" --mode sweep >/dev/null 2>&1 & ) 2>/dev/null
699
669
  rm -f "$_GREETING_BUF" 2>/dev/null || true
700
670
  egregore_trace_end 2>/dev/null || true
@@ -23,6 +23,8 @@ set -euo pipefail
23
23
 
24
24
  SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
25
25
  CONFIG="$SCRIPT_DIR/egregore.json"
26
+ # shellcheck source=bin/lib/config.sh
27
+ source "$SCRIPT_DIR/bin/lib/config.sh"
26
28
 
27
29
  # ── helpers ──────────────────────────────────────────────────────────────
28
30
 
@@ -54,7 +56,7 @@ _save() {
54
56
  # start's settings sync (bin/lib/settings-drift.sh).
55
57
  _control_plane_push() {
56
58
  local api_url api_key payload actor response revision
57
- api_url=$(jq -r '.api_url // empty' "$CONFIG" 2>/dev/null)
59
+ api_url=$(_config_api_url) || return 0
58
60
  [ -n "$api_url" ] || return 0
59
61
  api_key=$(grep '^EGREGORE_API_KEY=' "$SCRIPT_DIR/.env" 2>/dev/null | cut -d'=' -f2- || true)
60
62
  [ -n "$api_key" ] || return 0
@@ -70,10 +72,13 @@ _control_plane_push() {
70
72
  --data-binary "$payload" 2>/dev/null) || return 0
71
73
  revision=$(printf '%s' "$response" | jq -r '.settings_revision // empty' 2>/dev/null)
72
74
  if [ -n "$revision" ] && [ -f "$SCRIPT_DIR/.egregore-state.json" ]; then
73
- local st
74
- st="$(mktemp "$SCRIPT_DIR/.egregore-state.json.XXXXXX")" || return 0
75
- if jq --arg rev "$revision" '.org_settings_revision = $rev' "$SCRIPT_DIR/.egregore-state.json" > "$st" 2>/dev/null && [ -s "$st" ]; then
76
- mv "$st" "$SCRIPT_DIR/.egregore-state.json"
75
+ local st state_file
76
+ # A worktree links the checkout's state file: the rename lands on the
77
+ # file it points to, so the link stays and the installation keeps one state.
78
+ state_file="$(realpath "$SCRIPT_DIR/.egregore-state.json" 2>/dev/null)" || state_file="$SCRIPT_DIR/.egregore-state.json"
79
+ st="$(mktemp "$state_file.XXXXXX")" || return 0
80
+ if jq --arg rev "$revision" '.org_settings_revision = $rev' "$state_file" > "$st" 2>/dev/null && [ -s "$st" ]; then
81
+ mv "$st" "$state_file"
77
82
  else
78
83
  rm -f "$st"
79
84
  fi
@@ -394,7 +399,7 @@ _people_file() {
394
399
  fi
395
400
  ( cd "$SCRIPT_DIR/memory" 2>/dev/null && git add -A people/ 2>/dev/null \
396
401
  && git commit -q -m "chore(settings): $op $user in people" 2>/dev/null \
397
- && git push -q 2>/dev/null ) || true
402
+ && bash "$SCRIPT_DIR/bin/memory-push.sh" --repository "$SCRIPT_DIR/memory" --branch main >/dev/null 2>&1 ) || true
398
403
  }
399
404
 
400
405
  cmd_people() {
@@ -469,7 +474,7 @@ set -- "${_args[@]+"${_args[@]}"}"
469
474
  # ── privacy & access (read snapshot) ─────────────────────────────────────
470
475
  # One composed JSON for the Settings Privacy & access panel. Identity,
471
476
  # membership, and capability values come from the Runtime authorization
472
- # backend (access-status); this shell layer adds only committed boundary
477
+ # backend (access show --json); this shell layer adds only committed boundary
473
478
  # config, the personal boundary-local file, isolation state, and honest
474
479
  # constant statements. Never includes secrets, tokens, or internal paths.
475
480
 
@@ -499,7 +504,7 @@ cmd_privacy() {
499
504
  local access posture locked org_reads personal_reads denied digest graph
500
505
  access=$(cd "$SCRIPT_DIR" && EGREGORE_ROOT="$SCRIPT_DIR" \
501
506
  PYTHONSAFEPATH=1 PYTHONPATH="$SCRIPT_DIR${PYTHONPATH:+:$PYTHONPATH}" \
502
- python3 -m egregore_runtime.harness_cli access-status 2>/dev/null) || true
507
+ python3 -m egregore_runtime.harness_cli access show --json 2>/dev/null) || true
503
508
  printf '%s' "$access" | jq -e . >/dev/null 2>&1 || access='{"status":"attention"}'
504
509
  posture=$(jq -r '.boundary.posture // "standard"' "$CONFIG" 2>/dev/null || echo standard)
505
510
  locked=$(jq -r 'if (.boundary.locked // false) == true then "true" else "false" end' "$CONFIG" 2>/dev/null || echo false)
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env bash
2
+ set -eu
3
+ ROOT="$(cd "$(dirname "$0")/.." && pwd)"
4
+ PYTHONDONTWRITEBYTECODE=1 PYTHONSAFEPATH=1 PYTHONPATH="$ROOT" python3 -c 'from egregore_runtime.spirit_discovery_cli import main; raise SystemExit(main(runtime="claude"))' "$@"
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env bash
2
+ set -eu
3
+ ROOT="$(cd "$(dirname "$0")/.." && pwd)"
4
+ PYTHONDONTWRITEBYTECODE=1 PYTHONSAFEPATH=1 PYTHONPATH="$ROOT" python3 -c 'from egregore_runtime.spirit_discovery_cli import main; raise SystemExit(main(runtime="codex"))' "$@"
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env bash
2
+ set -eu
3
+ ROOT="$(cd "$(dirname "$0")/.." && pwd)"
4
+ PYTHONDONTWRITEBYTECODE=1 PYTHONSAFEPATH=1 PYTHONPATH="$ROOT" python3 -c 'from egregore_runtime.spirit_discovery_cli import main; raise SystemExit(main(runtime="pi"))' "$@"
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env bash
2
+ set -eu
3
+ ROOT="$(cd "$(dirname "$0")/.." && pwd)"
4
+ PYTHONDONTWRITEBYTECODE=1 PYTHONSAFEPATH=1 PYTHONPATH="$ROOT" python3 -c 'from egregore_runtime.spirit_discovery_cli import main; raise SystemExit(main(runtime="prime"))' "$@"
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env bash
2
+ set -eu
3
+ ROOT="$(cd "$(dirname "$0")/.." && pwd)"
4
+ PYTHONDONTWRITEBYTECODE=1 PYTHONSAFEPATH=1 PYTHONPATH="$ROOT" python3 -c 'from egregore_runtime.spirit_discovery_cli import main; raise SystemExit(main(runtime=None))' "$@"
@@ -13,7 +13,6 @@ STATE_FILE="$SCRIPT_DIR/.egregore-state.json"
13
13
  [ -f "$ENV_FILE" ] || exit 0
14
14
 
15
15
  # --- Read config ---
16
- API_URL=$(jq -r '.api_url // empty' "$CONFIG" 2>/dev/null)
17
16
  MODE=$(jq -r '.mode // "local"' "$CONFIG" 2>/dev/null)
18
17
  CONFIG_SLUG=$(jq -r '.slug // empty' "$CONFIG" 2>/dev/null)
19
18
  ORG_NAME=$(jq -r '.org_name // empty' "$CONFIG" 2>/dev/null)
@@ -21,6 +20,7 @@ GITHUB_ORG=$(jq -r '.github_org // empty' "$CONFIG" 2>/dev/null)
21
20
 
22
21
  # shellcheck source=bin/lib/config.sh
23
22
  source "$SCRIPT_DIR/bin/lib/config.sh"
23
+ API_URL=$(_config_api_url)
24
24
 
25
25
  # Runtime telemetry and diagnostics remain on-device by default. Historical
26
26
  # Connected health reporting is retained only as an explicit operator action;
@@ -7,6 +7,8 @@ set -euo pipefail
7
7
  umask 077
8
8
 
9
9
  SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
10
+ # shellcheck source=bin/lib/config.sh
11
+ source "$SCRIPT_DIR/bin/lib/config.sh"
10
12
  if [ -n "${EGREGORE_TELEMETRY_DIR:-}" ]; then
11
13
  BUFFER_DIR="$EGREGORE_TELEMETRY_DIR"
12
14
  else
@@ -516,12 +518,16 @@ cmd_export() {
516
518
  _resolve_share_target() {
517
519
  local requested_endpoint="$1"
518
520
  if [ -n "$requested_endpoint" ]; then
519
- printf '%s\n' "$requested_endpoint"
520
- return
521
+ # An explicit endpoint never gets the org key (cmd_share adds it only for
522
+ # the configured sink), so it needs the retired host mapped and nothing
523
+ # more; any other address goes to cmd_share's scheme check as typed.
524
+ _hosted_api_target "$requested_endpoint" 2>/dev/null || printf '%s\n' "$requested_endpoint"
525
+ return 0
521
526
  fi
522
527
  local api_url="" api_key=""
523
528
  if [ -f "$CONFIG" ]; then
524
- api_url=$(jq -r '.api_url // empty' "$CONFIG" 2>/dev/null || true)
529
+ # A refused saved address names no sink: never fall through to the relay.
530
+ api_url=$(_hosted_api_url "$(jq -r '.api_url // empty' "$CONFIG" 2>/dev/null || true)") || return 0
525
531
  fi
526
532
  if [ -f "$ENV_FILE" ]; then
527
533
  api_key=$(grep '^EGREGORE_API_KEY=' "$ENV_FILE" 2>/dev/null | cut -d'=' -f2- || true)
@@ -691,7 +697,8 @@ cmd_share() {
691
697
  : > "$share_file"
692
698
  fi
693
699
 
694
- local curl_args=(-s -o /dev/null -w '%{http_code}' -X POST "$endpoint"
700
+ # -q first (no ~/.curlrc), --globoff: the endpoint reaches the one host it names.
701
+ local curl_args=(-q --globoff -s -o /dev/null -w '%{http_code}' -X POST "$endpoint"
695
702
  -H "Content-Type: application/x-ndjson" --data-binary "@$share_file" --max-time 15)
696
703
  local api_key="" configured_endpoint=""
697
704
  configured_endpoint=$(_resolve_share_target "")
@@ -39,6 +39,9 @@ json=false
39
39
  head_first=false
40
40
  strict_head=false
41
41
  timeout=""
42
+ # A suite may declare a longer deadline than --timeout, up to 900 seconds,
43
+ # with a line "# test-baseline: timeout=N" in its first 30 lines.
44
+ child_limit=""
42
45
  selected=()
43
46
  add_suite() {
44
47
  local existing
@@ -147,8 +150,23 @@ run_dir=$(mktemp -d "${TMPDIR:-/tmp}/qa-baseline.XXXXXX") || error "cannot creat
147
150
  # Use the physical spelling consistently in Git, logs, and failure normalization.
148
151
  run_dir=$(cd -P "$run_dir" && pwd)
149
152
  mkdir -p "$run_dir/logs/base" "$run_dir/logs/head" || error "cannot create scratch logs"
150
- if ! git -C "$SCRIPT_DIR" worktree add --detach --quiet "$run_dir/base" "$base_oid" \
151
- > "$run_dir/worktree.out" 2> "$run_dir/worktree.err"; then
153
+ # A worktree another run is adding at the same moment can make Git read its
154
+ # half-written entry ("failed to read .git/worktrees/<name>/commondir"), so a
155
+ # failed add is tried again before it counts as an environment failure.
156
+ add_base_tree() {
157
+ local attempt
158
+ for attempt in 1 2 3; do
159
+ if git -C "$SCRIPT_DIR" worktree add --detach --quiet "$run_dir/base" "$base_oid" \
160
+ > "$run_dir/worktree.out" 2> "$run_dir/worktree.err"; then
161
+ return 0
162
+ fi
163
+ [ "$attempt" -lt 3 ] || return 1
164
+ git -C "$SCRIPT_DIR" worktree remove --force "$run_dir/base" >/dev/null 2>&1 || true
165
+ rm -rf "$run_dir/base"
166
+ sleep "$attempt"
167
+ done
168
+ }
169
+ if ! add_base_tree; then
152
170
  echo 'test-baseline: cannot create the base worktree:' >&2
153
171
  cat "$run_dir/worktree.err" >&2
154
172
  exit 2
@@ -169,13 +187,14 @@ run_child() {
169
187
  set -m
170
188
  (cd "$tree" && exec "$@") < /dev/null > "$log" 2>&1 &
171
189
  child_pid=$!
172
- if [ -n "$timeout" ]; then
190
+ local limit="${child_limit:-$timeout}"
191
+ if [ -n "$limit" ]; then
173
192
  watched_pid=$child_pid
174
193
  (
175
194
  # This watchdog owns a separate group, including its sleep process, so
176
195
  # normal completion and external interruption cancel the whole timer.
177
196
  set +m
178
- if ! sleep "$timeout"; then
197
+ if ! sleep "$limit"; then
179
198
  : > "$run_dir/timer-failed"
180
199
  fi
181
200
  if kill -0 -- "-$watched_pid" 2>/dev/null; then
@@ -270,6 +289,13 @@ for suite in "${selected[@]}"; do
270
289
  note=""
271
290
  status=""
272
291
  runner=""
292
+ suite_limit="$timeout"
293
+ if [ -n "$timeout" ] && [ -f "$SCRIPT_DIR/$suite" ]; then
294
+ declared=$(head -n 30 "$SCRIPT_DIR/$suite" | sed -n 's/^# test-baseline: timeout=\([1-9][0-9]*\)$/\1/p' | head -n 1)
295
+ if [ -n "$declared" ] && [ "$declared" -gt "$timeout" ]; then
296
+ suite_limit=$(( declared > 900 ? 900 : declared ))
297
+ fi
298
+ fi
273
299
  printf 'test-baseline: suite %s\n' "$suite" >&2
274
300
  case "$suite" in
275
301
  *.sh) runner=bash ;;
@@ -345,7 +371,9 @@ for suite in "${selected[@]}"; do
345
371
  bats) command_args=(bats) ;;
346
372
  esac
347
373
  printf 'test-baseline: %s %s starting\n' "$side" "$suite" >&2
374
+ child_limit="$suite_limit"
348
375
  run_child "$tree" "$run_dir/logs/$side/$log_name" "${command_args[@]}" "./$suite"
376
+ child_limit=""
349
377
  printf 'test-baseline: %s %s exit=%s seconds=%s timed_out=%s\n' \
350
378
  "$side" "$suite" "$run_exit" "$run_seconds" "$run_timed_out" >&2
351
379
  failure_lines "$run_dir/logs/$side/$log_name" "$run_dir/$side.lines"
@@ -355,7 +383,7 @@ for suite in "${selected[@]}"; do
355
383
  head_exit=$run_exit; head_seconds=$run_seconds; head_timed_out=$run_timed_out
356
384
  fi
357
385
  if $run_timed_out; then
358
- status=blocked; note="$side timed out after ${timeout}s"; break
386
+ status=blocked; note="$side timed out after ${suite_limit}s"; break
359
387
  fi
360
388
  if $head_first && [ "$side" = head ] && [ "$head_exit" -eq 0 ]; then break; fi
361
389
  done
@@ -3,7 +3,7 @@ set -euo pipefail
3
3
 
4
4
  ROOT="$(cd "$(dirname "$0")/.." && pwd)"
5
5
  export EGREGORE_ROOT="$ROOT"
6
- export EGREGORE_SESSION_ID="${EGREGORE_SESSION_ID:-$(cat "$ROOT/.egregore-session-id" 2>/dev/null || true)}"
6
+ export EGREGORE_SESSION_ID="${EGREGORE_SESSION_ID:-$(bash "$ROOT/bin/session-id.sh" --root "$ROOT" 2>/dev/null || cat "$ROOT/.egregore-session-id" 2>/dev/null || true)}"
7
7
  export PYTHONSAFEPATH=1 PYTHONPATH="$ROOT${PYTHONPATH:+:$PYTHONPATH}"
8
8
 
9
9
  exec python3 -m egregore_runtime.todo_cli "$@"