create-egregore 0.20.2 → 0.21.0-runtime-mvp.2

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 (706) hide show
  1. package/assets/egregore-launcher.js +1013 -16
  2. package/bin/cli.js +11 -0
  3. package/lib/claude-runtime.js +192 -0
  4. package/lib/local.js +38 -31
  5. package/lib/pi-runtime.js +1 -0
  6. package/lib/prime-runtime.js +1 -0
  7. package/lib/runtime-identity.js +146 -0
  8. package/lib/setup.js +116 -17
  9. package/package.json +10 -6
  10. package/runtime/claude/.claude/context/commit-format.md +110 -0
  11. package/runtime/claude/.claude/context/git-language.md +46 -0
  12. package/runtime/claude/.claude/context/notification-consent.md +66 -0
  13. package/runtime/claude/.claude/context/pr-format.md +67 -0
  14. package/runtime/claude/.claude/context/telemetry.md +133 -0
  15. package/runtime/claude/.claude/hooks/boundary-check.sh +333 -0
  16. package/runtime/claude/.claude/hooks/branch-guard.sh +231 -0
  17. package/runtime/claude/.claude/hooks/card-context.sh +38 -0
  18. package/runtime/claude/.claude/hooks/emissary-detect.sh +53 -0
  19. package/runtime/claude/.claude/hooks/memory-refresh.sh +67 -0
  20. package/runtime/claude/.claude/hooks/onboarding-guard.sh +86 -0
  21. package/runtime/claude/.claude/hooks/retrieval-context.sh +43 -0
  22. package/runtime/claude/.claude/rules/voice-bedrock.md +73 -0
  23. package/runtime/claude/.claude/settings.json +131 -0
  24. package/runtime/claude/.claude/skills/activity/SKILL.md +68 -0
  25. package/runtime/claude/.claude/skills/announce/SKILL.md +54 -0
  26. package/runtime/claude/.claude/skills/archive/SKILL.md +71 -0
  27. package/runtime/claude/.claude/skills/branch/SKILL.md +147 -0
  28. package/runtime/claude/.claude/skills/checkup/SKILL.md +159 -0
  29. package/runtime/claude/.claude/skills/commit/SKILL.md +103 -0
  30. package/runtime/claude/.claude/skills/contribute/SKILL.md +343 -0
  31. package/runtime/claude/.claude/skills/create-skill/SKILL.md +135 -0
  32. package/runtime/claude/.claude/skills/dark-mode/SKILL.md +410 -0
  33. package/runtime/claude/.claude/skills/dashboard/SKILL.md +43 -0
  34. package/runtime/claude/.claude/skills/deep-reflect/REPORT.md +140 -0
  35. package/runtime/claude/.claude/skills/deep-reflect/RESEARCH.md +132 -0
  36. package/runtime/claude/.claude/skills/deep-reflect/ROLES.md +104 -0
  37. package/runtime/claude/.claude/skills/deep-reflect/SKILL.md +170 -0
  38. package/runtime/claude/.claude/skills/delete-user/SKILL.md +150 -0
  39. package/runtime/claude/.claude/skills/emissary/SKILL.md +220 -0
  40. package/runtime/claude/.claude/skills/handoff/SKILL.md +124 -0
  41. package/runtime/claude/.claude/skills/harvest/AUDIT.md +546 -0
  42. package/runtime/claude/.claude/skills/harvest/FORMAT.md +436 -0
  43. package/runtime/claude/.claude/skills/harvest/PROCESS.md +395 -0
  44. package/runtime/claude/.claude/skills/harvest/QUESTION_PALETTE.md +76 -0
  45. package/runtime/claude/.claude/skills/harvest/SKILL.md +100 -0
  46. package/runtime/claude/.claude/skills/ingest/SKILL.md +112 -0
  47. package/runtime/claude/.claude/skills/ingest-corpus/SKILL.md +187 -0
  48. package/runtime/claude/.claude/skills/ingest-notion/SKILL.md +214 -0
  49. package/runtime/claude/.claude/skills/ingest-user-interview/SKILL.md +65 -0
  50. package/runtime/claude/.claude/skills/ingest-user-interview/references/analysis-contract.md +125 -0
  51. package/runtime/claude/.claude/skills/invite/SKILL.md +111 -0
  52. package/runtime/claude/.claude/skills/issue/SKILL.md +104 -0
  53. package/runtime/claude/.claude/skills/me/SKILL.md +81 -0
  54. package/runtime/claude/.claude/skills/meeting/SKILL.md +76 -0
  55. package/runtime/claude/.claude/skills/meeting/references/analysis-contract.md +102 -0
  56. package/runtime/claude/.claude/skills/note/SKILL.md +71 -0
  57. package/runtime/claude/.claude/skills/notion-connect/SKILL.md +124 -0
  58. package/runtime/claude/.claude/skills/onboarding/SKILL.md +159 -0
  59. package/runtime/claude/.claude/skills/pr/SKILL.md +85 -0
  60. package/runtime/claude/.claude/skills/pull/SKILL.md +79 -0
  61. package/runtime/claude/.claude/skills/push/SKILL.md +47 -0
  62. package/runtime/claude/.claude/skills/quest/SKILL.md +121 -0
  63. package/runtime/claude/.claude/skills/reflect/SKILL.md +69 -0
  64. package/runtime/claude/.claude/skills/review-pr/SKILL.md +276 -0
  65. package/runtime/claude/.claude/skills/save/SKILL.md +92 -0
  66. package/runtime/claude/.claude/skills/slack-connect/SKILL.md +148 -0
  67. package/runtime/claude/.claude/skills/summon/SKILL.md +240 -0
  68. package/runtime/claude/.claude/skills/sync-repos/SKILL.md +82 -0
  69. package/runtime/claude/.claude/skills/teams-connect/SKILL.md +216 -0
  70. package/runtime/claude/.claude/skills/telegram-connect/SKILL.md +110 -0
  71. package/runtime/claude/.claude/skills/telemetry/SKILL.md +117 -0
  72. package/runtime/claude/.claude/skills/test/SKILL.md +87 -0
  73. package/runtime/claude/.claude/skills/the-spiral/SKILL.md +492 -0
  74. package/runtime/claude/.claude/skills/tui-design/SKILL.md +188 -0
  75. package/runtime/claude/.claude/skills/tutorial/SKILL.md +100 -0
  76. package/runtime/claude/.claude/skills/update/SKILL.md +265 -0
  77. package/runtime/claude/.claude/skills/view/SKILL.md +393 -0
  78. package/runtime/claude/.claude/skills/view/compose-scaffold.html +221 -0
  79. package/runtime/claude/.claude/skills/visual-explain/SKILL.md +132 -0
  80. package/runtime/claude/.claude/skills/wrap/SKILL.md +98 -0
  81. package/runtime/claude/CLAUDE.md +447 -0
  82. package/runtime/claude/bin/activity-action.sh +92 -0
  83. package/runtime/claude/bin/activity-data.sh +17 -0
  84. package/runtime/claude/bin/agent.sh +783 -0
  85. package/runtime/claude/bin/artifact-register.sh +164 -0
  86. package/runtime/claude/bin/artifact-writeback.sh +53 -0
  87. package/runtime/claude/bin/artifacts.sh +288 -0
  88. package/runtime/claude/bin/attendant.sh +707 -0
  89. package/runtime/claude/bin/autosave.sh +112 -0
  90. package/runtime/claude/bin/boundary.sh +253 -0
  91. package/runtime/claude/bin/build-sealed-dataroom.mjs +722 -0
  92. package/runtime/claude/bin/capture-reconcile.sh +69 -0
  93. package/runtime/claude/bin/capture-run.sh +357 -0
  94. package/runtime/claude/bin/codex-install-skills.sh +78 -0
  95. package/runtime/claude/bin/codex-render-spec.mjs +462 -0
  96. package/runtime/claude/bin/codex-session-start.sh +275 -0
  97. package/runtime/claude/bin/codex-skill-render.mjs +349 -0
  98. package/runtime/claude/bin/codex-sync-skills.sh +237 -0
  99. package/runtime/claude/bin/connect-refresh.sh +33 -0
  100. package/runtime/claude/bin/contribute-guard.sh +79 -0
  101. package/runtime/claude/bin/corpus_map.py +806 -0
  102. package/runtime/claude/bin/corpus_survey.py +304 -0
  103. package/runtime/claude/bin/dashboard-data.sh +18 -0
  104. package/runtime/claude/bin/github-auth.sh +121 -0
  105. package/runtime/claude/bin/graph-batch.sh +86 -0
  106. package/runtime/claude/bin/graph-op.sh +1106 -0
  107. package/runtime/claude/bin/graph-projection.sh +54 -0
  108. package/runtime/claude/bin/graph-wal.sh +242 -0
  109. package/runtime/claude/bin/graph.sh +267 -0
  110. package/runtime/claude/bin/handoff-lifecycle-job.sh +146 -0
  111. package/runtime/claude/bin/handoff-lifecycle.sh +280 -0
  112. package/runtime/claude/bin/handoff-pr-backfill.sh +86 -0
  113. package/runtime/claude/bin/handoff-preview.sh +169 -0
  114. package/runtime/claude/bin/handoff-run.sh +692 -0
  115. package/runtime/claude/bin/handoff-save-egregore.sh +224 -0
  116. package/runtime/claude/bin/index-handoff.sh +322 -0
  117. package/runtime/claude/bin/ingest-graph.sh +86 -0
  118. package/runtime/claude/bin/ingest-item.sh +10 -0
  119. package/runtime/claude/bin/ingest-surface.html +495 -0
  120. package/runtime/claude/bin/ingest.py +1011 -0
  121. package/runtime/claude/bin/ingest.sh +308 -0
  122. package/runtime/claude/bin/ingest_graph.py +856 -0
  123. package/runtime/claude/bin/ingest_surface.py +544 -0
  124. package/runtime/claude/bin/invite.sh +6 -0
  125. package/runtime/claude/bin/issue.sh +10 -0
  126. package/runtime/claude/bin/knowledge.sh +10 -0
  127. package/runtime/claude/bin/lib/artifact-id.sh +46 -0
  128. package/runtime/claude/bin/lib/config.sh +136 -0
  129. package/runtime/claude/bin/lib/context.sh +642 -0
  130. package/runtime/claude/bin/lib/dashboard-artifact.sh +242 -0
  131. package/runtime/claude/bin/lib/ensure-develop.sh +183 -0
  132. package/runtime/claude/bin/lib/git-message.sh +37 -0
  133. package/runtime/claude/bin/lib/git-sync.sh +494 -0
  134. package/runtime/claude/bin/lib/greeting.sh +548 -0
  135. package/runtime/claude/bin/lib/handoff-meta.sh +97 -0
  136. package/runtime/claude/bin/lib/hash.sh +13 -0
  137. package/runtime/claude/bin/lib/identity.sh +213 -0
  138. package/runtime/claude/bin/lib/metrics.sh +374 -0
  139. package/runtime/claude/bin/lib/noncode.sh +31 -0
  140. package/runtime/claude/bin/lib/permissions.sh +106 -0
  141. package/runtime/claude/bin/lib/time.sh +56 -0
  142. package/runtime/claude/bin/lib/worktree-links.sh +85 -0
  143. package/runtime/claude/bin/node-run.sh +42 -0
  144. package/runtime/claude/bin/notification.sh +6 -0
  145. package/runtime/claude/bin/notify.sh +636 -0
  146. package/runtime/claude/bin/observe-context.sh +14 -0
  147. package/runtime/claude/bin/onboarding.sh +6 -0
  148. package/runtime/claude/bin/person.py +634 -0
  149. package/runtime/claude/bin/person.sh +481 -0
  150. package/runtime/claude/bin/pi-render-spec.mjs +140 -0
  151. package/runtime/claude/bin/post-update.sh +37 -0
  152. package/runtime/claude/bin/prime-render-spec.mjs +147 -0
  153. package/runtime/claude/bin/publish-artifact.sh +324 -0
  154. package/runtime/claude/bin/publish-references.sh +144 -0
  155. package/runtime/claude/bin/quest.sh +9 -0
  156. package/runtime/claude/bin/question.sh +8 -0
  157. package/runtime/claude/bin/repo-state.sh +96 -0
  158. package/runtime/claude/bin/research-ingest.sh +7 -0
  159. package/runtime/claude/bin/restore-owned-skills.sh +67 -0
  160. package/runtime/claude/bin/retrieval_eval.py +385 -0
  161. package/runtime/claude/bin/runtime-identity.sh +70 -0
  162. package/runtime/claude/bin/runtime-upgrade.sh +43 -0
  163. package/runtime/claude/bin/scroll.sh +9 -0
  164. package/runtime/claude/bin/search.sh +318 -0
  165. package/runtime/claude/bin/session-autosave.sh +220 -0
  166. package/runtime/claude/bin/session-log.sh +199 -0
  167. package/runtime/claude/bin/session-start.sh +696 -0
  168. package/runtime/claude/bin/settings.sh +532 -0
  169. package/runtime/claude/bin/startup-check.sh +136 -0
  170. package/runtime/claude/bin/statusline.sh +41 -0
  171. package/runtime/claude/bin/telemetry.sh +666 -0
  172. package/runtime/claude/bin/test-changes.sh +344 -0
  173. package/runtime/claude/bin/thread.sh +9 -0
  174. package/runtime/claude/bin/todo.sh +9 -0
  175. package/runtime/claude/bin/view-render.sh +126 -0
  176. package/runtime/claude/bin/worktree-create.sh +145 -0
  177. package/runtime/claude/bin/worktree-remove.sh +50 -0
  178. package/runtime/claude/bin/worktree.sh +198 -0
  179. package/runtime/claude/egregore_runtime/__init__.py +228 -0
  180. package/runtime/claude/egregore_runtime/adapters/__init__.py +5 -0
  181. package/runtime/claude/egregore_runtime/adapters/invitation.py +237 -0
  182. package/runtime/claude/egregore_runtime/adapters/notification.py +59 -0
  183. package/runtime/claude/egregore_runtime/adapters/qmd.py +1701 -0
  184. package/runtime/claude/egregore_runtime/adapters/qmd_cli.py +210 -0
  185. package/runtime/claude/egregore_runtime/adapters/qmd_embed_worker.py +59 -0
  186. package/runtime/claude/egregore_runtime/admin_gate.py +102 -0
  187. package/runtime/claude/egregore_runtime/artifacts.py +523 -0
  188. package/runtime/claude/egregore_runtime/contracts.py +499 -0
  189. package/runtime/claude/egregore_runtime/entitlements.py +85 -0
  190. package/runtime/claude/egregore_runtime/errors.py +10 -0
  191. package/runtime/claude/egregore_runtime/graph.py +356 -0
  192. package/runtime/claude/egregore_runtime/handoff_lookup.py +196 -0
  193. package/runtime/claude/egregore_runtime/harness_cli.py +1221 -0
  194. package/runtime/claude/egregore_runtime/identity.py +734 -0
  195. package/runtime/claude/egregore_runtime/identity_cli.py +91 -0
  196. package/runtime/claude/egregore_runtime/ingest.py +575 -0
  197. package/runtime/claude/egregore_runtime/ingest_cli.py +254 -0
  198. package/runtime/claude/egregore_runtime/ingest_index_cli.py +147 -0
  199. package/runtime/claude/egregore_runtime/invitation_cli.py +51 -0
  200. package/runtime/claude/egregore_runtime/invitations.py +116 -0
  201. package/runtime/claude/egregore_runtime/issue_cli.py +305 -0
  202. package/runtime/claude/egregore_runtime/issues.py +359 -0
  203. package/runtime/claude/egregore_runtime/knowledge.py +376 -0
  204. package/runtime/claude/egregore_runtime/knowledge_cli.py +173 -0
  205. package/runtime/claude/egregore_runtime/lifecycle.py +888 -0
  206. package/runtime/claude/egregore_runtime/lifecycle_cli.py +269 -0
  207. package/runtime/claude/egregore_runtime/notification_cli.py +125 -0
  208. package/runtime/claude/egregore_runtime/notifications.py +230 -0
  209. package/runtime/claude/egregore_runtime/observe.py +342 -0
  210. package/runtime/claude/egregore_runtime/onboarding.py +290 -0
  211. package/runtime/claude/egregore_runtime/onboarding_cli.py +110 -0
  212. package/runtime/claude/egregore_runtime/policy.py +144 -0
  213. package/runtime/claude/egregore_runtime/profile.py +193 -0
  214. package/runtime/claude/egregore_runtime/quest_cli.py +216 -0
  215. package/runtime/claude/egregore_runtime/question_cli.py +180 -0
  216. package/runtime/claude/egregore_runtime/questions.py +304 -0
  217. package/runtime/claude/egregore_runtime/quests.py +419 -0
  218. package/runtime/claude/egregore_runtime/readiness.py +379 -0
  219. package/runtime/claude/egregore_runtime/research_ingest.py +256 -0
  220. package/runtime/claude/egregore_runtime/research_ingest_cli.py +44 -0
  221. package/runtime/claude/egregore_runtime/runtime.py +464 -0
  222. package/runtime/claude/egregore_runtime/scroll_cli.py +185 -0
  223. package/runtime/claude/egregore_runtime/scrolls.py +726 -0
  224. package/runtime/claude/egregore_runtime/status.py +412 -0
  225. package/runtime/claude/egregore_runtime/status_cli.py +174 -0
  226. package/runtime/claude/egregore_runtime/sync.py +218 -0
  227. package/runtime/claude/egregore_runtime/teamsync.py +139 -0
  228. package/runtime/claude/egregore_runtime/telemetry.py +640 -0
  229. package/runtime/claude/egregore_runtime/thread_cli.py +173 -0
  230. package/runtime/claude/egregore_runtime/threads.py +517 -0
  231. package/runtime/claude/egregore_runtime/todo_cli.py +142 -0
  232. package/runtime/claude/egregore_runtime/todos.py +244 -0
  233. package/runtime/claude/egregore_runtime/upgrade.py +770 -0
  234. package/runtime/claude/egregore_runtime/upgrade_worker.py +53 -0
  235. package/runtime/claude/egregore_runtime/writeback.py +391 -0
  236. package/runtime/claude/egregore_runtime/writeback_cli.py +114 -0
  237. package/runtime/claude/manifest.json +284 -0
  238. package/runtime/codex/.codex/hooks/search-hint.js +21 -52
  239. package/runtime/codex/.codex/hooks.json +3 -3
  240. package/runtime/codex/.codex/skills/activity/SKILL.md +23 -66
  241. package/runtime/codex/.codex/skills/announce/SKILL.md +27 -50
  242. package/runtime/codex/.codex/skills/archive/SKILL.md +21 -36
  243. package/runtime/codex/.codex/skills/checkup/SKILL.md +77 -36
  244. package/runtime/codex/.codex/skills/dark-mode/SKILL.md +1 -1
  245. package/runtime/codex/.codex/skills/dashboard/SKILL.md +17 -47
  246. package/runtime/codex/.codex/skills/handoff/SKILL.md +84 -133
  247. package/runtime/codex/.codex/skills/harvest/SKILL.md +32 -117
  248. package/runtime/codex/.codex/skills/ingest/SKILL.md +47 -25
  249. package/runtime/codex/.codex/skills/ingest-user-interview/SKILL.md +18 -36
  250. package/runtime/codex/.codex/skills/ingest-user-interview/references/analysis-contract.md +42 -0
  251. package/runtime/codex/.codex/skills/invite/SKILL.md +21 -35
  252. package/runtime/codex/.codex/skills/issue/SKILL.md +60 -41
  253. package/runtime/codex/.codex/skills/me/SKILL.md +1 -1
  254. package/runtime/codex/.codex/skills/meeting/SKILL.md +16 -36
  255. package/runtime/codex/.codex/skills/meeting/references/analysis-contract.md +48 -0
  256. package/runtime/codex/.codex/skills/note/SKILL.md +30 -25
  257. package/runtime/codex/.codex/skills/onboarding/SKILL.md +36 -41
  258. package/runtime/codex/.codex/skills/pull/SKILL.md +1 -1
  259. package/runtime/codex/.codex/skills/quest/SKILL.md +27 -66
  260. package/runtime/codex/.codex/skills/reflect/SKILL.md +22 -36
  261. package/runtime/codex/.codex/skills/save/SKILL.md +2 -2
  262. package/runtime/codex/.codex/skills/telemetry/SKILL.md +1 -1
  263. package/runtime/codex/.codex/skills/test/SKILL.md +1 -1
  264. package/runtime/codex/.codex/skills/tutorial/SKILL.md +40 -41
  265. package/runtime/codex/.codex/skills/view/SKILL.md +115 -111
  266. package/runtime/codex/.codex/skills/wrap/SKILL.md +45 -41
  267. package/runtime/codex/.codex/spec-manifest.json +9 -9
  268. package/runtime/codex/AGENTS.md +62 -58
  269. package/runtime/codex/bin/activity-action.sh +92 -0
  270. package/runtime/codex/bin/activity-data.sh +12 -233
  271. package/runtime/codex/bin/agent.sh +84 -100
  272. package/runtime/codex/bin/artifact-register.sh +164 -0
  273. package/runtime/codex/bin/artifact-writeback.sh +53 -0
  274. package/runtime/codex/bin/artifacts.sh +288 -0
  275. package/runtime/codex/bin/build-sealed-dataroom.mjs +722 -0
  276. package/runtime/codex/bin/capture-run.sh +18 -2
  277. package/runtime/codex/bin/codex-render-spec.mjs +41 -16
  278. package/runtime/codex/bin/codex-session-start.sh +14 -4
  279. package/runtime/codex/bin/codex-skill-render.mjs +9 -7
  280. package/runtime/codex/bin/corpus_map.py +806 -0
  281. package/runtime/codex/bin/corpus_survey.py +304 -0
  282. package/runtime/codex/bin/dashboard-data.sh +11 -171
  283. package/runtime/codex/bin/github-auth.sh +121 -0
  284. package/runtime/codex/bin/graph-batch.sh +7 -0
  285. package/runtime/codex/bin/graph-op.sh +4 -0
  286. package/runtime/codex/bin/graph-projection.sh +54 -0
  287. package/runtime/codex/bin/graph-wal.sh +13 -0
  288. package/runtime/codex/bin/graph.sh +44 -0
  289. package/runtime/codex/bin/handoff-lifecycle-job.sh +146 -0
  290. package/runtime/codex/bin/handoff-lifecycle.sh +280 -0
  291. package/runtime/codex/bin/handoff-preview.sh +169 -0
  292. package/runtime/codex/bin/handoff-run.sh +42 -26
  293. package/runtime/codex/bin/ingest-graph.sh +6 -0
  294. package/runtime/codex/bin/ingest-item.sh +10 -0
  295. package/runtime/codex/bin/ingest.sh +59 -30
  296. package/runtime/codex/bin/invite.sh +6 -0
  297. package/runtime/codex/bin/issue.sh +10 -0
  298. package/runtime/codex/bin/knowledge.sh +10 -0
  299. package/runtime/codex/bin/lib/config.sh +20 -0
  300. package/runtime/codex/bin/lib/context.sh +46 -25
  301. package/runtime/codex/bin/lib/git-sync.sh +70 -6
  302. package/runtime/codex/bin/lib/greeting.sh +34 -5
  303. package/runtime/codex/bin/lib/handoff-meta.sh +97 -0
  304. package/runtime/codex/bin/lib/worktree-links.sh +6 -0
  305. package/runtime/codex/bin/node-run.sh +42 -0
  306. package/runtime/codex/bin/notification.sh +6 -0
  307. package/runtime/codex/bin/observe-context.sh +14 -0
  308. package/runtime/codex/bin/onboarding.sh +6 -0
  309. package/runtime/codex/bin/person.py +4 -0
  310. package/runtime/codex/bin/person.sh +43 -10
  311. package/runtime/codex/bin/pi-render-spec.mjs +140 -0
  312. package/runtime/codex/bin/post-update.sh +37 -0
  313. package/runtime/codex/bin/prime-render-spec.mjs +147 -0
  314. package/runtime/codex/bin/publish-artifact.sh +55 -2
  315. package/runtime/codex/bin/quest.sh +9 -0
  316. package/runtime/codex/bin/question.sh +8 -0
  317. package/runtime/codex/bin/research-ingest.sh +7 -0
  318. package/runtime/codex/bin/restore-owned-skills.sh +67 -0
  319. package/runtime/codex/bin/retrieval_eval.py +385 -0
  320. package/runtime/codex/bin/runtime-identity.sh +70 -0
  321. package/runtime/codex/bin/runtime-upgrade.sh +43 -0
  322. package/runtime/codex/bin/scroll.sh +9 -0
  323. package/runtime/codex/bin/search.sh +231 -195
  324. package/runtime/codex/bin/settings.sh +174 -5
  325. package/runtime/codex/bin/startup-check.sh +136 -0
  326. package/runtime/codex/bin/telemetry.sh +522 -247
  327. package/runtime/codex/bin/test-changes.sh +344 -0
  328. package/runtime/codex/bin/thread.sh +9 -0
  329. package/runtime/codex/bin/todo.sh +9 -0
  330. package/runtime/codex/bin/view-render.sh +126 -0
  331. package/runtime/codex/bin/worktree-create.sh +19 -5
  332. package/runtime/codex/egregore_runtime/__init__.py +228 -0
  333. package/runtime/codex/egregore_runtime/adapters/__init__.py +5 -0
  334. package/runtime/codex/egregore_runtime/adapters/invitation.py +237 -0
  335. package/runtime/codex/egregore_runtime/adapters/notification.py +59 -0
  336. package/runtime/codex/egregore_runtime/adapters/qmd.py +1701 -0
  337. package/runtime/codex/egregore_runtime/adapters/qmd_cli.py +210 -0
  338. package/runtime/codex/egregore_runtime/adapters/qmd_embed_worker.py +59 -0
  339. package/runtime/codex/egregore_runtime/admin_gate.py +102 -0
  340. package/runtime/codex/egregore_runtime/artifacts.py +523 -0
  341. package/runtime/codex/egregore_runtime/contracts.py +499 -0
  342. package/runtime/codex/egregore_runtime/entitlements.py +85 -0
  343. package/runtime/codex/egregore_runtime/errors.py +10 -0
  344. package/runtime/codex/egregore_runtime/graph.py +356 -0
  345. package/runtime/codex/egregore_runtime/handoff_lookup.py +196 -0
  346. package/runtime/codex/egregore_runtime/harness_cli.py +1221 -0
  347. package/runtime/codex/egregore_runtime/identity.py +734 -0
  348. package/runtime/codex/egregore_runtime/identity_cli.py +91 -0
  349. package/runtime/codex/egregore_runtime/ingest.py +575 -0
  350. package/runtime/codex/egregore_runtime/ingest_cli.py +254 -0
  351. package/runtime/codex/egregore_runtime/ingest_index_cli.py +147 -0
  352. package/runtime/codex/egregore_runtime/invitation_cli.py +51 -0
  353. package/runtime/codex/egregore_runtime/invitations.py +116 -0
  354. package/runtime/codex/egregore_runtime/issue_cli.py +305 -0
  355. package/runtime/codex/egregore_runtime/issues.py +359 -0
  356. package/runtime/codex/egregore_runtime/knowledge.py +376 -0
  357. package/runtime/codex/egregore_runtime/knowledge_cli.py +173 -0
  358. package/runtime/codex/egregore_runtime/lifecycle.py +888 -0
  359. package/runtime/codex/egregore_runtime/lifecycle_cli.py +269 -0
  360. package/runtime/codex/egregore_runtime/notification_cli.py +125 -0
  361. package/runtime/codex/egregore_runtime/notifications.py +230 -0
  362. package/runtime/codex/egregore_runtime/observe.py +342 -0
  363. package/runtime/codex/egregore_runtime/onboarding.py +290 -0
  364. package/runtime/codex/egregore_runtime/onboarding_cli.py +110 -0
  365. package/runtime/codex/egregore_runtime/policy.py +144 -0
  366. package/runtime/codex/egregore_runtime/profile.py +193 -0
  367. package/runtime/codex/egregore_runtime/quest_cli.py +216 -0
  368. package/runtime/codex/egregore_runtime/question_cli.py +180 -0
  369. package/runtime/codex/egregore_runtime/questions.py +304 -0
  370. package/runtime/codex/egregore_runtime/quests.py +419 -0
  371. package/runtime/codex/egregore_runtime/readiness.py +379 -0
  372. package/runtime/codex/egregore_runtime/research_ingest.py +256 -0
  373. package/runtime/codex/egregore_runtime/research_ingest_cli.py +44 -0
  374. package/runtime/codex/egregore_runtime/runtime.py +464 -0
  375. package/runtime/codex/egregore_runtime/scroll_cli.py +185 -0
  376. package/runtime/codex/egregore_runtime/scrolls.py +726 -0
  377. package/runtime/codex/egregore_runtime/status.py +412 -0
  378. package/runtime/codex/egregore_runtime/status_cli.py +174 -0
  379. package/runtime/codex/egregore_runtime/sync.py +218 -0
  380. package/runtime/codex/egregore_runtime/teamsync.py +139 -0
  381. package/runtime/codex/egregore_runtime/telemetry.py +640 -0
  382. package/runtime/codex/egregore_runtime/thread_cli.py +173 -0
  383. package/runtime/codex/egregore_runtime/threads.py +517 -0
  384. package/runtime/codex/egregore_runtime/todo_cli.py +142 -0
  385. package/runtime/codex/egregore_runtime/todos.py +244 -0
  386. package/runtime/codex/egregore_runtime/upgrade.py +770 -0
  387. package/runtime/codex/egregore_runtime/upgrade_worker.py +53 -0
  388. package/runtime/codex/egregore_runtime/writeback.py +391 -0
  389. package/runtime/codex/egregore_runtime/writeback_cli.py +114 -0
  390. package/runtime/codex/manifest.json +98 -1
  391. package/runtime/pi/.codex/hooks/search-hint.js +21 -52
  392. package/runtime/pi/.codex/hooks.json +3 -3
  393. package/runtime/pi/.codex/skills/activity/SKILL.md +23 -66
  394. package/runtime/pi/.codex/skills/announce/SKILL.md +27 -50
  395. package/runtime/pi/.codex/skills/archive/SKILL.md +21 -36
  396. package/runtime/pi/.codex/skills/checkup/SKILL.md +77 -36
  397. package/runtime/pi/.codex/skills/dark-mode/SKILL.md +1 -1
  398. package/runtime/pi/.codex/skills/dashboard/SKILL.md +17 -47
  399. package/runtime/pi/.codex/skills/handoff/SKILL.md +84 -133
  400. package/runtime/pi/.codex/skills/harvest/SKILL.md +32 -117
  401. package/runtime/pi/.codex/skills/ingest/SKILL.md +47 -25
  402. package/runtime/pi/.codex/skills/ingest-user-interview/SKILL.md +18 -36
  403. package/runtime/pi/.codex/skills/ingest-user-interview/references/analysis-contract.md +42 -0
  404. package/runtime/pi/.codex/skills/invite/SKILL.md +21 -35
  405. package/runtime/pi/.codex/skills/issue/SKILL.md +60 -41
  406. package/runtime/pi/.codex/skills/me/SKILL.md +1 -1
  407. package/runtime/pi/.codex/skills/meeting/SKILL.md +16 -36
  408. package/runtime/pi/.codex/skills/meeting/references/analysis-contract.md +48 -0
  409. package/runtime/pi/.codex/skills/note/SKILL.md +30 -25
  410. package/runtime/pi/.codex/skills/onboarding/SKILL.md +36 -41
  411. package/runtime/pi/.codex/skills/pull/SKILL.md +1 -1
  412. package/runtime/pi/.codex/skills/quest/SKILL.md +27 -66
  413. package/runtime/pi/.codex/skills/reflect/SKILL.md +22 -36
  414. package/runtime/pi/.codex/skills/save/SKILL.md +2 -2
  415. package/runtime/pi/.codex/skills/telemetry/SKILL.md +1 -1
  416. package/runtime/pi/.codex/skills/test/SKILL.md +1 -1
  417. package/runtime/pi/.codex/skills/tutorial/SKILL.md +40 -41
  418. package/runtime/pi/.codex/skills/view/SKILL.md +115 -111
  419. package/runtime/pi/.codex/skills/wrap/SKILL.md +45 -41
  420. package/runtime/pi/.codex/spec-manifest.json +9 -9
  421. package/runtime/pi/.pi/APPEND_SYSTEM.md +57 -48
  422. package/runtime/pi/.pi/extensions/egregore.ts +7 -0
  423. package/runtime/pi/.pi/spec-manifest.json +2 -2
  424. package/runtime/pi/AGENTS.md +62 -58
  425. package/runtime/pi/bin/activity-action.sh +92 -0
  426. package/runtime/pi/bin/activity-data.sh +12 -233
  427. package/runtime/pi/bin/agent.sh +84 -100
  428. package/runtime/pi/bin/artifact-register.sh +164 -0
  429. package/runtime/pi/bin/artifact-writeback.sh +53 -0
  430. package/runtime/pi/bin/artifacts.sh +288 -0
  431. package/runtime/pi/bin/build-sealed-dataroom.mjs +722 -0
  432. package/runtime/pi/bin/capture-run.sh +18 -2
  433. package/runtime/pi/bin/codex-render-spec.mjs +41 -16
  434. package/runtime/pi/bin/codex-session-start.sh +14 -4
  435. package/runtime/pi/bin/codex-skill-render.mjs +9 -7
  436. package/runtime/pi/bin/corpus_map.py +806 -0
  437. package/runtime/pi/bin/corpus_survey.py +304 -0
  438. package/runtime/pi/bin/dashboard-data.sh +11 -171
  439. package/runtime/pi/bin/github-auth.sh +121 -0
  440. package/runtime/pi/bin/graph-batch.sh +7 -0
  441. package/runtime/pi/bin/graph-op.sh +4 -0
  442. package/runtime/pi/bin/graph-projection.sh +54 -0
  443. package/runtime/pi/bin/graph-wal.sh +13 -0
  444. package/runtime/pi/bin/graph.sh +44 -0
  445. package/runtime/pi/bin/handoff-lifecycle-job.sh +146 -0
  446. package/runtime/pi/bin/handoff-lifecycle.sh +280 -0
  447. package/runtime/pi/bin/handoff-preview.sh +169 -0
  448. package/runtime/pi/bin/handoff-run.sh +42 -26
  449. package/runtime/pi/bin/ingest-graph.sh +6 -0
  450. package/runtime/pi/bin/ingest-item.sh +10 -0
  451. package/runtime/pi/bin/ingest.sh +59 -30
  452. package/runtime/pi/bin/invite.sh +6 -0
  453. package/runtime/pi/bin/issue.sh +10 -0
  454. package/runtime/pi/bin/knowledge.sh +10 -0
  455. package/runtime/pi/bin/lib/config.sh +20 -0
  456. package/runtime/pi/bin/lib/context.sh +46 -25
  457. package/runtime/pi/bin/lib/git-sync.sh +70 -6
  458. package/runtime/pi/bin/lib/greeting.sh +34 -5
  459. package/runtime/pi/bin/lib/handoff-meta.sh +97 -0
  460. package/runtime/pi/bin/lib/worktree-links.sh +6 -0
  461. package/runtime/pi/bin/node-run.sh +42 -0
  462. package/runtime/pi/bin/notification.sh +6 -0
  463. package/runtime/pi/bin/observe-context.sh +14 -0
  464. package/runtime/pi/bin/onboarding.sh +6 -0
  465. package/runtime/pi/bin/person.py +4 -0
  466. package/runtime/pi/bin/person.sh +43 -10
  467. package/runtime/pi/bin/pi-observe-context.mjs +93 -0
  468. package/runtime/pi/bin/pi-product-workflows.mjs +1 -1
  469. package/runtime/pi/bin/pi-render-spec.mjs +1 -1
  470. package/runtime/pi/bin/post-update.sh +37 -0
  471. package/runtime/pi/bin/prime-render-spec.mjs +147 -0
  472. package/runtime/pi/bin/publish-artifact.sh +55 -2
  473. package/runtime/pi/bin/quest.sh +9 -0
  474. package/runtime/pi/bin/question.sh +8 -0
  475. package/runtime/pi/bin/research-ingest.sh +7 -0
  476. package/runtime/pi/bin/restore-owned-skills.sh +67 -0
  477. package/runtime/pi/bin/retrieval_eval.py +385 -0
  478. package/runtime/pi/bin/runtime-identity.sh +70 -0
  479. package/runtime/pi/bin/runtime-upgrade.sh +43 -0
  480. package/runtime/pi/bin/scroll.sh +9 -0
  481. package/runtime/pi/bin/search.sh +231 -195
  482. package/runtime/pi/bin/settings.sh +174 -5
  483. package/runtime/pi/bin/startup-check.sh +136 -0
  484. package/runtime/pi/bin/telemetry.sh +522 -247
  485. package/runtime/pi/bin/test-changes.sh +344 -0
  486. package/runtime/pi/bin/thread.sh +9 -0
  487. package/runtime/pi/bin/todo.sh +9 -0
  488. package/runtime/pi/bin/view-render.sh +126 -0
  489. package/runtime/pi/bin/worktree-create.sh +19 -5
  490. package/runtime/pi/egregore_runtime/__init__.py +228 -0
  491. package/runtime/pi/egregore_runtime/adapters/__init__.py +5 -0
  492. package/runtime/pi/egregore_runtime/adapters/invitation.py +237 -0
  493. package/runtime/pi/egregore_runtime/adapters/notification.py +59 -0
  494. package/runtime/pi/egregore_runtime/adapters/qmd.py +1701 -0
  495. package/runtime/pi/egregore_runtime/adapters/qmd_cli.py +210 -0
  496. package/runtime/pi/egregore_runtime/adapters/qmd_embed_worker.py +59 -0
  497. package/runtime/pi/egregore_runtime/admin_gate.py +102 -0
  498. package/runtime/pi/egregore_runtime/artifacts.py +523 -0
  499. package/runtime/pi/egregore_runtime/contracts.py +499 -0
  500. package/runtime/pi/egregore_runtime/entitlements.py +85 -0
  501. package/runtime/pi/egregore_runtime/errors.py +10 -0
  502. package/runtime/pi/egregore_runtime/graph.py +356 -0
  503. package/runtime/pi/egregore_runtime/handoff_lookup.py +196 -0
  504. package/runtime/pi/egregore_runtime/harness_cli.py +1221 -0
  505. package/runtime/pi/egregore_runtime/identity.py +734 -0
  506. package/runtime/pi/egregore_runtime/identity_cli.py +91 -0
  507. package/runtime/pi/egregore_runtime/ingest.py +575 -0
  508. package/runtime/pi/egregore_runtime/ingest_cli.py +254 -0
  509. package/runtime/pi/egregore_runtime/ingest_index_cli.py +147 -0
  510. package/runtime/pi/egregore_runtime/invitation_cli.py +51 -0
  511. package/runtime/pi/egregore_runtime/invitations.py +116 -0
  512. package/runtime/pi/egregore_runtime/issue_cli.py +305 -0
  513. package/runtime/pi/egregore_runtime/issues.py +359 -0
  514. package/runtime/pi/egregore_runtime/knowledge.py +376 -0
  515. package/runtime/pi/egregore_runtime/knowledge_cli.py +173 -0
  516. package/runtime/pi/egregore_runtime/lifecycle.py +888 -0
  517. package/runtime/pi/egregore_runtime/lifecycle_cli.py +269 -0
  518. package/runtime/pi/egregore_runtime/notification_cli.py +125 -0
  519. package/runtime/pi/egregore_runtime/notifications.py +230 -0
  520. package/runtime/pi/egregore_runtime/observe.py +342 -0
  521. package/runtime/pi/egregore_runtime/onboarding.py +290 -0
  522. package/runtime/pi/egregore_runtime/onboarding_cli.py +110 -0
  523. package/runtime/pi/egregore_runtime/policy.py +144 -0
  524. package/runtime/pi/egregore_runtime/profile.py +193 -0
  525. package/runtime/pi/egregore_runtime/quest_cli.py +216 -0
  526. package/runtime/pi/egregore_runtime/question_cli.py +180 -0
  527. package/runtime/pi/egregore_runtime/questions.py +304 -0
  528. package/runtime/pi/egregore_runtime/quests.py +419 -0
  529. package/runtime/pi/egregore_runtime/readiness.py +379 -0
  530. package/runtime/pi/egregore_runtime/research_ingest.py +256 -0
  531. package/runtime/pi/egregore_runtime/research_ingest_cli.py +44 -0
  532. package/runtime/pi/egregore_runtime/runtime.py +464 -0
  533. package/runtime/pi/egregore_runtime/scroll_cli.py +185 -0
  534. package/runtime/pi/egregore_runtime/scrolls.py +726 -0
  535. package/runtime/pi/egregore_runtime/status.py +412 -0
  536. package/runtime/pi/egregore_runtime/status_cli.py +174 -0
  537. package/runtime/pi/egregore_runtime/sync.py +218 -0
  538. package/runtime/pi/egregore_runtime/teamsync.py +139 -0
  539. package/runtime/pi/egregore_runtime/telemetry.py +640 -0
  540. package/runtime/pi/egregore_runtime/thread_cli.py +173 -0
  541. package/runtime/pi/egregore_runtime/threads.py +517 -0
  542. package/runtime/pi/egregore_runtime/todo_cli.py +142 -0
  543. package/runtime/pi/egregore_runtime/todos.py +244 -0
  544. package/runtime/pi/egregore_runtime/upgrade.py +770 -0
  545. package/runtime/pi/egregore_runtime/upgrade_worker.py +53 -0
  546. package/runtime/pi/egregore_runtime/writeback.py +391 -0
  547. package/runtime/pi/egregore_runtime/writeback_cli.py +114 -0
  548. package/runtime/pi/manifest.json +98 -1
  549. package/runtime/prime/.codex/hooks/search-hint.js +21 -52
  550. package/runtime/prime/.codex/hooks.json +3 -3
  551. package/runtime/prime/.codex/skills/activity/SKILL.md +23 -66
  552. package/runtime/prime/.codex/skills/announce/SKILL.md +27 -50
  553. package/runtime/prime/.codex/skills/archive/SKILL.md +21 -36
  554. package/runtime/prime/.codex/skills/checkup/SKILL.md +77 -36
  555. package/runtime/prime/.codex/skills/dark-mode/SKILL.md +1 -1
  556. package/runtime/prime/.codex/skills/dashboard/SKILL.md +17 -47
  557. package/runtime/prime/.codex/skills/handoff/SKILL.md +84 -133
  558. package/runtime/prime/.codex/skills/harvest/SKILL.md +32 -117
  559. package/runtime/prime/.codex/skills/ingest/SKILL.md +47 -25
  560. package/runtime/prime/.codex/skills/ingest-user-interview/SKILL.md +18 -36
  561. package/runtime/prime/.codex/skills/ingest-user-interview/references/analysis-contract.md +42 -0
  562. package/runtime/prime/.codex/skills/invite/SKILL.md +21 -35
  563. package/runtime/prime/.codex/skills/issue/SKILL.md +60 -41
  564. package/runtime/prime/.codex/skills/me/SKILL.md +1 -1
  565. package/runtime/prime/.codex/skills/meeting/SKILL.md +16 -36
  566. package/runtime/prime/.codex/skills/meeting/references/analysis-contract.md +48 -0
  567. package/runtime/prime/.codex/skills/note/SKILL.md +30 -25
  568. package/runtime/prime/.codex/skills/onboarding/SKILL.md +36 -41
  569. package/runtime/prime/.codex/skills/pull/SKILL.md +1 -1
  570. package/runtime/prime/.codex/skills/quest/SKILL.md +27 -66
  571. package/runtime/prime/.codex/skills/reflect/SKILL.md +22 -36
  572. package/runtime/prime/.codex/skills/save/SKILL.md +2 -2
  573. package/runtime/prime/.codex/skills/telemetry/SKILL.md +1 -1
  574. package/runtime/prime/.codex/skills/test/SKILL.md +1 -1
  575. package/runtime/prime/.codex/skills/tutorial/SKILL.md +40 -41
  576. package/runtime/prime/.codex/skills/view/SKILL.md +115 -111
  577. package/runtime/prime/.codex/skills/wrap/SKILL.md +45 -41
  578. package/runtime/prime/.codex/spec-manifest.json +9 -9
  579. package/runtime/prime/.prime/agent/APPEND_SYSTEM.md +57 -48
  580. package/runtime/prime/.prime/agent/extensions/egregore.ts +7 -0
  581. package/runtime/prime/.prime/agent/spec-manifest.json +2 -2
  582. package/runtime/prime/AGENTS.md +62 -58
  583. package/runtime/prime/bin/activity-action.sh +92 -0
  584. package/runtime/prime/bin/activity-data.sh +12 -233
  585. package/runtime/prime/bin/agent.sh +84 -100
  586. package/runtime/prime/bin/artifact-register.sh +164 -0
  587. package/runtime/prime/bin/artifact-writeback.sh +53 -0
  588. package/runtime/prime/bin/artifacts.sh +288 -0
  589. package/runtime/prime/bin/build-sealed-dataroom.mjs +722 -0
  590. package/runtime/prime/bin/capture-run.sh +18 -2
  591. package/runtime/prime/bin/codex-render-spec.mjs +41 -16
  592. package/runtime/prime/bin/codex-session-start.sh +14 -4
  593. package/runtime/prime/bin/codex-skill-render.mjs +9 -7
  594. package/runtime/prime/bin/corpus_map.py +806 -0
  595. package/runtime/prime/bin/corpus_survey.py +304 -0
  596. package/runtime/prime/bin/dashboard-data.sh +11 -171
  597. package/runtime/prime/bin/github-auth.sh +121 -0
  598. package/runtime/prime/bin/graph-batch.sh +7 -0
  599. package/runtime/prime/bin/graph-op.sh +4 -0
  600. package/runtime/prime/bin/graph-projection.sh +54 -0
  601. package/runtime/prime/bin/graph-wal.sh +13 -0
  602. package/runtime/prime/bin/graph.sh +44 -0
  603. package/runtime/prime/bin/handoff-lifecycle-job.sh +146 -0
  604. package/runtime/prime/bin/handoff-lifecycle.sh +280 -0
  605. package/runtime/prime/bin/handoff-preview.sh +169 -0
  606. package/runtime/prime/bin/handoff-run.sh +42 -26
  607. package/runtime/prime/bin/ingest-graph.sh +6 -0
  608. package/runtime/prime/bin/ingest-item.sh +10 -0
  609. package/runtime/prime/bin/ingest.sh +59 -30
  610. package/runtime/prime/bin/invite.sh +6 -0
  611. package/runtime/prime/bin/issue.sh +10 -0
  612. package/runtime/prime/bin/knowledge.sh +10 -0
  613. package/runtime/prime/bin/lib/config.sh +20 -0
  614. package/runtime/prime/bin/lib/context.sh +46 -25
  615. package/runtime/prime/bin/lib/git-sync.sh +70 -6
  616. package/runtime/prime/bin/lib/greeting.sh +34 -5
  617. package/runtime/prime/bin/lib/handoff-meta.sh +97 -0
  618. package/runtime/prime/bin/lib/worktree-links.sh +6 -0
  619. package/runtime/prime/bin/node-run.sh +42 -0
  620. package/runtime/prime/bin/notification.sh +6 -0
  621. package/runtime/prime/bin/observe-context.sh +14 -0
  622. package/runtime/prime/bin/onboarding.sh +6 -0
  623. package/runtime/prime/bin/person.py +4 -0
  624. package/runtime/prime/bin/person.sh +43 -10
  625. package/runtime/prime/bin/pi-observe-context.mjs +93 -0
  626. package/runtime/prime/bin/pi-product-workflows.mjs +1 -1
  627. package/runtime/prime/bin/pi-render-spec.mjs +140 -0
  628. package/runtime/prime/bin/post-update.sh +37 -0
  629. package/runtime/prime/bin/prime-render-spec.mjs +1 -1
  630. package/runtime/prime/bin/publish-artifact.sh +55 -2
  631. package/runtime/prime/bin/quest.sh +9 -0
  632. package/runtime/prime/bin/question.sh +8 -0
  633. package/runtime/prime/bin/research-ingest.sh +7 -0
  634. package/runtime/prime/bin/restore-owned-skills.sh +67 -0
  635. package/runtime/prime/bin/retrieval_eval.py +385 -0
  636. package/runtime/prime/bin/runtime-identity.sh +70 -0
  637. package/runtime/prime/bin/runtime-upgrade.sh +43 -0
  638. package/runtime/prime/bin/scroll.sh +9 -0
  639. package/runtime/prime/bin/search.sh +231 -195
  640. package/runtime/prime/bin/settings.sh +174 -5
  641. package/runtime/prime/bin/startup-check.sh +136 -0
  642. package/runtime/prime/bin/telemetry.sh +522 -247
  643. package/runtime/prime/bin/test-changes.sh +344 -0
  644. package/runtime/prime/bin/thread.sh +9 -0
  645. package/runtime/prime/bin/todo.sh +9 -0
  646. package/runtime/prime/bin/view-render.sh +126 -0
  647. package/runtime/prime/bin/worktree-create.sh +19 -5
  648. package/runtime/prime/egregore_runtime/__init__.py +228 -0
  649. package/runtime/prime/egregore_runtime/adapters/__init__.py +5 -0
  650. package/runtime/prime/egregore_runtime/adapters/invitation.py +237 -0
  651. package/runtime/prime/egregore_runtime/adapters/notification.py +59 -0
  652. package/runtime/prime/egregore_runtime/adapters/qmd.py +1701 -0
  653. package/runtime/prime/egregore_runtime/adapters/qmd_cli.py +210 -0
  654. package/runtime/prime/egregore_runtime/adapters/qmd_embed_worker.py +59 -0
  655. package/runtime/prime/egregore_runtime/admin_gate.py +102 -0
  656. package/runtime/prime/egregore_runtime/artifacts.py +523 -0
  657. package/runtime/prime/egregore_runtime/contracts.py +499 -0
  658. package/runtime/prime/egregore_runtime/entitlements.py +85 -0
  659. package/runtime/prime/egregore_runtime/errors.py +10 -0
  660. package/runtime/prime/egregore_runtime/graph.py +356 -0
  661. package/runtime/prime/egregore_runtime/handoff_lookup.py +196 -0
  662. package/runtime/prime/egregore_runtime/harness_cli.py +1221 -0
  663. package/runtime/prime/egregore_runtime/identity.py +734 -0
  664. package/runtime/prime/egregore_runtime/identity_cli.py +91 -0
  665. package/runtime/prime/egregore_runtime/ingest.py +575 -0
  666. package/runtime/prime/egregore_runtime/ingest_cli.py +254 -0
  667. package/runtime/prime/egregore_runtime/ingest_index_cli.py +147 -0
  668. package/runtime/prime/egregore_runtime/invitation_cli.py +51 -0
  669. package/runtime/prime/egregore_runtime/invitations.py +116 -0
  670. package/runtime/prime/egregore_runtime/issue_cli.py +305 -0
  671. package/runtime/prime/egregore_runtime/issues.py +359 -0
  672. package/runtime/prime/egregore_runtime/knowledge.py +376 -0
  673. package/runtime/prime/egregore_runtime/knowledge_cli.py +173 -0
  674. package/runtime/prime/egregore_runtime/lifecycle.py +888 -0
  675. package/runtime/prime/egregore_runtime/lifecycle_cli.py +269 -0
  676. package/runtime/prime/egregore_runtime/notification_cli.py +125 -0
  677. package/runtime/prime/egregore_runtime/notifications.py +230 -0
  678. package/runtime/prime/egregore_runtime/observe.py +342 -0
  679. package/runtime/prime/egregore_runtime/onboarding.py +290 -0
  680. package/runtime/prime/egregore_runtime/onboarding_cli.py +110 -0
  681. package/runtime/prime/egregore_runtime/policy.py +144 -0
  682. package/runtime/prime/egregore_runtime/profile.py +193 -0
  683. package/runtime/prime/egregore_runtime/quest_cli.py +216 -0
  684. package/runtime/prime/egregore_runtime/question_cli.py +180 -0
  685. package/runtime/prime/egregore_runtime/questions.py +304 -0
  686. package/runtime/prime/egregore_runtime/quests.py +419 -0
  687. package/runtime/prime/egregore_runtime/readiness.py +379 -0
  688. package/runtime/prime/egregore_runtime/research_ingest.py +256 -0
  689. package/runtime/prime/egregore_runtime/research_ingest_cli.py +44 -0
  690. package/runtime/prime/egregore_runtime/runtime.py +464 -0
  691. package/runtime/prime/egregore_runtime/scroll_cli.py +185 -0
  692. package/runtime/prime/egregore_runtime/scrolls.py +726 -0
  693. package/runtime/prime/egregore_runtime/status.py +412 -0
  694. package/runtime/prime/egregore_runtime/status_cli.py +174 -0
  695. package/runtime/prime/egregore_runtime/sync.py +218 -0
  696. package/runtime/prime/egregore_runtime/teamsync.py +139 -0
  697. package/runtime/prime/egregore_runtime/telemetry.py +640 -0
  698. package/runtime/prime/egregore_runtime/thread_cli.py +173 -0
  699. package/runtime/prime/egregore_runtime/threads.py +517 -0
  700. package/runtime/prime/egregore_runtime/todo_cli.py +142 -0
  701. package/runtime/prime/egregore_runtime/todos.py +244 -0
  702. package/runtime/prime/egregore_runtime/upgrade.py +770 -0
  703. package/runtime/prime/egregore_runtime/upgrade_worker.py +53 -0
  704. package/runtime/prime/egregore_runtime/writeback.py +391 -0
  705. package/runtime/prime/egregore_runtime/writeback_cli.py +114 -0
  706. package/runtime/prime/manifest.json +98 -1
@@ -0,0 +1,722 @@
1
+ #!/usr/bin/env node
2
+ // build-sealed-dataroom.mjs
3
+ //
4
+ // Builds the Egregore Labs investor data room emissary, SEALED on both faces:
5
+ // - human face: a gate page (render_html) that AES-GCM-decrypts the room
6
+ // HTML in the browser, captures an email, and records the visit.
7
+ // - agent face: a SEALED executable_spec. The four documents (deck, content
8
+ // base, paper, evals) are inlined as ONE encrypted corpus blob — ciphertext
9
+ // only, no plaintext, no child /raw URLs. The agent asks for the room
10
+ // password (intake), runs an embedded deterministic Node helper to decrypt
11
+ // the corpus locally, and works through it in-session.
12
+ //
13
+ // Invariant: public raw may expose the runnable shell and ciphertext, but
14
+ // never the data-room corpus in plaintext (parent or child raw endpoints).
15
+ //
16
+ // Seal scheme (both faces), same as Cem's "travels under seal" page:
17
+ // PBKDF2-HMAC-SHA256(pw, salt, 250000, 32B) -> AES-256-GCM(iv) -> {s,i,c}
18
+ // where c = base64( ciphertext || 16-byte GCM tag ) (WebCrypto layout).
19
+ // Both the corpus AND the room HTML are gzipped before encryption; the agent
20
+ // gunzips the corpus with node:zlib, the browser gunzips the room via
21
+ // DecompressionStream after decrypt. Gzipping the room keeps render_html under
22
+ // the relay's custom-render byte cap even with the deck/paper/evals inlined.
23
+ //
24
+ // Usage:
25
+ // bash bin/node-run.sh bin/build-sealed-dataroom.mjs <room.html> [--password <pw>] \
26
+ // [--out-gate <path>] [--out-answers <path>]
27
+ // Password defaults to env DATAROOM_PASSWORD or "collectivegrowth".
28
+
29
+ import crypto from 'node:crypto';
30
+ import { readFileSync, writeFileSync } from 'node:fs';
31
+ import { webcrypto } from 'node:crypto';
32
+ import { gzipSync, gunzipSync } from 'node:zlib';
33
+ import { fileURLToPath } from 'node:url';
34
+ import path from 'node:path';
35
+
36
+ const argv = process.argv.slice(2);
37
+ const roomPath = argv.find((a) => !a.startsWith('--'));
38
+ function flag(name, def) {
39
+ const i = argv.indexOf(`--${name}`);
40
+ return i >= 0 && argv[i + 1] ? argv[i + 1] : def;
41
+ }
42
+ if (!roomPath) {
43
+ console.error('usage: bash bin/node-run.sh bin/build-sealed-dataroom.mjs <room.html> [--password pw]');
44
+ process.exit(1);
45
+ }
46
+ const PASSWORD = flag('password', process.env.DATAROOM_PASSWORD || 'collectivegrowth');
47
+ const OUT_GATE = flag('out-gate', '/tmp/dataroom-gate.html');
48
+ const OUT_ANSWERS = flag('out-answers', '/tmp/dataroom-answers.json');
49
+ // Debug/test only: also write the enhanced room BEFORE sealing, so a fixture
50
+ // test can assert the enhanceRoomForAgentFlow transform without decrypting.
51
+ // Off by default — never written unless --out-room is passed explicitly.
52
+ const OUT_ROOM = flag('out-room', '');
53
+ // The gate page is served from EMISSARY_WEB_ORIGIN (egregore.xyz), but the
54
+ // write API (/api/v1/emissary/gate-visit) lives on the Railway backend — a
55
+ // different origin. A relative POST would hit egregore.xyz and never reach
56
+ // the API, so the page must call the API at its ABSOLUTE origin (CORS already
57
+ // allows egregore.xyz). Override with --api-base / DATAROOM_API_BASE per env.
58
+ const API_BASE = flag(
59
+ 'api-base',
60
+ process.env.DATAROOM_API_BASE || 'https://egregore-production-55f2.up.railway.app'
61
+ ).replace(/\/+$/, '');
62
+
63
+ const ITER = 250000;
64
+
65
+ // Canonical local corpus — the four documents, committed under
66
+ // bin/dataroom-corpus/ (see that dir's SOURCES.md). The build reads these;
67
+ // it never fetches live /raw. The former child emissaries (provenance IDs in
68
+ // SOURCES.md) are retired. Override the dir with --corpus-dir for tests.
69
+ const SCRIPT_DIR = path.dirname(fileURLToPath(import.meta.url));
70
+ const CORPUS_DIR = flag('corpus-dir', path.join(SCRIPT_DIR, 'dataroom-corpus'));
71
+ const CORPUS_FILES = {
72
+ deck: 'deck.json',
73
+ contentBase: 'content-base.json',
74
+ paper: 'paper.json',
75
+ evals: 'evals.json',
76
+ };
77
+ // Sanitized snapshots of the live child browser renders. These preserve the
78
+ // deck/paper/evals visual designs for the human path while stripping child
79
+ // emissary URLs, receiver chrome, and raw launch prompts. They are injected
80
+ // into the room before the room seal, so published output still carries only
81
+ // ciphertext. Override with --render-dir for tests.
82
+ const RENDER_DIR = flag('render-dir', path.join(SCRIPT_DIR, 'dataroom-renders'));
83
+ const BROWSER_RENDER_FILES = {
84
+ deck: 'deck.html',
85
+ paper: 'paper.html',
86
+ evals: 'evals.html',
87
+ };
88
+ const BROWSER_DOCS = {
89
+ deck: {
90
+ title: 'The Deck',
91
+ label: 'Deck',
92
+ sourceId: '6dd3a4bd-bfbd-4285-9383-e3a89367f580',
93
+ },
94
+ paper: {
95
+ title: 'Technical Paper',
96
+ label: 'Paper',
97
+ sourceId: 'df51f4e8-6185-487d-93fc-84ecf5b66000',
98
+ },
99
+ evals: {
100
+ title: 'Evals',
101
+ label: 'Evals',
102
+ sourceId: 'e32c7245-7d22-4cb6-9c63-b00ae0db7075',
103
+ },
104
+ };
105
+ // The canonical install command shown on every emissary surface. Single
106
+ // constant on purpose: copy it to any other surface that emits an install
107
+ // command, and the room-enhance regex normalizes older variants to this.
108
+ const INSTALL_COMMAND = 'npx egregore-emissary@latest install';
109
+
110
+ // Font stacks: lead with the design's Spectral / IBM Plex Mono, then fall
111
+ // back to the room's own serif/mono so the section reads correctly even if
112
+ // the room does not load the Google fonts.
113
+ const SERIF_STACK = `'Spectral','Iowan Old Style',Palatino,Georgia,serif`;
114
+ const MONO_STACK = `'IBM Plex Mono','SF Mono',ui-monospace,Menlo,monospace`;
115
+
116
+ // Variant A — "Wired flow". A skill-first vertical flow with a connector
117
+ // spine; install once (step 1), then open the room by handing the agent the
118
+ // bare page URL (step 2). De-alarming copy: no "packet" / "run this" /
119
+ // "launch prompt" — step 2 is a sanctioned skill invocation on a URL.
120
+ //
121
+ // FIXED-DARK EXCEPTION: colors below are emitted as literal hex on purpose.
122
+ // The sealed data room is a bespoke, always-dark standalone artifact — there
123
+ // is no light mode and no theme toggle that a CSS variable could let override.
124
+ // The token-only/dark-mode rule governs the theme-overridable renderer in
125
+ // packages/egregore-artifacts, not this page; the design handoff specifies
126
+ // these exact values as the source of truth. Do not "tokenize" without a real
127
+ // light-mode target to override them.
128
+ const AGENT_FLOW_CSS = `
129
+ .agent-path { width:100%; max-width:760px; margin:60px auto 0; }
130
+ .agent-path .eg-nav-copy { transition:background .15s; }
131
+ .agent-path .eg-nav-copy:hover { background:rgba(225,140,80,0.14); }
132
+ .agent-path .eg-nav-copy:active { background:rgba(225,140,80,0.22); }
133
+ `;
134
+
135
+ const AGENT_FLOW_HTML = `
136
+ <section class="action agent-path" data-eg-agent-path="1">
137
+ <div style="font-family:${MONO_STACK}; font-size:11px; letter-spacing:0.2em; text-transform:uppercase; color:#c2683f;">Navigate with your agent</div>
138
+ <div style="font-family:${SERIF_STACK}; font-size:clamp(18px,2.4vw,20px); line-height:1.5; color:#e7dccf; margin-top:13px;">This room is an emissary — your agent can walk you through it.</div>
139
+ <div style="font-family:${MONO_STACK}; font-size:12px; line-height:1.7; color:#8f8073; margin-top:9px;">New here? Start at step 1. Already have the skill? Skip to step 2.</div>
140
+ <div style="height:1px; background:rgba(210,150,110,0.12); margin:clamp(20px,3vw,28px) 0 clamp(20px,3vw,26px);"></div>
141
+ <div style="display:flex; flex-direction:column;">
142
+ <div style="display:flex; align-items:stretch; gap:clamp(12px,2vw,18px);">
143
+ <div style="flex:none; width:32px; display:flex; flex-direction:column; align-items:center;">
144
+ <div style="width:32px; height:32px; border-radius:50%; border:1px solid rgba(225,140,80,0.55); color:#e2864a; font-family:${MONO_STACK}; font-size:13px; display:flex; align-items:center; justify-content:center;">1</div>
145
+ <div style="flex:1; width:1px; background:linear-gradient(180deg,#e2864a77,#e2864a22); margin-top:8px;"></div>
146
+ </div>
147
+ <div style="flex:1; min-width:0; padding-bottom:clamp(24px,3vw,32px);">
148
+ <div style="display:flex; align-items:center; gap:9px;">
149
+ <div style="flex:none; width:16px; border-top:1px dashed rgba(225,140,80,0.55);"></div>
150
+ <div style="flex:none; font-family:${MONO_STACK}; font-size:11px; letter-spacing:0.13em; text-transform:uppercase; color:#c2683f;">For first-time users <span style="color:#6f6256;">· one-time</span></div>
151
+ <div style="flex:1; min-width:14px; border-top:1px dashed rgba(225,140,80,0.3);"></div>
152
+ <div style="flex:none; color:#e2864a; font-family:${MONO_STACK}; font-size:12px; line-height:1;">▸</div>
153
+ </div>
154
+ <div style="display:flex; gap:18px; flex-wrap:wrap; align-items:flex-start; margin-top:12px;">
155
+ <div style="flex:1 1 230px; min-width:200px;">
156
+ <div style="font-family:${SERIF_STACK}; font-size:clamp(18px,2.2vw,20px); color:#ece1d4;">Install the receiver skill</div>
157
+ <div style="font-family:${SERIF_STACK}; font-size:14.5px; line-height:1.55; color:#a99a8b; margin-top:6px;">Paste this into your terminal once. It teaches your agent how to open Egregore emissaries. One-time setup, consent at every step.</div>
158
+ </div>
159
+ <div style="flex:1 1 240px; min-width:225px; background:#140e0a; border:1px solid rgba(225,140,80,0.16); border-radius:7px; padding:13px;">
160
+ <div style="font-family:${MONO_STACK}; font-size:12.5px; color:#d7c3b2; word-break:break-all; line-height:1.5;">${INSTALL_COMMAND}</div>
161
+ <button class="eg-nav-copy" data-eg-copy="${INSTALL_COMMAND}" style="margin-top:11px; width:100%; min-height:44px; font-family:${MONO_STACK}; font-size:11px; letter-spacing:0.06em; text-transform:uppercase; color:#e2864a; background:transparent; border:1px solid rgba(225,140,80,0.4); border-radius:5px; padding:0 11px; cursor:pointer;">Copy</button>
162
+ </div>
163
+ </div>
164
+ </div>
165
+ </div>
166
+ <div style="display:flex; align-items:stretch; gap:clamp(12px,2vw,18px);">
167
+ <div style="flex:none; width:32px; display:flex; flex-direction:column; align-items:center;">
168
+ <div style="width:32px; height:32px; border-radius:50%; background:#e2864a; color:#1a120e; font-family:${MONO_STACK}; font-size:13px; display:flex; align-items:center; justify-content:center;">2</div>
169
+ </div>
170
+ <div style="flex:1; min-width:0;">
171
+ <div style="display:flex; align-items:center; gap:9px;">
172
+ <div style="flex:none; width:16px; border-top:1px dashed rgba(225,140,80,0.55);"></div>
173
+ <div style="flex:none; font-family:${MONO_STACK}; font-size:11px; letter-spacing:0.13em; text-transform:uppercase; color:#e2864a;">Once installed <span style="color:#8f8073;">· everyone lands here</span></div>
174
+ <div style="flex:1; min-width:14px; border-top:1px dashed rgba(225,140,80,0.3);"></div>
175
+ <div style="flex:none; color:#e2864a; font-family:${MONO_STACK}; font-size:12px; line-height:1;">▸</div>
176
+ </div>
177
+ <div style="display:flex; gap:18px; flex-wrap:wrap; align-items:flex-start; margin-top:12px;">
178
+ <div style="flex:1 1 230px; min-width:200px;">
179
+ <div style="font-family:${SERIF_STACK}; font-size:clamp(18px,2.2vw,20px); color:#ece1d4;">Open the room</div>
180
+ <div style="font-family:${SERIF_STACK}; font-size:14.5px; line-height:1.55; color:#a99a8b; margin-top:6px;">Paste the link into Claude Code — or any agent harness. With the skill installed, your agent opens the room and walks you through the deck, paper, and evals.</div>
181
+ </div>
182
+ <div style="flex:1 1 240px; min-width:225px; background:#140e0a; border:1px solid rgba(225,140,80,0.16); border-radius:7px; padding:13px;">
183
+ <div id="agent-s2-code" style="font-family:${MONO_STACK}; font-size:12.5px; color:#d7c3b2; word-break:break-all; line-height:1.5;">https://egregore.xyz/emissary/e/…</div>
184
+ <button id="agent-s2-btn" class="eg-nav-copy" data-eg-copy="" style="margin-top:11px; width:100%; min-height:44px; font-family:${MONO_STACK}; font-size:11px; letter-spacing:0.06em; text-transform:uppercase; color:#e2864a; background:transparent; border:1px solid rgba(225,140,80,0.4); border-radius:5px; padding:0 11px; cursor:pointer;">Copy</button>
185
+ </div>
186
+ </div>
187
+ </div>
188
+ </div>
189
+ </div>
190
+ <div style="height:1px; background:rgba(210,150,110,0.12); margin:clamp(20px,3vw,26px) 0 16px;"></div>
191
+ <div style="font-family:${MONO_STACK}; font-size:11px; letter-spacing:0.04em; color:#6f6256;">no account · consent at every step · works in any agent harness</div>
192
+ </section>`;
193
+
194
+ const AGENT_FLOW_SCRIPT = `
195
+ <script data-eg-agent-flow-script="1">
196
+ (function(){
197
+ var pageUrl = location.origin + location.pathname.replace(/\\/+$/,'');
198
+ var code = document.getElementById('agent-s2-code');
199
+ var btn = document.getElementById('agent-s2-btn');
200
+ if (code) code.textContent = pageUrl;
201
+ if (btn) btn.setAttribute('data-eg-copy', pageUrl);
202
+ document.querySelectorAll('.agent-path [data-eg-copy]').forEach(function(b){
203
+ b.addEventListener('click', function(){
204
+ var text = b.getAttribute('data-eg-copy') || '';
205
+ try {
206
+ if (navigator.clipboard && navigator.clipboard.writeText) {
207
+ navigator.clipboard.writeText(text);
208
+ } else {
209
+ var ta = document.createElement('textarea');
210
+ ta.value = text; document.body.appendChild(ta); ta.select();
211
+ document.execCommand('copy'); document.body.removeChild(ta);
212
+ }
213
+ } catch (e) {}
214
+ var old = b.textContent;
215
+ b.textContent = '✓ Copied';
216
+ clearTimeout(b._t);
217
+ b._t = setTimeout(function(){ b.textContent = old; }, 1600);
218
+ });
219
+ });
220
+ })();
221
+ </script>`;
222
+
223
+ const BROWSER_DOCS_CSS = `
224
+ .gcard[data-eg-doc-open] { cursor:pointer; }
225
+ .gcard[data-eg-doc-open]:focus-visible { outline:2px solid rgba(226,134,74,0.9); outline-offset:4px; }
226
+ .gcard[data-eg-doc-open] .gstatus.live { color:#e2864a; }
227
+ .eg-doc-modal[aria-hidden="true"] { display:none; }
228
+ .eg-doc-modal { position:fixed; inset:0; z-index:90; display:grid; grid-template-rows:auto 1fr; background:rgba(8,5,3,0.94); backdrop-filter:blur(10px); }
229
+ .eg-doc-modal-head { display:flex; align-items:center; gap:14px; min-height:58px; padding:12px clamp(14px,3vw,28px); border-bottom:1px solid rgba(226,134,74,0.18); background:#120c08; }
230
+ .eg-doc-modal-kicker { font-family:${MONO_STACK}; font-size:10px; letter-spacing:0.22em; text-transform:uppercase; color:#c2683f; }
231
+ .eg-doc-modal-title { font-family:${SERIF_STACK}; font-size:clamp(18px,2.5vw,23px); color:#ede1d3; margin-left:auto; margin-right:auto; text-align:center; }
232
+ .eg-doc-modal-close { flex:none; min-width:42px; height:38px; border:1px solid rgba(226,134,74,0.4); border-radius:6px; background:transparent; color:#e2864a; font-family:${MONO_STACK}; font-size:20px; line-height:1; cursor:pointer; }
233
+ .eg-doc-modal-close:hover { background:rgba(226,134,74,0.1); }
234
+ .eg-doc-modal-body { min-height:0; padding:clamp(10px,2vw,18px); }
235
+ .eg-doc-frame { display:none; width:100%; height:calc(100vh - 86px); border:1px solid rgba(226,134,74,0.16); border-radius:10px; background:#15110c; }
236
+ .eg-doc-frame[data-eg-active="1"] { display:block; }
237
+ body.eg-doc-open { overflow:hidden; }
238
+ `;
239
+
240
+ function escAttr(value) {
241
+ return String(value)
242
+ .replace(/&/g, '&amp;')
243
+ .replace(/"/g, '&quot;')
244
+ .replace(/</g, '&lt;')
245
+ .replace(/>/g, '&gt;');
246
+ }
247
+
248
+ function assertNoBrowserDocLeaks(label, html) {
249
+ const checks = [
250
+ [/\/emissary\/e\/[0-9a-fA-F-]+/i, 'child emissary URL'],
251
+ [/\/raw\b/i, 'raw URL'],
252
+ [/Run this Egregore/i, 'launch prompt'],
253
+ [/\beg-receiver\b/i, 'receiver chrome'],
254
+ [/Copy launch prompt/i, 'launch button'],
255
+ ];
256
+ for (const [rx, what] of checks) {
257
+ if (rx.test(html)) {
258
+ console.error(`FAIL: ${label} browser render contains ${what}`);
259
+ process.exit(2);
260
+ }
261
+ }
262
+ }
263
+
264
+ function buildBrowserDocsHtml(renders) {
265
+ const frames = Object.entries(BROWSER_DOCS).map(([id, doc]) => {
266
+ const srcdoc = renders[id];
267
+ if (!srcdoc) throw new Error(`missing browser render: ${id}`);
268
+ return `<iframe class="eg-doc-frame" data-eg-doc-panel="${id}" title="${escAttr(doc.title)}" sandbox="allow-scripts" srcdoc="${escAttr(srcdoc)}"></iframe>`;
269
+ }).join('\n ');
270
+ return `
271
+ <div class="eg-doc-modal" data-eg-browser-docs="1" aria-hidden="true" role="dialog" aria-modal="true" aria-labelledby="eg-doc-modal-title">
272
+ <div class="eg-doc-modal-head">
273
+ <div class="eg-doc-modal-kicker">Sealed in-room document</div>
274
+ <div class="eg-doc-modal-title" id="eg-doc-modal-title">Document</div>
275
+ <button type="button" class="eg-doc-modal-close" data-eg-doc-close aria-label="Close document">×</button>
276
+ </div>
277
+ <div class="eg-doc-modal-body">
278
+ ${frames}
279
+ </div>
280
+ </div>
281
+ <script data-eg-browser-docs-script="1">
282
+ (function(){
283
+ var modal = document.querySelector('[data-eg-browser-docs]');
284
+ if (!modal) return;
285
+ var title = document.getElementById('eg-doc-modal-title');
286
+ var labels = ${JSON.stringify(Object.fromEntries(Object.entries(BROWSER_DOCS).map(([id, doc]) => [id, doc.title])))};
287
+ function openDoc(id) {
288
+ var frame = modal.querySelector('[data-eg-doc-panel="' + id + '"]');
289
+ if (!frame) return;
290
+ modal.querySelectorAll('[data-eg-doc-panel]').forEach(function(el){ el.setAttribute('data-eg-active', el === frame ? '1' : '0'); });
291
+ if (title) title.textContent = labels[id] || 'Document';
292
+ modal.setAttribute('aria-hidden', 'false');
293
+ document.body.classList.add('eg-doc-open');
294
+ }
295
+ function closeDoc() {
296
+ modal.setAttribute('aria-hidden', 'true');
297
+ document.body.classList.remove('eg-doc-open');
298
+ modal.querySelectorAll('[data-eg-doc-panel]').forEach(function(el){ el.setAttribute('data-eg-active', '0'); });
299
+ }
300
+ document.querySelectorAll('[data-eg-doc-open]').forEach(function(link){
301
+ link.addEventListener('click', function(ev){
302
+ ev.preventDefault();
303
+ openDoc(link.getAttribute('data-eg-doc-open'));
304
+ });
305
+ });
306
+ modal.addEventListener('click', function(ev){ if (ev.target === modal) closeDoc(); });
307
+ var close = modal.querySelector('[data-eg-doc-close]');
308
+ if (close) close.addEventListener('click', closeDoc);
309
+ document.addEventListener('keydown', function(ev){ if (ev.key === 'Escape' && modal.getAttribute('aria-hidden') === 'false') closeDoc(); });
310
+ })();
311
+ </script>`;
312
+ }
313
+
314
+ function injectBeforeClose(html, tag, fragment) {
315
+ const rx = new RegExp(`</${tag}\\s*>`, 'i');
316
+ return rx.test(html) ? html.replace(rx, `${fragment}\n</${tag}>`) : `${html}\n${fragment}`;
317
+ }
318
+
319
+ function enhanceRoomForAgentFlow(html) {
320
+ let out = String(html);
321
+ // Replace the room's original CTA with variant A AND drop the trailing
322
+ // "packet source" mechanism block — variant A already says how to open the
323
+ // room, so the <details class="mech"> panel is redundant noise.
324
+ out = out.replace(
325
+ /<section class="action">[\s\S]*?<\/section>\s*<details class="mech">[\s\S]*?<\/details>/,
326
+ AGENT_FLOW_HTML,
327
+ );
328
+ out = out
329
+ .replace(
330
+ '# the Egregore Labs data room — packet\n# derived from this page; full at /raw',
331
+ '# the Egregore Labs data room — emissary\n# open with this page link',
332
+ )
333
+ .replace(
334
+ '// self-resolving CTA — the page learns its own /raw at runtime',
335
+ '// self-resolving legacy CTA — copies the page link when present',
336
+ )
337
+ .replace(
338
+ "const prompt = 'Run this Egregore packet for me: ' + base + '/raw';",
339
+ 'const prompt = base;',
340
+ )
341
+ .replace(
342
+ "if (s) s.textContent = base + '/raw';",
343
+ 'if (s) s.textContent = base;',
344
+ );
345
+ out = out.replace(
346
+ /npx(?: -y)? egregore-emissary@latest install(?: --require-email)?/g,
347
+ INSTALL_COMMAND,
348
+ );
349
+ if (!out.includes('data-eg-agent-path="1"')) return out;
350
+ if (!out.includes('.agent-path')) out = injectBeforeClose(out, 'style', AGENT_FLOW_CSS);
351
+ if (!out.includes('data-eg-agent-flow-script="1"')) {
352
+ out = injectBeforeClose(out, 'body', AGENT_FLOW_SCRIPT);
353
+ }
354
+ return out;
355
+ }
356
+
357
+ function enhanceRoomForBrowserDocs(html, renders) {
358
+ let out = String(html);
359
+ out = out.replace(/<link\b(?=[^>]*\brel=["']alternate["'])(?=[^>]*\/raw\b)[^>]*>/gi, '');
360
+ for (const [id, doc] of Object.entries(BROWSER_DOCS)) {
361
+ const url = `https://egregore.xyz/emissary/e/${doc.sourceId}`;
362
+ out = out.replace(
363
+ `href="${url}" target="_blank"`,
364
+ `href="#${id}" data-eg-doc-open="${id}" aria-haspopup="dialog"`,
365
+ );
366
+ }
367
+ out = out.replace(/<span class="gstatus live">live ↗<\/span>/g, '<span class="gstatus live">sealed · open</span>');
368
+ if (!out.includes('data-eg-browser-docs="1"')) {
369
+ out = injectBeforeClose(out, 'style', BROWSER_DOCS_CSS);
370
+ out = injectBeforeClose(out, 'body', buildBrowserDocsHtml(renders));
371
+ }
372
+ return out;
373
+ }
374
+
375
+ function enhanceRoom(html, renders) {
376
+ return enhanceRoomForBrowserDocs(enhanceRoomForAgentFlow(html), renders);
377
+ }
378
+
379
+ // ── seal: bytes|string -> {s,i,c} base64 (c = ciphertext||tag) ───────────
380
+ function seal(plaintext, password) {
381
+ const salt = crypto.randomBytes(16);
382
+ const iv = crypto.randomBytes(12);
383
+ const key = crypto.pbkdf2Sync(password, salt, ITER, 32, 'sha256');
384
+ const cipher = crypto.createCipheriv('aes-256-gcm', key, iv);
385
+ const buf = Buffer.isBuffer(plaintext) ? plaintext : Buffer.from(plaintext, 'utf8');
386
+ const ct = Buffer.concat([cipher.update(buf), cipher.final()]);
387
+ const tag = cipher.getAuthTag(); // 16 bytes
388
+ return {
389
+ s: salt.toString('base64'),
390
+ i: iv.toString('base64'),
391
+ c: Buffer.concat([ct, tag]).toString('base64'),
392
+ };
393
+ }
394
+
395
+ // ── self-test: decrypt to raw bytes via WebCrypto exactly like the browser
396
+ // will, before it gunzips. Returns the gzipped room bytes; the caller
397
+ // gunzips and compares to the original room HTML.
398
+ async function unsealBytesWebCrypto(P, password) {
399
+ const b64 = (s) => Uint8Array.from(Buffer.from(s, 'base64'));
400
+ const km = await webcrypto.subtle.importKey(
401
+ 'raw', new TextEncoder().encode(password), 'PBKDF2', false, ['deriveBits']);
402
+ const bits = await webcrypto.subtle.deriveBits(
403
+ { name: 'PBKDF2', salt: b64(P.s), iterations: ITER, hash: 'SHA-256' }, km, 256);
404
+ const key = await webcrypto.subtle.importKey('raw', bits, 'AES-GCM', false, ['decrypt']);
405
+ const pt = await webcrypto.subtle.decrypt({ name: 'AES-GCM', iv: b64(P.i) }, key, b64(P.c));
406
+ return Buffer.from(new Uint8Array(pt));
407
+ }
408
+
409
+ // ── self-test: decrypt to raw bytes exactly like the embedded agent helper.
410
+ // Mirrors DECRYPT_HELPER below — the build verifies the same math the
411
+ // agent will run before it ships the blob.
412
+ function unsealBytesNode(P, password) {
413
+ const b = (x) => Buffer.from(x, 'base64');
414
+ const key = crypto.pbkdf2Sync(password, b(P.s), ITER, 32, 'sha256');
415
+ const data = b(P.c);
416
+ const ct = data.subarray(0, data.length - 16);
417
+ const tag = data.subarray(data.length - 16);
418
+ const d = crypto.createDecipheriv('aes-256-gcm', key, b(P.i));
419
+ d.setAuthTag(tag);
420
+ return Buffer.concat([d.update(ct), d.final()]);
421
+ }
422
+
423
+ // ── the deterministic decrypt helper the agent runs VERBATIM ─────────────
424
+ // node decrypt-corpus.mjs <password> (sealed {s,i,c} JSON on stdin →
425
+ // decrypted corpus JSON on stdout). Same PBKDF2/AES-GCM/gzip as the build.
426
+ const DECRYPT_HELPER = `import { pbkdf2Sync, createDecipheriv } from 'node:crypto';
427
+ import { gunzipSync } from 'node:zlib';
428
+ const pw = process.argv[2];
429
+ if (!pw) { process.stderr.write('usage: node decrypt-corpus.mjs <password> (sealed JSON on stdin)\\n'); process.exit(2); }
430
+ const { s, i, c } = JSON.parse(await new Response(process.stdin).text());
431
+ const b = (x) => Buffer.from(x, 'base64');
432
+ const key = pbkdf2Sync(pw, b(s), 250000, 32, 'sha256');
433
+ const data = b(c), ct = data.subarray(0, data.length - 16), tag = data.subarray(data.length - 16);
434
+ const d = createDecipheriv('aes-256-gcm', key, b(i)); d.setAuthTag(tag);
435
+ process.stdout.write(gunzipSync(Buffer.concat([d.update(ct), d.final()])).toString('utf8'));`;
436
+
437
+ // ── the SEALED agent action (password-gated, ciphertext only) ────────────
438
+ // Built at the bottom from the encrypted corpus blob. The action embeds the
439
+ // ciphertext and the decrypt helper; it names NO document URLs and carries NO
440
+ // plaintext corpus. The agent asks for the password and decrypts locally.
441
+ function buildAction(corpusSeal) {
442
+ const SEALED = JSON.stringify(corpusSeal); // {s,i,c}
443
+ return `Purpose: help the investor work through the Egregore Labs data room as one corpus. The corpus is SEALED — it is included below as ciphertext only. You decrypt it locally with the room password. Never fetch it from anywhere; everything you need is in this spec, and there are no document URLs.
444
+
445
+ HOW TO ASK QUESTIONS (important): every time this flow asks the investor to CHOOSE between options — the work-through menu, which document to browse, and each document's own intake — you MUST present it through the harness's interactive multiple-choice question UI: the AskUserQuestion tool in Claude Code, the question chips in the web app. Never render a choice as a plain numbered list or as free text when that UI is available — a numbered list is only a fallback for harnesses that have no interactive question UI at all. Ask one question at a time and wait for the answer. If a question has more than four options (the paper's and evals' FOCUS), ask it in two short AskUserQuestion rounds rather than a wall of text. The single exception is the room password, which is free-text input — just prompt for it.
446
+
447
+ 1. Your first step is to ask the investor for the room password the sender gave them (free-text input — not a multiple choice). Ask nothing else yet — the password comes before the menu.
448
+
449
+ 2. Decrypt the corpus locally with that password. This needs a code-capable harness (Claude Code, Codex, or a local runtime). If you CANNOT run code, stop and tell the investor exactly this:
450
+ "This room is sealed. Your current harness cannot run the local decrypt helper. Open the room link in a browser, enter your email and password there, or use Claude Code/Codex with the receiver skill installed."
451
+ Otherwise: write the helper below to a temp file (e.g. decrypt-corpus.mjs), pipe the SEALED CORPUS JSON to it on stdin with the password as the first argument, and read the decrypted corpus JSON from stdout. Keep the decrypted corpus IN-SESSION ONLY — do not write it to disk unless a chosen path produces an artifact (e.g. the IC memo or an on-demand figure). If decryption fails, the password is wrong: say the seal held and ask for the correct password. Do not guess.
452
+
453
+ --- decrypt helper (node — run verbatim) ---
454
+ ${DECRYPT_HELPER}
455
+ --- end helper ---
456
+
457
+ --- sealed corpus (ciphertext {s,i,c}: AES-256-GCM over gzipped JSON) ---
458
+ ${SEALED}
459
+ --- end sealed corpus ---
460
+
461
+ 3. The decrypted corpus is a JSON object { deck, contentBase, paper, evals }. Each value is a full document artifact that carries its OWN runnable flow in body.executable_spec — its intake questions and its action — with the document's content embedded verbatim. Treat them as one relational corpus: the deck's claims are grounded by the content base, the paper's architecture, and the evals' numbers. (Traction · Articles of Association are available on request via the Egregore Labs team — not included here. The content base is the deck's founder answer base — back-end grounding for the deck, NOT a separate document to offer.)
462
+
463
+ 4. Only now, after the corpus is decrypted, ask the investor how they want to work through the room — as a single AskUserQuestion (question chips) with exactly these four options, never a numbered list:
464
+ · Browse a specific document — the deck, the technical paper, or the evals
465
+ · Navigate the diligence — ask across the whole room
466
+ · Assess fit to my thesis, or draft an investment memo
467
+ · Book a follow-up call with the team
468
+
469
+ 5. Run the selected path against the decrypted corpus:
470
+
471
+ - Browse a specific document: ask which one — as an AskUserQuestion with three options: the deck, the technical paper, or the evals (never the content base; it is the deck's grounding, not a document to browse). Then RUN that document's own flow exactly as it runs on its own, using its artifact in the corpus and the content it carries:
472
+ · The deck (corpus.deck): present the Egregore Labs seed deck, grounded STRICTLY in the deck's answer base (the content base it carries). First ask its intake as an AskUserQuestion — how they want to go through it: "Walk me through it slide by slide" or "I will ask about specific topics". On a walk-through, take the slides in order: Cognitive Entropy → an organization is the sum of its interactions → The Stack → Emissaries → Tiers of Depth → Organizational Continual Learning → The Team → the Ask. Operating rules: canonical numbers ($4M SAFE / ~10% / 24 months); cite a number with its source and nothing more; never volunteer a negative unprompted; THE DEFENSE RULE — if an answer is not in the base, do not invent, infer, or oversell — say you will follow up. Deep architecture questions defer to the technical paper; evaluation numbers/method defer to the evals — offer to take them there.
473
+ · The technical paper (corpus.paper): be a reading partner for "An Organizational Continual Learning Runtime for Human–AI Teams". First ask its intake as AskUserQuestion — LENS (Investor / Technical reviewer / Skeptic), then FOCUS (the runtime architecture · emissaries & handoffs · the initial evaluation · the OCL thesis · governance · walk the whole paper) — and since FOCUS has more than four options, ask it across two short AskUserQuestion rounds rather than a list. Adopt their lens and start where their focus says. Answer any section at their depth, STRICTLY from the paper; if a question runs past it, say you will follow up. VISUALIZE ON DEMAND: when asked to show the stack, diagram the loop, chart the evaluation, draw how an emissary folds into Egregore, or map the five capacities, generate a clean self-contained SVG/HTML figure in the paper's gold-on-paper style (cream #f5f2ea, gold #9c6c1e, Georgia serif), write it to ./<slug>.html and open it. Honesty: the evaluation (0.37 → 0.43 → 0.97) is an initial controlled study; adaptation today is runtime-level, model-level is future — don't overclaim.
474
+ · The evals (corpus.evals): be a partner for the evaluation report "Measuring Agentic Continuity". First ask its intake as AskUserQuestion — LENS (Investor / Technical reviewer / Skeptic), then FOCUS (the result in 90 seconds · the conditions & hiddenness gradient · how it was scored · the results in detail · the self-audit · scope & limitations) — and since FOCUS has more than four options, ask it across two short AskUserQuestion rounds rather than a list. If they want the result in 90 seconds: the question (when work passes between agents, what must travel — structure or shared context?), the two metrics (completeness vs fidelity), and the headline (overall fidelity 0.365 → 0.431 → 0.968 across R1 → R2 → R3; the R2→R3 gain scales with hiddenness: /recap +0.718, /broadcast +0.520, /capture +0.373). Answer STRICTLY from the report and anchor claims to its numbers; never invent. State scope/limitations honestly if asked, but don't over-lead with caveats unprompted. VISUALIZE ON DEMAND: chart fidelity by condition, the R2→R3 jump, completeness, etc., in the report's style (cream #f5f2ea, gold #9c6c1e, gray bars), write to ./<slug>.html and open it.
475
+ After a document, offer to return to the room or move to another document.
476
+
477
+ - Navigate the diligence: index the room, summarize any document, answer questions strictly from the corpus, cross-referencing where the documents reinforce each other.
478
+
479
+ - Assess fit / draft a memo: ask which — as an AskUserQuestion: assess fit, or draft a memo.
480
+ · Assess fit: ask 2–3 questions about thesis / stage / check size, then give an honest read and surface the most relevant documents. "Not a fit" is a fine conclusion.
481
+ · Draft an investment memo: synthesize into ./egregore-labs-ic-memo.md — thesis, what is built vs roadmap, evidence, team, the ask ($4M SAFE / ~10% / 24 months), risks, recommendation.
482
+
483
+ - Book a follow-up call with the team: share https://calendly.com/cem-egregore/30min and offer to help them pick a time.
484
+
485
+ 6. A follow-up call is always available. If the investor asks to talk to the team, book a call, or speak to a human at any point, share https://calendly.com/cem-egregore/30min and help them pick a time.
486
+
487
+ 7. Evidence discipline: if an answer is not in the corpus, say so and offer a follow-up. Canonical numbers: $4M / ~10% / 24 months. Honest over impressive.
488
+
489
+ 8. End by pointing the investor to the single document they should open next.`;
490
+ }
491
+
492
+ // ── the human gate page (render_html) ────────────────────────────────────
493
+ function gatePage(R) {
494
+ const P = JSON.stringify(R);
495
+ return `<!DOCTYPE html>
496
+ <html lang="en">
497
+ <head>
498
+ <meta charset="utf-8">
499
+ <meta name="viewport" content="width=device-width, initial-scale=1">
500
+ <meta property="og:type" content="article" />
501
+ <meta property="og:site_name" content="Egregore Labs" />
502
+ <meta property="og:title" content="Egregore Labs — Investor Data Room" />
503
+ <meta property="og:description" content="Deck, technical paper, and evals as one corpus. Sealed — password required." />
504
+ <meta name="twitter:card" content="summary" />
505
+ <meta name="twitter:title" content="Egregore Labs — Investor Data Room" />
506
+ <meta name="twitter:description" content="Deck, technical paper, and evals as one corpus. Sealed — password required." />
507
+ <meta name="robots" content="noindex">
508
+ <title>Egregore Labs — Sealed Data Room</title>
509
+ <style>
510
+ :root {
511
+ --cream: #1D1611; --black: rgba(255,255,255,0.92); --dark: rgba(255,255,255,0.75);
512
+ --border: rgba(255,255,255,0.08); --muted: rgba(255,255,255,0.50);
513
+ --warm-gray: rgba(255,255,255,0.30); --terracotta: #D4875A; --card-bg: #241E19;
514
+ --font-serif: "Iowan Old Style", "Palatino Linotype", Palatino, Georgia, serif;
515
+ --font-mono: "SF Mono", ui-monospace, "JetBrains Mono", Menlo, monospace;
516
+ }
517
+ * { box-sizing: border-box; margin: 0; }
518
+ ::selection { background: var(--terracotta); color: #1D1611; }
519
+ body { background: var(--cream); color: var(--dark); font-family: var(--font-serif);
520
+ min-height: 100vh; display: flex; align-items: center; justify-content: center; padding: 2rem; }
521
+ .gate { max-width: 440px; width: 100%; text-align: center; }
522
+ .seal-mark { font-size: 40px; color: var(--terracotta); margin-bottom: 1.4rem; letter-spacing: 0.1em; }
523
+ .kicker { font-family: var(--font-mono); font-size: 10.5px; letter-spacing: 0.24em; text-transform: uppercase; color: var(--terracotta); margin-bottom: 0.9rem; }
524
+ h1 { font-size: 26px; font-weight: 500; color: var(--black); margin-bottom: 0.7rem; }
525
+ .sub { font-size: 14.5px; font-style: italic; color: var(--muted); margin-bottom: 2rem; line-height: 1.6; }
526
+ .emailrow { margin-bottom: 0.7rem; }
527
+ .pwrow { display: flex; gap: 0.6rem; }
528
+ input { flex: 1; width: 100%; background: var(--card-bg); border: 1px solid var(--border); border-radius: 50px;
529
+ color: var(--black); font-family: var(--font-mono); font-size: 14px; padding: 11px 18px;
530
+ text-align: center; letter-spacing: 0.12em; outline: none; transition: border-color 0.2s; }
531
+ input:focus { border-color: var(--terracotta); }
532
+ button { background: var(--terracotta); color: #1D1611; border: none; border-radius: 50px;
533
+ font-family: var(--font-mono); font-size: 12.5px; font-weight: 600; letter-spacing: 0.04em;
534
+ padding: 11px 22px; cursor: pointer; white-space: nowrap; }
535
+ button:hover { opacity: 0.9; }
536
+ button:disabled { opacity: 0.45; cursor: wait; }
537
+ .msg { font-family: var(--font-mono); font-size: 11px; color: var(--muted); margin-top: 1.1rem; min-height: 1.2em; }
538
+ .msg.err { color: var(--terracotta); }
539
+ .foot { margin-top: 3rem; font-family: var(--font-mono); font-size: 10px; color: var(--warm-gray); line-height: 1.8; }
540
+ .shake { animation: shake 0.35s; }
541
+ @keyframes shake { 0%,100%{transform:translateX(0)} 25%{transform:translateX(-7px)} 75%{transform:translateX(7px)} }
542
+ </style>
543
+ </head>
544
+ <body data-eg-wrapper="sealed-dataroom">
545
+ <div class="gate" id="gate">
546
+ <div class="seal-mark">⬡</div>
547
+ <div class="kicker">Egregore Labs · Investor Data Room</div>
548
+ <h1>This data room travels under seal</h1>
549
+ <p class="sub">Egregore Labs — deck, technical paper, and evals, as one corpus.<br>The contents are encrypted; enter your email and the password to break the seal.</p>
550
+ <div class="emailrow">
551
+ <input type="email" id="em" placeholder="your email" autocomplete="email" autofocus>
552
+ </div>
553
+ <div class="pwrow">
554
+ <input type="password" id="pw" placeholder="password" autocomplete="off">
555
+ <button id="go" onclick="unseal()">Unseal</button>
556
+ </div>
557
+ <p class="msg" id="msg"></p>
558
+ <p class="foot">AES-256-GCM · the password never leaves your browser and decrypts the room locally<br>your email is recorded so the Egregore Labs team knows who's reviewing · egregore labs · 2026</p>
559
+ </div>
560
+ <script>
561
+ var R = ${P};
562
+ var API = ${JSON.stringify(API_BASE)};
563
+ var EID = (location.pathname.match(/emissary\\/e\\/([0-9a-fA-F-]+)/) || [])[1] || '';
564
+ function b64(s){ var b = atob(s), a = new Uint8Array(b.length); for (var i=0;i<b.length;i++) a[i]=b.charCodeAt(i); return a; }
565
+ function track(email, ok){
566
+ try {
567
+ fetch(API + '/api/v1/emissary/gate-visit', {
568
+ method:'POST', headers:{'Content-Type':'application/json'}, keepalive:true,
569
+ body: JSON.stringify({ emissary_id: EID, email: email, face: 'human', password_correct: ok })
570
+ }).catch(function(){});
571
+ } catch(e) {}
572
+ }
573
+ async function unseal(){
574
+ var email = document.getElementById('em').value.trim();
575
+ var pw = document.getElementById('pw').value;
576
+ var msg = document.getElementById('msg'), btn = document.getElementById('go');
577
+ if (!email) { msg.className='msg err'; msg.textContent='enter your email to continue'; return; }
578
+ if (!pw) { msg.className='msg err'; msg.textContent='enter the password'; return; }
579
+ if (typeof DecompressionStream === 'undefined') {
580
+ msg.className='msg err';
581
+ msg.textContent='this browser is too old to open the sealed room — use a current Chrome, Firefox 113+, or Safari 16.4+';
582
+ return;
583
+ }
584
+ btn.disabled = true; msg.className='msg'; msg.textContent='deriving key…';
585
+ try {
586
+ var km = await crypto.subtle.importKey('raw', new TextEncoder().encode(pw), 'PBKDF2', false, ['deriveBits']);
587
+ var bits = await crypto.subtle.deriveBits({name:'PBKDF2', salt:b64(R.s), iterations:250000, hash:'SHA-256'}, km, 256);
588
+ var key = await crypto.subtle.importKey('raw', bits, 'AES-GCM', false, ['decrypt']);
589
+ var pt = await crypto.subtle.decrypt({name:'AES-GCM', iv:b64(R.i)}, key, b64(R.c));
590
+ var ds = new DecompressionStream('gzip');
591
+ var html = await new Response(new Blob([pt]).stream().pipeThrough(ds)).text();
592
+ track(email, true);
593
+ document.open(); document.write(html); document.close();
594
+ } catch(e) {
595
+ track(email, false);
596
+ btn.disabled = false;
597
+ msg.className = 'msg err'; msg.textContent = 'the seal holds — wrong password';
598
+ var g = document.getElementById('gate'); g.classList.remove('shake'); void g.offsetWidth; g.classList.add('shake');
599
+ }
600
+ }
601
+ document.getElementById('pw').addEventListener('keydown', function(e){ if (e.key === 'Enter') unseal(); });
602
+ document.getElementById('em').addEventListener('keydown', function(e){ if (e.key === 'Enter') document.getElementById('pw').focus(); });
603
+ </script>
604
+ </body>
605
+ </html>`;
606
+ }
607
+
608
+ // ── build ────────────────────────────────────────────────────────────────
609
+ const browserRenders = {};
610
+ for (const [key, file] of Object.entries(BROWSER_RENDER_FILES)) {
611
+ const html = readFileSync(path.join(RENDER_DIR, file), 'utf8');
612
+ assertNoBrowserDocLeaks(`${key}.html`, html);
613
+ browserRenders[key] = html;
614
+ }
615
+
616
+ const roomHtml = enhanceRoom(readFileSync(roomPath, 'utf8'), browserRenders);
617
+ if (/\/emissary\/e\/[0-9a-fA-F-]+/i.test(roomHtml)) {
618
+ console.error('FAIL: sealed browser room contains a child emissary URL'); process.exit(2);
619
+ }
620
+ if (/\/raw\b/i.test(roomHtml)) {
621
+ console.error('FAIL: sealed browser room contains a raw URL'); process.exit(2);
622
+ }
623
+ if (OUT_ROOM) writeFileSync(OUT_ROOM, roomHtml);
624
+ // gzip-then-encrypt the room (same construction the corpus uses) so render_html
625
+ // stays under the relay's custom-render cap with the deck/paper/evals inlined.
626
+ const roomGz = gzipSync(Buffer.from(roomHtml, 'utf8'));
627
+ const roomSeal = seal(roomGz, PASSWORD);
628
+
629
+ // self-test the human seal before writing anything: decrypt to bytes via
630
+ // WebCrypto (exactly the browser path) then gunzip and compare to the original.
631
+ const roomBack = gunzipSync(await unsealBytesWebCrypto(roomSeal, PASSWORD)).toString('utf8');
632
+ if (roomBack !== roomHtml) { console.error('FAIL: room round-trip mismatch'); process.exit(2); }
633
+ let wrongFailed = false;
634
+ try { await unsealBytesWebCrypto(roomSeal, PASSWORD + 'x'); } catch { wrongFailed = true; }
635
+ if (!wrongFailed) { console.error('FAIL: wrong password decrypted'); process.exit(2); }
636
+
637
+ // ── corpus: read local files, assemble, gzip, seal (agent face) ──────────
638
+ const corpus = {};
639
+ for (const [key, file] of Object.entries(CORPUS_FILES)) {
640
+ const raw = readFileSync(path.join(CORPUS_DIR, file), 'utf8');
641
+ corpus[key] = JSON.parse(raw); // throws on malformed → build fails loud
642
+ }
643
+ const corpusJson = JSON.stringify(corpus);
644
+ const corpusGz = gzipSync(Buffer.from(corpusJson, 'utf8'));
645
+ const corpusSeal = seal(corpusGz, PASSWORD);
646
+
647
+ // self-test the corpus seal with the SAME math the agent helper runs:
648
+ // round-trips to the exact JSON, and the wrong password fails the GCM tag.
649
+ const corpusBack = gunzipSync(unsealBytesNode(corpusSeal, PASSWORD)).toString('utf8');
650
+ if (corpusBack !== corpusJson) { console.error('FAIL: corpus round-trip mismatch'); process.exit(2); }
651
+ let corpusWrongFailed = false;
652
+ try { unsealBytesNode(corpusSeal, PASSWORD + 'x'); } catch { corpusWrongFailed = true; }
653
+ if (!corpusWrongFailed) { console.error('FAIL: corpus decrypted with wrong password'); process.exit(2); }
654
+
655
+ const agentAction = buildAction(corpusSeal);
656
+ // Invariant guard — fail the build if the agent face leaks plaintext or a
657
+ // child /raw URL. The corpus must travel as ciphertext only.
658
+ if (/\/emissary\/e\/[0-9a-fA-F-]+\/raw/.test(agentAction)) {
659
+ console.error('FAIL: agent action contains a child /raw URL'); process.exit(2);
660
+ }
661
+
662
+ const gateHtml = gatePage(roomSeal);
663
+ const answers = {
664
+ kind: 'executable',
665
+ topic: 'Egregore Labs — investor data room',
666
+ claim: 'Work through the Egregore Labs data room — the deck, technical paper, and evals as one corpus — by browsing any document with its own guided walkthrough, navigating the diligence, assessing fit, drafting an investment memo, or booking a call with the team.',
667
+ ask: 'How do you want to work through the room — browse a document, navigate, assess fit, draft a memo, or book a call?',
668
+ summary: 'Renç sent you the Egregore Labs investor data room as a sealed emissary. Open it in your browser under seal, or paste the room link into Claude Code after installing the receiver skill; it will ask how you want to work through the corpus and for the room password, then decrypt it locally — the documents never travel in the clear.',
669
+ prose: 'This room gathers the deck, the technical paper on the runtime, and the evals that quantify its impact as one relational corpus. Read it in your browser, or paste the room link into Claude Code and have your agent work through it with you. Against atomised acceleration, towards systems of collective growth.',
670
+ archetype: 'default',
671
+ role_topology: {
672
+ runner_role: 'receiver',
673
+ respondent_role: 'runner',
674
+ subject_role: 'runner',
675
+ beneficiary_role: 'runner',
676
+ author_run_mode: 'run_normally',
677
+ },
678
+ distribution: 'public',
679
+ executable_spec: {
680
+ intake: [
681
+ {
682
+ id: 'room_password',
683
+ type: 'text',
684
+ prompt: 'Enter the data-room password',
685
+ required: true,
686
+ },
687
+ ],
688
+ action: agentAction,
689
+ output: { target: 'receiver_artifact' },
690
+ success_criteria: [
691
+ 'the room password is the FIRST thing asked, before any menu; the corpus is decrypted locally from the embedded ciphertext using it — never fetched, and no document URLs are used',
692
+ 'after decrypting, the agent asks how the investor wants to work through the room, using interactive choices when the harness supports them',
693
+ 'the work-through options include browsing a specific document (deck, paper, or evals) and booking a follow-up call with the team',
694
+ 'browsing a document runs that document\'s own flow — the deck as the founder; the paper and evals with their lens+focus intake and visualize-on-demand — grounded strictly in the in-session corpus',
695
+ 'the content base is treated as the deck\'s grounding, never offered as a separate document to browse',
696
+ 'whenever the investor asks to talk to the team, the agent shares https://calendly.com/cem-egregore/30min',
697
+ 'answers name corpus gaps instead of fabricating missing facts',
698
+ ],
699
+ },
700
+ // A sealed gate is a `wrapper`-scope custom render: the canonical
701
+ // dual-faced object is sealed behind the password, so the outer page has
702
+ // no faces/CTA. The data-eg-wrapper marker on the gate authorizes the
703
+ // create lint to relax the shell-marker block (see interview.js); without
704
+ // this declaration the lint defaults to strict `surface` and rejects it.
705
+ render_scope: 'wrapper',
706
+ render_mode: 'custom',
707
+ render_html: gateHtml,
708
+ };
709
+
710
+ writeFileSync(OUT_GATE, gateHtml);
711
+ writeFileSync(OUT_ANSWERS, JSON.stringify(answers, null, 2));
712
+
713
+ console.log('✓ seal self-tests passed (room + corpus round-trip; wrong password rejected)');
714
+ console.log(' human face : SEALED — internal deck/paper/evals renders, no child links');
715
+ console.log(' agent face : SEALED — password intake + embedded decrypt helper, ciphertext only');
716
+ console.log(' invariant : no child /raw URLs, no plaintext corpus in the action');
717
+ console.log(' gate-visit API:', API_BASE + '/api/v1/emissary/gate-visit');
718
+ console.log(' password :', PASSWORD);
719
+ console.log(' room blob :', roomSeal.c.length, 'b64 chars');
720
+ console.log(' corpus blob :', corpusSeal.c.length, 'b64 chars (gzip of', corpusJson.length, 'B JSON)');
721
+ console.log(' gate page :', OUT_GATE, '(' + gateHtml.length + ' bytes)');
722
+ console.log(' answers json :', OUT_ANSWERS);