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.
- package/assets/egregore-launcher.js +1013 -16
- package/bin/cli.js +11 -0
- package/lib/claude-runtime.js +192 -0
- package/lib/local.js +38 -31
- package/lib/pi-runtime.js +1 -0
- package/lib/prime-runtime.js +1 -0
- package/lib/runtime-identity.js +146 -0
- package/lib/setup.js +116 -17
- package/package.json +10 -6
- package/runtime/claude/.claude/context/commit-format.md +110 -0
- package/runtime/claude/.claude/context/git-language.md +46 -0
- package/runtime/claude/.claude/context/notification-consent.md +66 -0
- package/runtime/claude/.claude/context/pr-format.md +67 -0
- package/runtime/claude/.claude/context/telemetry.md +133 -0
- package/runtime/claude/.claude/hooks/boundary-check.sh +333 -0
- package/runtime/claude/.claude/hooks/branch-guard.sh +231 -0
- package/runtime/claude/.claude/hooks/card-context.sh +38 -0
- package/runtime/claude/.claude/hooks/emissary-detect.sh +53 -0
- package/runtime/claude/.claude/hooks/memory-refresh.sh +67 -0
- package/runtime/claude/.claude/hooks/onboarding-guard.sh +86 -0
- package/runtime/claude/.claude/hooks/retrieval-context.sh +43 -0
- package/runtime/claude/.claude/rules/voice-bedrock.md +73 -0
- package/runtime/claude/.claude/settings.json +131 -0
- package/runtime/claude/.claude/skills/activity/SKILL.md +68 -0
- package/runtime/claude/.claude/skills/announce/SKILL.md +54 -0
- package/runtime/claude/.claude/skills/archive/SKILL.md +71 -0
- package/runtime/claude/.claude/skills/branch/SKILL.md +147 -0
- package/runtime/claude/.claude/skills/checkup/SKILL.md +159 -0
- package/runtime/claude/.claude/skills/commit/SKILL.md +103 -0
- package/runtime/claude/.claude/skills/contribute/SKILL.md +343 -0
- package/runtime/claude/.claude/skills/create-skill/SKILL.md +135 -0
- package/runtime/claude/.claude/skills/dark-mode/SKILL.md +410 -0
- package/runtime/claude/.claude/skills/dashboard/SKILL.md +43 -0
- package/runtime/claude/.claude/skills/deep-reflect/REPORT.md +140 -0
- package/runtime/claude/.claude/skills/deep-reflect/RESEARCH.md +132 -0
- package/runtime/claude/.claude/skills/deep-reflect/ROLES.md +104 -0
- package/runtime/claude/.claude/skills/deep-reflect/SKILL.md +170 -0
- package/runtime/claude/.claude/skills/delete-user/SKILL.md +150 -0
- package/runtime/claude/.claude/skills/emissary/SKILL.md +220 -0
- package/runtime/claude/.claude/skills/handoff/SKILL.md +124 -0
- package/runtime/claude/.claude/skills/harvest/AUDIT.md +546 -0
- package/runtime/claude/.claude/skills/harvest/FORMAT.md +436 -0
- package/runtime/claude/.claude/skills/harvest/PROCESS.md +395 -0
- package/runtime/claude/.claude/skills/harvest/QUESTION_PALETTE.md +76 -0
- package/runtime/claude/.claude/skills/harvest/SKILL.md +100 -0
- package/runtime/claude/.claude/skills/ingest/SKILL.md +112 -0
- package/runtime/claude/.claude/skills/ingest-corpus/SKILL.md +187 -0
- package/runtime/claude/.claude/skills/ingest-notion/SKILL.md +214 -0
- package/runtime/claude/.claude/skills/ingest-user-interview/SKILL.md +65 -0
- package/runtime/claude/.claude/skills/ingest-user-interview/references/analysis-contract.md +125 -0
- package/runtime/claude/.claude/skills/invite/SKILL.md +111 -0
- package/runtime/claude/.claude/skills/issue/SKILL.md +104 -0
- package/runtime/claude/.claude/skills/me/SKILL.md +81 -0
- package/runtime/claude/.claude/skills/meeting/SKILL.md +76 -0
- package/runtime/claude/.claude/skills/meeting/references/analysis-contract.md +102 -0
- package/runtime/claude/.claude/skills/note/SKILL.md +71 -0
- package/runtime/claude/.claude/skills/notion-connect/SKILL.md +124 -0
- package/runtime/claude/.claude/skills/onboarding/SKILL.md +159 -0
- package/runtime/claude/.claude/skills/pr/SKILL.md +85 -0
- package/runtime/claude/.claude/skills/pull/SKILL.md +79 -0
- package/runtime/claude/.claude/skills/push/SKILL.md +47 -0
- package/runtime/claude/.claude/skills/quest/SKILL.md +121 -0
- package/runtime/claude/.claude/skills/reflect/SKILL.md +69 -0
- package/runtime/claude/.claude/skills/review-pr/SKILL.md +276 -0
- package/runtime/claude/.claude/skills/save/SKILL.md +92 -0
- package/runtime/claude/.claude/skills/slack-connect/SKILL.md +148 -0
- package/runtime/claude/.claude/skills/summon/SKILL.md +240 -0
- package/runtime/claude/.claude/skills/sync-repos/SKILL.md +82 -0
- package/runtime/claude/.claude/skills/teams-connect/SKILL.md +216 -0
- package/runtime/claude/.claude/skills/telegram-connect/SKILL.md +110 -0
- package/runtime/claude/.claude/skills/telemetry/SKILL.md +117 -0
- package/runtime/claude/.claude/skills/test/SKILL.md +87 -0
- package/runtime/claude/.claude/skills/the-spiral/SKILL.md +492 -0
- package/runtime/claude/.claude/skills/tui-design/SKILL.md +188 -0
- package/runtime/claude/.claude/skills/tutorial/SKILL.md +100 -0
- package/runtime/claude/.claude/skills/update/SKILL.md +265 -0
- package/runtime/claude/.claude/skills/view/SKILL.md +393 -0
- package/runtime/claude/.claude/skills/view/compose-scaffold.html +221 -0
- package/runtime/claude/.claude/skills/visual-explain/SKILL.md +132 -0
- package/runtime/claude/.claude/skills/wrap/SKILL.md +98 -0
- package/runtime/claude/CLAUDE.md +447 -0
- package/runtime/claude/bin/activity-action.sh +92 -0
- package/runtime/claude/bin/activity-data.sh +17 -0
- package/runtime/claude/bin/agent.sh +783 -0
- package/runtime/claude/bin/artifact-register.sh +164 -0
- package/runtime/claude/bin/artifact-writeback.sh +53 -0
- package/runtime/claude/bin/artifacts.sh +288 -0
- package/runtime/claude/bin/attendant.sh +707 -0
- package/runtime/claude/bin/autosave.sh +112 -0
- package/runtime/claude/bin/boundary.sh +253 -0
- package/runtime/claude/bin/build-sealed-dataroom.mjs +722 -0
- package/runtime/claude/bin/capture-reconcile.sh +69 -0
- package/runtime/claude/bin/capture-run.sh +357 -0
- package/runtime/claude/bin/codex-install-skills.sh +78 -0
- package/runtime/claude/bin/codex-render-spec.mjs +462 -0
- package/runtime/claude/bin/codex-session-start.sh +275 -0
- package/runtime/claude/bin/codex-skill-render.mjs +349 -0
- package/runtime/claude/bin/codex-sync-skills.sh +237 -0
- package/runtime/claude/bin/connect-refresh.sh +33 -0
- package/runtime/claude/bin/contribute-guard.sh +79 -0
- package/runtime/claude/bin/corpus_map.py +806 -0
- package/runtime/claude/bin/corpus_survey.py +304 -0
- package/runtime/claude/bin/dashboard-data.sh +18 -0
- package/runtime/claude/bin/github-auth.sh +121 -0
- package/runtime/claude/bin/graph-batch.sh +86 -0
- package/runtime/claude/bin/graph-op.sh +1106 -0
- package/runtime/claude/bin/graph-projection.sh +54 -0
- package/runtime/claude/bin/graph-wal.sh +242 -0
- package/runtime/claude/bin/graph.sh +267 -0
- package/runtime/claude/bin/handoff-lifecycle-job.sh +146 -0
- package/runtime/claude/bin/handoff-lifecycle.sh +280 -0
- package/runtime/claude/bin/handoff-pr-backfill.sh +86 -0
- package/runtime/claude/bin/handoff-preview.sh +169 -0
- package/runtime/claude/bin/handoff-run.sh +692 -0
- package/runtime/claude/bin/handoff-save-egregore.sh +224 -0
- package/runtime/claude/bin/index-handoff.sh +322 -0
- package/runtime/claude/bin/ingest-graph.sh +86 -0
- package/runtime/claude/bin/ingest-item.sh +10 -0
- package/runtime/claude/bin/ingest-surface.html +495 -0
- package/runtime/claude/bin/ingest.py +1011 -0
- package/runtime/claude/bin/ingest.sh +308 -0
- package/runtime/claude/bin/ingest_graph.py +856 -0
- package/runtime/claude/bin/ingest_surface.py +544 -0
- package/runtime/claude/bin/invite.sh +6 -0
- package/runtime/claude/bin/issue.sh +10 -0
- package/runtime/claude/bin/knowledge.sh +10 -0
- package/runtime/claude/bin/lib/artifact-id.sh +46 -0
- package/runtime/claude/bin/lib/config.sh +136 -0
- package/runtime/claude/bin/lib/context.sh +642 -0
- package/runtime/claude/bin/lib/dashboard-artifact.sh +242 -0
- package/runtime/claude/bin/lib/ensure-develop.sh +183 -0
- package/runtime/claude/bin/lib/git-message.sh +37 -0
- package/runtime/claude/bin/lib/git-sync.sh +494 -0
- package/runtime/claude/bin/lib/greeting.sh +548 -0
- package/runtime/claude/bin/lib/handoff-meta.sh +97 -0
- package/runtime/claude/bin/lib/hash.sh +13 -0
- package/runtime/claude/bin/lib/identity.sh +213 -0
- package/runtime/claude/bin/lib/metrics.sh +374 -0
- package/runtime/claude/bin/lib/noncode.sh +31 -0
- package/runtime/claude/bin/lib/permissions.sh +106 -0
- package/runtime/claude/bin/lib/time.sh +56 -0
- package/runtime/claude/bin/lib/worktree-links.sh +85 -0
- package/runtime/claude/bin/node-run.sh +42 -0
- package/runtime/claude/bin/notification.sh +6 -0
- package/runtime/claude/bin/notify.sh +636 -0
- package/runtime/claude/bin/observe-context.sh +14 -0
- package/runtime/claude/bin/onboarding.sh +6 -0
- package/runtime/claude/bin/person.py +634 -0
- package/runtime/claude/bin/person.sh +481 -0
- package/runtime/claude/bin/pi-render-spec.mjs +140 -0
- package/runtime/claude/bin/post-update.sh +37 -0
- package/runtime/claude/bin/prime-render-spec.mjs +147 -0
- package/runtime/claude/bin/publish-artifact.sh +324 -0
- package/runtime/claude/bin/publish-references.sh +144 -0
- package/runtime/claude/bin/quest.sh +9 -0
- package/runtime/claude/bin/question.sh +8 -0
- package/runtime/claude/bin/repo-state.sh +96 -0
- package/runtime/claude/bin/research-ingest.sh +7 -0
- package/runtime/claude/bin/restore-owned-skills.sh +67 -0
- package/runtime/claude/bin/retrieval_eval.py +385 -0
- package/runtime/claude/bin/runtime-identity.sh +70 -0
- package/runtime/claude/bin/runtime-upgrade.sh +43 -0
- package/runtime/claude/bin/scroll.sh +9 -0
- package/runtime/claude/bin/search.sh +318 -0
- package/runtime/claude/bin/session-autosave.sh +220 -0
- package/runtime/claude/bin/session-log.sh +199 -0
- package/runtime/claude/bin/session-start.sh +696 -0
- package/runtime/claude/bin/settings.sh +532 -0
- package/runtime/claude/bin/startup-check.sh +136 -0
- package/runtime/claude/bin/statusline.sh +41 -0
- package/runtime/claude/bin/telemetry.sh +666 -0
- package/runtime/claude/bin/test-changes.sh +344 -0
- package/runtime/claude/bin/thread.sh +9 -0
- package/runtime/claude/bin/todo.sh +9 -0
- package/runtime/claude/bin/view-render.sh +126 -0
- package/runtime/claude/bin/worktree-create.sh +145 -0
- package/runtime/claude/bin/worktree-remove.sh +50 -0
- package/runtime/claude/bin/worktree.sh +198 -0
- package/runtime/claude/egregore_runtime/__init__.py +228 -0
- package/runtime/claude/egregore_runtime/adapters/__init__.py +5 -0
- package/runtime/claude/egregore_runtime/adapters/invitation.py +237 -0
- package/runtime/claude/egregore_runtime/adapters/notification.py +59 -0
- package/runtime/claude/egregore_runtime/adapters/qmd.py +1701 -0
- package/runtime/claude/egregore_runtime/adapters/qmd_cli.py +210 -0
- package/runtime/claude/egregore_runtime/adapters/qmd_embed_worker.py +59 -0
- package/runtime/claude/egregore_runtime/admin_gate.py +102 -0
- package/runtime/claude/egregore_runtime/artifacts.py +523 -0
- package/runtime/claude/egregore_runtime/contracts.py +499 -0
- package/runtime/claude/egregore_runtime/entitlements.py +85 -0
- package/runtime/claude/egregore_runtime/errors.py +10 -0
- package/runtime/claude/egregore_runtime/graph.py +356 -0
- package/runtime/claude/egregore_runtime/handoff_lookup.py +196 -0
- package/runtime/claude/egregore_runtime/harness_cli.py +1221 -0
- package/runtime/claude/egregore_runtime/identity.py +734 -0
- package/runtime/claude/egregore_runtime/identity_cli.py +91 -0
- package/runtime/claude/egregore_runtime/ingest.py +575 -0
- package/runtime/claude/egregore_runtime/ingest_cli.py +254 -0
- package/runtime/claude/egregore_runtime/ingest_index_cli.py +147 -0
- package/runtime/claude/egregore_runtime/invitation_cli.py +51 -0
- package/runtime/claude/egregore_runtime/invitations.py +116 -0
- package/runtime/claude/egregore_runtime/issue_cli.py +305 -0
- package/runtime/claude/egregore_runtime/issues.py +359 -0
- package/runtime/claude/egregore_runtime/knowledge.py +376 -0
- package/runtime/claude/egregore_runtime/knowledge_cli.py +173 -0
- package/runtime/claude/egregore_runtime/lifecycle.py +888 -0
- package/runtime/claude/egregore_runtime/lifecycle_cli.py +269 -0
- package/runtime/claude/egregore_runtime/notification_cli.py +125 -0
- package/runtime/claude/egregore_runtime/notifications.py +230 -0
- package/runtime/claude/egregore_runtime/observe.py +342 -0
- package/runtime/claude/egregore_runtime/onboarding.py +290 -0
- package/runtime/claude/egregore_runtime/onboarding_cli.py +110 -0
- package/runtime/claude/egregore_runtime/policy.py +144 -0
- package/runtime/claude/egregore_runtime/profile.py +193 -0
- package/runtime/claude/egregore_runtime/quest_cli.py +216 -0
- package/runtime/claude/egregore_runtime/question_cli.py +180 -0
- package/runtime/claude/egregore_runtime/questions.py +304 -0
- package/runtime/claude/egregore_runtime/quests.py +419 -0
- package/runtime/claude/egregore_runtime/readiness.py +379 -0
- package/runtime/claude/egregore_runtime/research_ingest.py +256 -0
- package/runtime/claude/egregore_runtime/research_ingest_cli.py +44 -0
- package/runtime/claude/egregore_runtime/runtime.py +464 -0
- package/runtime/claude/egregore_runtime/scroll_cli.py +185 -0
- package/runtime/claude/egregore_runtime/scrolls.py +726 -0
- package/runtime/claude/egregore_runtime/status.py +412 -0
- package/runtime/claude/egregore_runtime/status_cli.py +174 -0
- package/runtime/claude/egregore_runtime/sync.py +218 -0
- package/runtime/claude/egregore_runtime/teamsync.py +139 -0
- package/runtime/claude/egregore_runtime/telemetry.py +640 -0
- package/runtime/claude/egregore_runtime/thread_cli.py +173 -0
- package/runtime/claude/egregore_runtime/threads.py +517 -0
- package/runtime/claude/egregore_runtime/todo_cli.py +142 -0
- package/runtime/claude/egregore_runtime/todos.py +244 -0
- package/runtime/claude/egregore_runtime/upgrade.py +770 -0
- package/runtime/claude/egregore_runtime/upgrade_worker.py +53 -0
- package/runtime/claude/egregore_runtime/writeback.py +391 -0
- package/runtime/claude/egregore_runtime/writeback_cli.py +114 -0
- package/runtime/claude/manifest.json +284 -0
- package/runtime/codex/.codex/hooks/search-hint.js +21 -52
- package/runtime/codex/.codex/hooks.json +3 -3
- package/runtime/codex/.codex/skills/activity/SKILL.md +23 -66
- package/runtime/codex/.codex/skills/announce/SKILL.md +27 -50
- package/runtime/codex/.codex/skills/archive/SKILL.md +21 -36
- package/runtime/codex/.codex/skills/checkup/SKILL.md +77 -36
- package/runtime/codex/.codex/skills/dark-mode/SKILL.md +1 -1
- package/runtime/codex/.codex/skills/dashboard/SKILL.md +17 -47
- package/runtime/codex/.codex/skills/handoff/SKILL.md +84 -133
- package/runtime/codex/.codex/skills/harvest/SKILL.md +32 -117
- package/runtime/codex/.codex/skills/ingest/SKILL.md +47 -25
- package/runtime/codex/.codex/skills/ingest-user-interview/SKILL.md +18 -36
- package/runtime/codex/.codex/skills/ingest-user-interview/references/analysis-contract.md +42 -0
- package/runtime/codex/.codex/skills/invite/SKILL.md +21 -35
- package/runtime/codex/.codex/skills/issue/SKILL.md +60 -41
- package/runtime/codex/.codex/skills/me/SKILL.md +1 -1
- package/runtime/codex/.codex/skills/meeting/SKILL.md +16 -36
- package/runtime/codex/.codex/skills/meeting/references/analysis-contract.md +48 -0
- package/runtime/codex/.codex/skills/note/SKILL.md +30 -25
- package/runtime/codex/.codex/skills/onboarding/SKILL.md +36 -41
- package/runtime/codex/.codex/skills/pull/SKILL.md +1 -1
- package/runtime/codex/.codex/skills/quest/SKILL.md +27 -66
- package/runtime/codex/.codex/skills/reflect/SKILL.md +22 -36
- package/runtime/codex/.codex/skills/save/SKILL.md +2 -2
- package/runtime/codex/.codex/skills/telemetry/SKILL.md +1 -1
- package/runtime/codex/.codex/skills/test/SKILL.md +1 -1
- package/runtime/codex/.codex/skills/tutorial/SKILL.md +40 -41
- package/runtime/codex/.codex/skills/view/SKILL.md +115 -111
- package/runtime/codex/.codex/skills/wrap/SKILL.md +45 -41
- package/runtime/codex/.codex/spec-manifest.json +9 -9
- package/runtime/codex/AGENTS.md +62 -58
- package/runtime/codex/bin/activity-action.sh +92 -0
- package/runtime/codex/bin/activity-data.sh +12 -233
- package/runtime/codex/bin/agent.sh +84 -100
- package/runtime/codex/bin/artifact-register.sh +164 -0
- package/runtime/codex/bin/artifact-writeback.sh +53 -0
- package/runtime/codex/bin/artifacts.sh +288 -0
- package/runtime/codex/bin/build-sealed-dataroom.mjs +722 -0
- package/runtime/codex/bin/capture-run.sh +18 -2
- package/runtime/codex/bin/codex-render-spec.mjs +41 -16
- package/runtime/codex/bin/codex-session-start.sh +14 -4
- package/runtime/codex/bin/codex-skill-render.mjs +9 -7
- package/runtime/codex/bin/corpus_map.py +806 -0
- package/runtime/codex/bin/corpus_survey.py +304 -0
- package/runtime/codex/bin/dashboard-data.sh +11 -171
- package/runtime/codex/bin/github-auth.sh +121 -0
- package/runtime/codex/bin/graph-batch.sh +7 -0
- package/runtime/codex/bin/graph-op.sh +4 -0
- package/runtime/codex/bin/graph-projection.sh +54 -0
- package/runtime/codex/bin/graph-wal.sh +13 -0
- package/runtime/codex/bin/graph.sh +44 -0
- package/runtime/codex/bin/handoff-lifecycle-job.sh +146 -0
- package/runtime/codex/bin/handoff-lifecycle.sh +280 -0
- package/runtime/codex/bin/handoff-preview.sh +169 -0
- package/runtime/codex/bin/handoff-run.sh +42 -26
- package/runtime/codex/bin/ingest-graph.sh +6 -0
- package/runtime/codex/bin/ingest-item.sh +10 -0
- package/runtime/codex/bin/ingest.sh +59 -30
- package/runtime/codex/bin/invite.sh +6 -0
- package/runtime/codex/bin/issue.sh +10 -0
- package/runtime/codex/bin/knowledge.sh +10 -0
- package/runtime/codex/bin/lib/config.sh +20 -0
- package/runtime/codex/bin/lib/context.sh +46 -25
- package/runtime/codex/bin/lib/git-sync.sh +70 -6
- package/runtime/codex/bin/lib/greeting.sh +34 -5
- package/runtime/codex/bin/lib/handoff-meta.sh +97 -0
- package/runtime/codex/bin/lib/worktree-links.sh +6 -0
- package/runtime/codex/bin/node-run.sh +42 -0
- package/runtime/codex/bin/notification.sh +6 -0
- package/runtime/codex/bin/observe-context.sh +14 -0
- package/runtime/codex/bin/onboarding.sh +6 -0
- package/runtime/codex/bin/person.py +4 -0
- package/runtime/codex/bin/person.sh +43 -10
- package/runtime/codex/bin/pi-render-spec.mjs +140 -0
- package/runtime/codex/bin/post-update.sh +37 -0
- package/runtime/codex/bin/prime-render-spec.mjs +147 -0
- package/runtime/codex/bin/publish-artifact.sh +55 -2
- package/runtime/codex/bin/quest.sh +9 -0
- package/runtime/codex/bin/question.sh +8 -0
- package/runtime/codex/bin/research-ingest.sh +7 -0
- package/runtime/codex/bin/restore-owned-skills.sh +67 -0
- package/runtime/codex/bin/retrieval_eval.py +385 -0
- package/runtime/codex/bin/runtime-identity.sh +70 -0
- package/runtime/codex/bin/runtime-upgrade.sh +43 -0
- package/runtime/codex/bin/scroll.sh +9 -0
- package/runtime/codex/bin/search.sh +231 -195
- package/runtime/codex/bin/settings.sh +174 -5
- package/runtime/codex/bin/startup-check.sh +136 -0
- package/runtime/codex/bin/telemetry.sh +522 -247
- package/runtime/codex/bin/test-changes.sh +344 -0
- package/runtime/codex/bin/thread.sh +9 -0
- package/runtime/codex/bin/todo.sh +9 -0
- package/runtime/codex/bin/view-render.sh +126 -0
- package/runtime/codex/bin/worktree-create.sh +19 -5
- package/runtime/codex/egregore_runtime/__init__.py +228 -0
- package/runtime/codex/egregore_runtime/adapters/__init__.py +5 -0
- package/runtime/codex/egregore_runtime/adapters/invitation.py +237 -0
- package/runtime/codex/egregore_runtime/adapters/notification.py +59 -0
- package/runtime/codex/egregore_runtime/adapters/qmd.py +1701 -0
- package/runtime/codex/egregore_runtime/adapters/qmd_cli.py +210 -0
- package/runtime/codex/egregore_runtime/adapters/qmd_embed_worker.py +59 -0
- package/runtime/codex/egregore_runtime/admin_gate.py +102 -0
- package/runtime/codex/egregore_runtime/artifacts.py +523 -0
- package/runtime/codex/egregore_runtime/contracts.py +499 -0
- package/runtime/codex/egregore_runtime/entitlements.py +85 -0
- package/runtime/codex/egregore_runtime/errors.py +10 -0
- package/runtime/codex/egregore_runtime/graph.py +356 -0
- package/runtime/codex/egregore_runtime/handoff_lookup.py +196 -0
- package/runtime/codex/egregore_runtime/harness_cli.py +1221 -0
- package/runtime/codex/egregore_runtime/identity.py +734 -0
- package/runtime/codex/egregore_runtime/identity_cli.py +91 -0
- package/runtime/codex/egregore_runtime/ingest.py +575 -0
- package/runtime/codex/egregore_runtime/ingest_cli.py +254 -0
- package/runtime/codex/egregore_runtime/ingest_index_cli.py +147 -0
- package/runtime/codex/egregore_runtime/invitation_cli.py +51 -0
- package/runtime/codex/egregore_runtime/invitations.py +116 -0
- package/runtime/codex/egregore_runtime/issue_cli.py +305 -0
- package/runtime/codex/egregore_runtime/issues.py +359 -0
- package/runtime/codex/egregore_runtime/knowledge.py +376 -0
- package/runtime/codex/egregore_runtime/knowledge_cli.py +173 -0
- package/runtime/codex/egregore_runtime/lifecycle.py +888 -0
- package/runtime/codex/egregore_runtime/lifecycle_cli.py +269 -0
- package/runtime/codex/egregore_runtime/notification_cli.py +125 -0
- package/runtime/codex/egregore_runtime/notifications.py +230 -0
- package/runtime/codex/egregore_runtime/observe.py +342 -0
- package/runtime/codex/egregore_runtime/onboarding.py +290 -0
- package/runtime/codex/egregore_runtime/onboarding_cli.py +110 -0
- package/runtime/codex/egregore_runtime/policy.py +144 -0
- package/runtime/codex/egregore_runtime/profile.py +193 -0
- package/runtime/codex/egregore_runtime/quest_cli.py +216 -0
- package/runtime/codex/egregore_runtime/question_cli.py +180 -0
- package/runtime/codex/egregore_runtime/questions.py +304 -0
- package/runtime/codex/egregore_runtime/quests.py +419 -0
- package/runtime/codex/egregore_runtime/readiness.py +379 -0
- package/runtime/codex/egregore_runtime/research_ingest.py +256 -0
- package/runtime/codex/egregore_runtime/research_ingest_cli.py +44 -0
- package/runtime/codex/egregore_runtime/runtime.py +464 -0
- package/runtime/codex/egregore_runtime/scroll_cli.py +185 -0
- package/runtime/codex/egregore_runtime/scrolls.py +726 -0
- package/runtime/codex/egregore_runtime/status.py +412 -0
- package/runtime/codex/egregore_runtime/status_cli.py +174 -0
- package/runtime/codex/egregore_runtime/sync.py +218 -0
- package/runtime/codex/egregore_runtime/teamsync.py +139 -0
- package/runtime/codex/egregore_runtime/telemetry.py +640 -0
- package/runtime/codex/egregore_runtime/thread_cli.py +173 -0
- package/runtime/codex/egregore_runtime/threads.py +517 -0
- package/runtime/codex/egregore_runtime/todo_cli.py +142 -0
- package/runtime/codex/egregore_runtime/todos.py +244 -0
- package/runtime/codex/egregore_runtime/upgrade.py +770 -0
- package/runtime/codex/egregore_runtime/upgrade_worker.py +53 -0
- package/runtime/codex/egregore_runtime/writeback.py +391 -0
- package/runtime/codex/egregore_runtime/writeback_cli.py +114 -0
- package/runtime/codex/manifest.json +98 -1
- package/runtime/pi/.codex/hooks/search-hint.js +21 -52
- package/runtime/pi/.codex/hooks.json +3 -3
- package/runtime/pi/.codex/skills/activity/SKILL.md +23 -66
- package/runtime/pi/.codex/skills/announce/SKILL.md +27 -50
- package/runtime/pi/.codex/skills/archive/SKILL.md +21 -36
- package/runtime/pi/.codex/skills/checkup/SKILL.md +77 -36
- package/runtime/pi/.codex/skills/dark-mode/SKILL.md +1 -1
- package/runtime/pi/.codex/skills/dashboard/SKILL.md +17 -47
- package/runtime/pi/.codex/skills/handoff/SKILL.md +84 -133
- package/runtime/pi/.codex/skills/harvest/SKILL.md +32 -117
- package/runtime/pi/.codex/skills/ingest/SKILL.md +47 -25
- package/runtime/pi/.codex/skills/ingest-user-interview/SKILL.md +18 -36
- package/runtime/pi/.codex/skills/ingest-user-interview/references/analysis-contract.md +42 -0
- package/runtime/pi/.codex/skills/invite/SKILL.md +21 -35
- package/runtime/pi/.codex/skills/issue/SKILL.md +60 -41
- package/runtime/pi/.codex/skills/me/SKILL.md +1 -1
- package/runtime/pi/.codex/skills/meeting/SKILL.md +16 -36
- package/runtime/pi/.codex/skills/meeting/references/analysis-contract.md +48 -0
- package/runtime/pi/.codex/skills/note/SKILL.md +30 -25
- package/runtime/pi/.codex/skills/onboarding/SKILL.md +36 -41
- package/runtime/pi/.codex/skills/pull/SKILL.md +1 -1
- package/runtime/pi/.codex/skills/quest/SKILL.md +27 -66
- package/runtime/pi/.codex/skills/reflect/SKILL.md +22 -36
- package/runtime/pi/.codex/skills/save/SKILL.md +2 -2
- package/runtime/pi/.codex/skills/telemetry/SKILL.md +1 -1
- package/runtime/pi/.codex/skills/test/SKILL.md +1 -1
- package/runtime/pi/.codex/skills/tutorial/SKILL.md +40 -41
- package/runtime/pi/.codex/skills/view/SKILL.md +115 -111
- package/runtime/pi/.codex/skills/wrap/SKILL.md +45 -41
- package/runtime/pi/.codex/spec-manifest.json +9 -9
- package/runtime/pi/.pi/APPEND_SYSTEM.md +57 -48
- package/runtime/pi/.pi/extensions/egregore.ts +7 -0
- package/runtime/pi/.pi/spec-manifest.json +2 -2
- package/runtime/pi/AGENTS.md +62 -58
- package/runtime/pi/bin/activity-action.sh +92 -0
- package/runtime/pi/bin/activity-data.sh +12 -233
- package/runtime/pi/bin/agent.sh +84 -100
- package/runtime/pi/bin/artifact-register.sh +164 -0
- package/runtime/pi/bin/artifact-writeback.sh +53 -0
- package/runtime/pi/bin/artifacts.sh +288 -0
- package/runtime/pi/bin/build-sealed-dataroom.mjs +722 -0
- package/runtime/pi/bin/capture-run.sh +18 -2
- package/runtime/pi/bin/codex-render-spec.mjs +41 -16
- package/runtime/pi/bin/codex-session-start.sh +14 -4
- package/runtime/pi/bin/codex-skill-render.mjs +9 -7
- package/runtime/pi/bin/corpus_map.py +806 -0
- package/runtime/pi/bin/corpus_survey.py +304 -0
- package/runtime/pi/bin/dashboard-data.sh +11 -171
- package/runtime/pi/bin/github-auth.sh +121 -0
- package/runtime/pi/bin/graph-batch.sh +7 -0
- package/runtime/pi/bin/graph-op.sh +4 -0
- package/runtime/pi/bin/graph-projection.sh +54 -0
- package/runtime/pi/bin/graph-wal.sh +13 -0
- package/runtime/pi/bin/graph.sh +44 -0
- package/runtime/pi/bin/handoff-lifecycle-job.sh +146 -0
- package/runtime/pi/bin/handoff-lifecycle.sh +280 -0
- package/runtime/pi/bin/handoff-preview.sh +169 -0
- package/runtime/pi/bin/handoff-run.sh +42 -26
- package/runtime/pi/bin/ingest-graph.sh +6 -0
- package/runtime/pi/bin/ingest-item.sh +10 -0
- package/runtime/pi/bin/ingest.sh +59 -30
- package/runtime/pi/bin/invite.sh +6 -0
- package/runtime/pi/bin/issue.sh +10 -0
- package/runtime/pi/bin/knowledge.sh +10 -0
- package/runtime/pi/bin/lib/config.sh +20 -0
- package/runtime/pi/bin/lib/context.sh +46 -25
- package/runtime/pi/bin/lib/git-sync.sh +70 -6
- package/runtime/pi/bin/lib/greeting.sh +34 -5
- package/runtime/pi/bin/lib/handoff-meta.sh +97 -0
- package/runtime/pi/bin/lib/worktree-links.sh +6 -0
- package/runtime/pi/bin/node-run.sh +42 -0
- package/runtime/pi/bin/notification.sh +6 -0
- package/runtime/pi/bin/observe-context.sh +14 -0
- package/runtime/pi/bin/onboarding.sh +6 -0
- package/runtime/pi/bin/person.py +4 -0
- package/runtime/pi/bin/person.sh +43 -10
- package/runtime/pi/bin/pi-observe-context.mjs +93 -0
- package/runtime/pi/bin/pi-product-workflows.mjs +1 -1
- package/runtime/pi/bin/pi-render-spec.mjs +1 -1
- package/runtime/pi/bin/post-update.sh +37 -0
- package/runtime/pi/bin/prime-render-spec.mjs +147 -0
- package/runtime/pi/bin/publish-artifact.sh +55 -2
- package/runtime/pi/bin/quest.sh +9 -0
- package/runtime/pi/bin/question.sh +8 -0
- package/runtime/pi/bin/research-ingest.sh +7 -0
- package/runtime/pi/bin/restore-owned-skills.sh +67 -0
- package/runtime/pi/bin/retrieval_eval.py +385 -0
- package/runtime/pi/bin/runtime-identity.sh +70 -0
- package/runtime/pi/bin/runtime-upgrade.sh +43 -0
- package/runtime/pi/bin/scroll.sh +9 -0
- package/runtime/pi/bin/search.sh +231 -195
- package/runtime/pi/bin/settings.sh +174 -5
- package/runtime/pi/bin/startup-check.sh +136 -0
- package/runtime/pi/bin/telemetry.sh +522 -247
- package/runtime/pi/bin/test-changes.sh +344 -0
- package/runtime/pi/bin/thread.sh +9 -0
- package/runtime/pi/bin/todo.sh +9 -0
- package/runtime/pi/bin/view-render.sh +126 -0
- package/runtime/pi/bin/worktree-create.sh +19 -5
- package/runtime/pi/egregore_runtime/__init__.py +228 -0
- package/runtime/pi/egregore_runtime/adapters/__init__.py +5 -0
- package/runtime/pi/egregore_runtime/adapters/invitation.py +237 -0
- package/runtime/pi/egregore_runtime/adapters/notification.py +59 -0
- package/runtime/pi/egregore_runtime/adapters/qmd.py +1701 -0
- package/runtime/pi/egregore_runtime/adapters/qmd_cli.py +210 -0
- package/runtime/pi/egregore_runtime/adapters/qmd_embed_worker.py +59 -0
- package/runtime/pi/egregore_runtime/admin_gate.py +102 -0
- package/runtime/pi/egregore_runtime/artifacts.py +523 -0
- package/runtime/pi/egregore_runtime/contracts.py +499 -0
- package/runtime/pi/egregore_runtime/entitlements.py +85 -0
- package/runtime/pi/egregore_runtime/errors.py +10 -0
- package/runtime/pi/egregore_runtime/graph.py +356 -0
- package/runtime/pi/egregore_runtime/handoff_lookup.py +196 -0
- package/runtime/pi/egregore_runtime/harness_cli.py +1221 -0
- package/runtime/pi/egregore_runtime/identity.py +734 -0
- package/runtime/pi/egregore_runtime/identity_cli.py +91 -0
- package/runtime/pi/egregore_runtime/ingest.py +575 -0
- package/runtime/pi/egregore_runtime/ingest_cli.py +254 -0
- package/runtime/pi/egregore_runtime/ingest_index_cli.py +147 -0
- package/runtime/pi/egregore_runtime/invitation_cli.py +51 -0
- package/runtime/pi/egregore_runtime/invitations.py +116 -0
- package/runtime/pi/egregore_runtime/issue_cli.py +305 -0
- package/runtime/pi/egregore_runtime/issues.py +359 -0
- package/runtime/pi/egregore_runtime/knowledge.py +376 -0
- package/runtime/pi/egregore_runtime/knowledge_cli.py +173 -0
- package/runtime/pi/egregore_runtime/lifecycle.py +888 -0
- package/runtime/pi/egregore_runtime/lifecycle_cli.py +269 -0
- package/runtime/pi/egregore_runtime/notification_cli.py +125 -0
- package/runtime/pi/egregore_runtime/notifications.py +230 -0
- package/runtime/pi/egregore_runtime/observe.py +342 -0
- package/runtime/pi/egregore_runtime/onboarding.py +290 -0
- package/runtime/pi/egregore_runtime/onboarding_cli.py +110 -0
- package/runtime/pi/egregore_runtime/policy.py +144 -0
- package/runtime/pi/egregore_runtime/profile.py +193 -0
- package/runtime/pi/egregore_runtime/quest_cli.py +216 -0
- package/runtime/pi/egregore_runtime/question_cli.py +180 -0
- package/runtime/pi/egregore_runtime/questions.py +304 -0
- package/runtime/pi/egregore_runtime/quests.py +419 -0
- package/runtime/pi/egregore_runtime/readiness.py +379 -0
- package/runtime/pi/egregore_runtime/research_ingest.py +256 -0
- package/runtime/pi/egregore_runtime/research_ingest_cli.py +44 -0
- package/runtime/pi/egregore_runtime/runtime.py +464 -0
- package/runtime/pi/egregore_runtime/scroll_cli.py +185 -0
- package/runtime/pi/egregore_runtime/scrolls.py +726 -0
- package/runtime/pi/egregore_runtime/status.py +412 -0
- package/runtime/pi/egregore_runtime/status_cli.py +174 -0
- package/runtime/pi/egregore_runtime/sync.py +218 -0
- package/runtime/pi/egregore_runtime/teamsync.py +139 -0
- package/runtime/pi/egregore_runtime/telemetry.py +640 -0
- package/runtime/pi/egregore_runtime/thread_cli.py +173 -0
- package/runtime/pi/egregore_runtime/threads.py +517 -0
- package/runtime/pi/egregore_runtime/todo_cli.py +142 -0
- package/runtime/pi/egregore_runtime/todos.py +244 -0
- package/runtime/pi/egregore_runtime/upgrade.py +770 -0
- package/runtime/pi/egregore_runtime/upgrade_worker.py +53 -0
- package/runtime/pi/egregore_runtime/writeback.py +391 -0
- package/runtime/pi/egregore_runtime/writeback_cli.py +114 -0
- package/runtime/pi/manifest.json +98 -1
- package/runtime/prime/.codex/hooks/search-hint.js +21 -52
- package/runtime/prime/.codex/hooks.json +3 -3
- package/runtime/prime/.codex/skills/activity/SKILL.md +23 -66
- package/runtime/prime/.codex/skills/announce/SKILL.md +27 -50
- package/runtime/prime/.codex/skills/archive/SKILL.md +21 -36
- package/runtime/prime/.codex/skills/checkup/SKILL.md +77 -36
- package/runtime/prime/.codex/skills/dark-mode/SKILL.md +1 -1
- package/runtime/prime/.codex/skills/dashboard/SKILL.md +17 -47
- package/runtime/prime/.codex/skills/handoff/SKILL.md +84 -133
- package/runtime/prime/.codex/skills/harvest/SKILL.md +32 -117
- package/runtime/prime/.codex/skills/ingest/SKILL.md +47 -25
- package/runtime/prime/.codex/skills/ingest-user-interview/SKILL.md +18 -36
- package/runtime/prime/.codex/skills/ingest-user-interview/references/analysis-contract.md +42 -0
- package/runtime/prime/.codex/skills/invite/SKILL.md +21 -35
- package/runtime/prime/.codex/skills/issue/SKILL.md +60 -41
- package/runtime/prime/.codex/skills/me/SKILL.md +1 -1
- package/runtime/prime/.codex/skills/meeting/SKILL.md +16 -36
- package/runtime/prime/.codex/skills/meeting/references/analysis-contract.md +48 -0
- package/runtime/prime/.codex/skills/note/SKILL.md +30 -25
- package/runtime/prime/.codex/skills/onboarding/SKILL.md +36 -41
- package/runtime/prime/.codex/skills/pull/SKILL.md +1 -1
- package/runtime/prime/.codex/skills/quest/SKILL.md +27 -66
- package/runtime/prime/.codex/skills/reflect/SKILL.md +22 -36
- package/runtime/prime/.codex/skills/save/SKILL.md +2 -2
- package/runtime/prime/.codex/skills/telemetry/SKILL.md +1 -1
- package/runtime/prime/.codex/skills/test/SKILL.md +1 -1
- package/runtime/prime/.codex/skills/tutorial/SKILL.md +40 -41
- package/runtime/prime/.codex/skills/view/SKILL.md +115 -111
- package/runtime/prime/.codex/skills/wrap/SKILL.md +45 -41
- package/runtime/prime/.codex/spec-manifest.json +9 -9
- package/runtime/prime/.prime/agent/APPEND_SYSTEM.md +57 -48
- package/runtime/prime/.prime/agent/extensions/egregore.ts +7 -0
- package/runtime/prime/.prime/agent/spec-manifest.json +2 -2
- package/runtime/prime/AGENTS.md +62 -58
- package/runtime/prime/bin/activity-action.sh +92 -0
- package/runtime/prime/bin/activity-data.sh +12 -233
- package/runtime/prime/bin/agent.sh +84 -100
- package/runtime/prime/bin/artifact-register.sh +164 -0
- package/runtime/prime/bin/artifact-writeback.sh +53 -0
- package/runtime/prime/bin/artifacts.sh +288 -0
- package/runtime/prime/bin/build-sealed-dataroom.mjs +722 -0
- package/runtime/prime/bin/capture-run.sh +18 -2
- package/runtime/prime/bin/codex-render-spec.mjs +41 -16
- package/runtime/prime/bin/codex-session-start.sh +14 -4
- package/runtime/prime/bin/codex-skill-render.mjs +9 -7
- package/runtime/prime/bin/corpus_map.py +806 -0
- package/runtime/prime/bin/corpus_survey.py +304 -0
- package/runtime/prime/bin/dashboard-data.sh +11 -171
- package/runtime/prime/bin/github-auth.sh +121 -0
- package/runtime/prime/bin/graph-batch.sh +7 -0
- package/runtime/prime/bin/graph-op.sh +4 -0
- package/runtime/prime/bin/graph-projection.sh +54 -0
- package/runtime/prime/bin/graph-wal.sh +13 -0
- package/runtime/prime/bin/graph.sh +44 -0
- package/runtime/prime/bin/handoff-lifecycle-job.sh +146 -0
- package/runtime/prime/bin/handoff-lifecycle.sh +280 -0
- package/runtime/prime/bin/handoff-preview.sh +169 -0
- package/runtime/prime/bin/handoff-run.sh +42 -26
- package/runtime/prime/bin/ingest-graph.sh +6 -0
- package/runtime/prime/bin/ingest-item.sh +10 -0
- package/runtime/prime/bin/ingest.sh +59 -30
- package/runtime/prime/bin/invite.sh +6 -0
- package/runtime/prime/bin/issue.sh +10 -0
- package/runtime/prime/bin/knowledge.sh +10 -0
- package/runtime/prime/bin/lib/config.sh +20 -0
- package/runtime/prime/bin/lib/context.sh +46 -25
- package/runtime/prime/bin/lib/git-sync.sh +70 -6
- package/runtime/prime/bin/lib/greeting.sh +34 -5
- package/runtime/prime/bin/lib/handoff-meta.sh +97 -0
- package/runtime/prime/bin/lib/worktree-links.sh +6 -0
- package/runtime/prime/bin/node-run.sh +42 -0
- package/runtime/prime/bin/notification.sh +6 -0
- package/runtime/prime/bin/observe-context.sh +14 -0
- package/runtime/prime/bin/onboarding.sh +6 -0
- package/runtime/prime/bin/person.py +4 -0
- package/runtime/prime/bin/person.sh +43 -10
- package/runtime/prime/bin/pi-observe-context.mjs +93 -0
- package/runtime/prime/bin/pi-product-workflows.mjs +1 -1
- package/runtime/prime/bin/pi-render-spec.mjs +140 -0
- package/runtime/prime/bin/post-update.sh +37 -0
- package/runtime/prime/bin/prime-render-spec.mjs +1 -1
- package/runtime/prime/bin/publish-artifact.sh +55 -2
- package/runtime/prime/bin/quest.sh +9 -0
- package/runtime/prime/bin/question.sh +8 -0
- package/runtime/prime/bin/research-ingest.sh +7 -0
- package/runtime/prime/bin/restore-owned-skills.sh +67 -0
- package/runtime/prime/bin/retrieval_eval.py +385 -0
- package/runtime/prime/bin/runtime-identity.sh +70 -0
- package/runtime/prime/bin/runtime-upgrade.sh +43 -0
- package/runtime/prime/bin/scroll.sh +9 -0
- package/runtime/prime/bin/search.sh +231 -195
- package/runtime/prime/bin/settings.sh +174 -5
- package/runtime/prime/bin/startup-check.sh +136 -0
- package/runtime/prime/bin/telemetry.sh +522 -247
- package/runtime/prime/bin/test-changes.sh +344 -0
- package/runtime/prime/bin/thread.sh +9 -0
- package/runtime/prime/bin/todo.sh +9 -0
- package/runtime/prime/bin/view-render.sh +126 -0
- package/runtime/prime/bin/worktree-create.sh +19 -5
- package/runtime/prime/egregore_runtime/__init__.py +228 -0
- package/runtime/prime/egregore_runtime/adapters/__init__.py +5 -0
- package/runtime/prime/egregore_runtime/adapters/invitation.py +237 -0
- package/runtime/prime/egregore_runtime/adapters/notification.py +59 -0
- package/runtime/prime/egregore_runtime/adapters/qmd.py +1701 -0
- package/runtime/prime/egregore_runtime/adapters/qmd_cli.py +210 -0
- package/runtime/prime/egregore_runtime/adapters/qmd_embed_worker.py +59 -0
- package/runtime/prime/egregore_runtime/admin_gate.py +102 -0
- package/runtime/prime/egregore_runtime/artifacts.py +523 -0
- package/runtime/prime/egregore_runtime/contracts.py +499 -0
- package/runtime/prime/egregore_runtime/entitlements.py +85 -0
- package/runtime/prime/egregore_runtime/errors.py +10 -0
- package/runtime/prime/egregore_runtime/graph.py +356 -0
- package/runtime/prime/egregore_runtime/handoff_lookup.py +196 -0
- package/runtime/prime/egregore_runtime/harness_cli.py +1221 -0
- package/runtime/prime/egregore_runtime/identity.py +734 -0
- package/runtime/prime/egregore_runtime/identity_cli.py +91 -0
- package/runtime/prime/egregore_runtime/ingest.py +575 -0
- package/runtime/prime/egregore_runtime/ingest_cli.py +254 -0
- package/runtime/prime/egregore_runtime/ingest_index_cli.py +147 -0
- package/runtime/prime/egregore_runtime/invitation_cli.py +51 -0
- package/runtime/prime/egregore_runtime/invitations.py +116 -0
- package/runtime/prime/egregore_runtime/issue_cli.py +305 -0
- package/runtime/prime/egregore_runtime/issues.py +359 -0
- package/runtime/prime/egregore_runtime/knowledge.py +376 -0
- package/runtime/prime/egregore_runtime/knowledge_cli.py +173 -0
- package/runtime/prime/egregore_runtime/lifecycle.py +888 -0
- package/runtime/prime/egregore_runtime/lifecycle_cli.py +269 -0
- package/runtime/prime/egregore_runtime/notification_cli.py +125 -0
- package/runtime/prime/egregore_runtime/notifications.py +230 -0
- package/runtime/prime/egregore_runtime/observe.py +342 -0
- package/runtime/prime/egregore_runtime/onboarding.py +290 -0
- package/runtime/prime/egregore_runtime/onboarding_cli.py +110 -0
- package/runtime/prime/egregore_runtime/policy.py +144 -0
- package/runtime/prime/egregore_runtime/profile.py +193 -0
- package/runtime/prime/egregore_runtime/quest_cli.py +216 -0
- package/runtime/prime/egregore_runtime/question_cli.py +180 -0
- package/runtime/prime/egregore_runtime/questions.py +304 -0
- package/runtime/prime/egregore_runtime/quests.py +419 -0
- package/runtime/prime/egregore_runtime/readiness.py +379 -0
- package/runtime/prime/egregore_runtime/research_ingest.py +256 -0
- package/runtime/prime/egregore_runtime/research_ingest_cli.py +44 -0
- package/runtime/prime/egregore_runtime/runtime.py +464 -0
- package/runtime/prime/egregore_runtime/scroll_cli.py +185 -0
- package/runtime/prime/egregore_runtime/scrolls.py +726 -0
- package/runtime/prime/egregore_runtime/status.py +412 -0
- package/runtime/prime/egregore_runtime/status_cli.py +174 -0
- package/runtime/prime/egregore_runtime/sync.py +218 -0
- package/runtime/prime/egregore_runtime/teamsync.py +139 -0
- package/runtime/prime/egregore_runtime/telemetry.py +640 -0
- package/runtime/prime/egregore_runtime/thread_cli.py +173 -0
- package/runtime/prime/egregore_runtime/threads.py +517 -0
- package/runtime/prime/egregore_runtime/todo_cli.py +142 -0
- package/runtime/prime/egregore_runtime/todos.py +244 -0
- package/runtime/prime/egregore_runtime/upgrade.py +770 -0
- package/runtime/prime/egregore_runtime/upgrade_worker.py +53 -0
- package/runtime/prime/egregore_runtime/writeback.py +391 -0
- package/runtime/prime/egregore_runtime/writeback_cli.py +114 -0
- package/runtime/prime/manifest.json +98 -1
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
# RESEARCH.md — the engine contract
|
|
2
|
+
|
|
3
|
+
How multi-hop research actually works: the ledger, leads, waves, saturation, and budgets. `SKILL.md` is the entry point; this file is the mechanism. Agent prompts live in `ROLES.md`.
|
|
4
|
+
|
|
5
|
+
## The ledger
|
|
6
|
+
|
|
7
|
+
Main-loop state, mirrored to `.egregore/research-runs/{run-id}.json` after every wave (and on any exit — the ledger survives skipped runs and crashes; it is the provenance):
|
|
8
|
+
|
|
9
|
+
```json
|
|
10
|
+
{
|
|
11
|
+
"run_id": "dr-2026-07-11-a3f2",
|
|
12
|
+
"question": "...",
|
|
13
|
+
"sub_questions": ["..."],
|
|
14
|
+
"mode": "question|crossref",
|
|
15
|
+
"band": "brief|standard|deep",
|
|
16
|
+
"seen": ["memory/knowledge/decisions/2026-03-07-....md"],
|
|
17
|
+
"lead_queue": [{"type": "quest", "ref": "onboarding-validation", "why": "...", "from": "path", "wave": 1, "score": 6}],
|
|
18
|
+
"claims": [{"id": 1, "claim": "...", "sub_question": "...", "path": "...", "excerpt": "...", "date": "...", "author": "...", "weight": "primary|secondary|ambient", "wave": 1, "status": "pending|verified|corrected|downgraded|dated|killed|unverified", "relation": "crossref mode only"}],
|
|
19
|
+
"gaps": [{"id": 1, "gap": "...", "probes": ["..."], "from": "scout|reader|analyst|coverage", "status": "provisional|verified|refuted"}],
|
|
20
|
+
"log": [{"action": "...", "purpose": "...", "result": "..."}],
|
|
21
|
+
"stop_reason": null
|
|
22
|
+
}
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
**The main loop assigns a stable integer `id` to every claim and gap when merging agent output into the ledger.** All downstream references (analysts' `claim_ids`, skeptics' verdicts) use these ids — never positional indices, since analysts and skeptics receive differently ordered or partitioned views.
|
|
26
|
+
|
|
27
|
+
`seen` holds normalized repo-relative paths (plus graph ids when connected). A doc enters `seen` when assigned to a reader, never twice.
|
|
28
|
+
|
|
29
|
+
## Leads
|
|
30
|
+
|
|
31
|
+
A **lead** is a typed pointer extracted by a reader from document text or graph neighbors:
|
|
32
|
+
|
|
33
|
+
```
|
|
34
|
+
{type: doc-link | quest | person | session | pr | topic-term | named-absent, ref, why, from, wave}
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Extraction sources map to real substrate affordances — readers look for:
|
|
38
|
+
- explicit `memory/` paths and relative `.md` links in prose
|
|
39
|
+
- frontmatter fields, BOTH generations (`ROLES.md` §Frontmatter): YAML `topics:[]` / `quests:[]` / `harvest:` / `synthesis:` / `affects:`, and old-style `**Topics**:` bold-field lines
|
|
40
|
+
- author names in filenames (`DD-author-topic.md`) and bylines
|
|
41
|
+
- branch names, PR numbers, and hosted URLs in handoff prose
|
|
42
|
+
- `handoffs/index.md` and `quests/index.md` ledger rows
|
|
43
|
+
- connected mode: graph neighbors via the `filePath` bridge — `PART_OF`, `IMPLEMENTS` chains, `BUILDS_ON`/`SUPERSEDES`/`REFINES`, `RELATES_TO`/`TENSION_WITH` (prior deep-reflect output is a hop rail)
|
|
44
|
+
|
|
45
|
+
**Lead resolution** (main loop, between waves) converts non-doc leads to files:
|
|
46
|
+
- `person` → `ls memory/handoffs/*/ | grep {author}` + `memory/people/{name}.md` (+ graph `CONTRIBUTED_BY` when connected)
|
|
47
|
+
- `quest` → `memory/quests/{slug}.md` + frontmatter grep for members
|
|
48
|
+
- `session` → handoff filePath via `handoffs/index.md`
|
|
49
|
+
- `topic-term` → exactly ONE `search.sh query "{term}" --fast -n 5`. Topic leads may NOT recursively spawn topic leads — fan-out control.
|
|
50
|
+
- `named-absent` → never hops. The main loop runs ONE `--fast` resolution probe; on miss, it enters the gap register with that probe attached.
|
|
51
|
+
|
|
52
|
+
## Graph orientation (connected mode, seed stage only)
|
|
53
|
+
|
|
54
|
+
One query, non-fatal, results fed to the scouts:
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
bash bin/graph.sh query "MATCH (a:Artifact) WHERE any(t IN a.topics WHERE t CONTAINS \$topic) OR toLower(a.title) CONTAINS \$topic OPTIONAL MATCH (a)-[r:RELATES_TO|TENSION_WITH|PART_OF]-(n) RETURN a.title, a.type, a.filePath, type(r), coalesce(n.title, n.id) LIMIT 25" '{"topic": "{lowercased core topic term}"}' 2>/dev/null || true
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## Gaps
|
|
61
|
+
|
|
62
|
+
The gap register has three feeders, all routed by the main loop:
|
|
63
|
+
|
|
64
|
+
1. **Scout `gap_hypotheses`** — paired with that scout's `probes_run` list when entered into the register.
|
|
65
|
+
2. **Coverage probes** — after each wave, any sub-question with zero claims gets ≤2 main-loop `--fast` probes; if both miss, a gap entry is written with those probe strings.
|
|
66
|
+
3. **Reader `named-absent` leads and analyst `void` patterns** — folded into the register before VERIFY; the main loop attaches originating probes where they exist.
|
|
67
|
+
|
|
68
|
+
The skeptic receives the FULL gap register. For probe-less gaps it devises ≥2 probes itself. Only gaps that survive the skeptic's absence audit (`ROLES.md` §Skeptic) ship in the report.
|
|
69
|
+
|
|
70
|
+
## Waves
|
|
71
|
+
|
|
72
|
+
A **hop = one wave**: pop the top-K leads (K sized so resolved docs ≤ 8-12), resolve to files, batch into 2-4 parallel readers (3-6 files each — readers read their files in their OWN contexts; never pipe file contents through the main loop), merge results into the ledger.
|
|
73
|
+
|
|
74
|
+
**Lead scoring** for the queue: novelty (unseen: hard filter) × source-strength (citing doc's relevance verdict: high=3 / med=2 / low=1) × type-prior (doc-link, quest = 3 · person, session, pr = 2 · topic-term = 1), recency as tiebreak.
|
|
75
|
+
|
|
76
|
+
## Saturation
|
|
77
|
+
|
|
78
|
+
Three tests, checked after every wave:
|
|
79
|
+
|
|
80
|
+
- **(a) novelty low**: unseen leads / total leads extracted this wave < 0.25
|
|
81
|
+
- **(b) coverage met**: every sub-question has ≥2 independent sources (distinct authors OR distinct top-level dirs), OR a gap entry with ≥2 distinct failed probes (**provisional** — VERIFY re-attacks it later)
|
|
82
|
+
- **(c) yield zero**: no primary-weight claims this wave
|
|
83
|
+
|
|
84
|
+
Stop rules, as explicit predicates:
|
|
85
|
+
|
|
86
|
+
| stop_reason | Fires when |
|
|
87
|
+
|---|---|
|
|
88
|
+
| `answered` | Self-termination: before the budget, every sub-question has ≥2 sources including ≥1 primary claim, and the main loop judges further waves enrichment, not necessity. Don't spend to budget if strong synthesis is found early |
|
|
89
|
+
| `saturated` | (b) holds AND ((a) OR (c)) |
|
|
90
|
+
| `dry` | (a) AND (c) hold for two consecutive waves while (b) still fails — the corpus stopped yielding before coverage completed |
|
|
91
|
+
| `budget` | Wave cap reached (brief 1 / standard 3 / deep 5) |
|
|
92
|
+
| `sparse` | FRAME collapsed the run to the sparse band |
|
|
93
|
+
|
|
94
|
+
**Bonus wave rule**: if VERIFY refutes a gap claim (the skeptic found the doc), the found doc enters the ledger; if that leaves a sub-question uncovered, reopen ONE budget-exempt bonus wave — at most once per run. Bonus-wave claims go through a scoped second skeptic pass (mechanical + semantic checks only; no further gap re-search or decay audit). Analysts are NOT re-run; bonus-wave claims ship as findings only if verified, and patterns stand as pruned (`REPORT.md` §Pattern pruning).
|
|
95
|
+
|
|
96
|
+
## Budget
|
|
97
|
+
|
|
98
|
+
Set in FRAME. **Counting rule for N (relevant docs):** union of unique paths from (1) `grep -ril "{topic terms}" memory/knowledge/ memory/handoffs/ memory/artifacts/`, (2) 2× `search.sh query --fast -n 20` with different wordings (count result blocks, not the banner), (3) `bin/artifacts.sh find "{topic}"`. N = the union's size; it feeds the plan line and this table:
|
|
99
|
+
|
|
100
|
+
| N | Band | Waves |
|
|
101
|
+
|---|---|---|
|
|
102
|
+
| ≥ ~35, multi-dir spread | deep-leaning standard | 3 (5 on `--deep`) |
|
|
103
|
+
| ~20-35 | standard | 3 |
|
|
104
|
+
| ~5-20 | collapsed | 1 scout + 1 wave, insufficiency-forward report |
|
|
105
|
+
| < ~5 | none | offer `/reflect` or `/harvest`, stop |
|
|
106
|
+
|
|
107
|
+
If `search.sh` errors, warns `index update FAILED`, or returns zero blocks while grep/`artifacts.sh` hit: drop it from the union, rely on grep + artifacts.sh, and note "recall degraded" in the plan line — a broken index must not masquerade as a thin corpus.
|
|
108
|
+
|
|
109
|
+
`--brief`/`--deep` force the band. Search budget holds regardless: ONE best-available-tier probe per run (seed, scout #1), `--fast` elsewhere.
|
|
110
|
+
|
|
111
|
+
## Compounding
|
|
112
|
+
|
|
113
|
+
SEED must check prior research before searching cold:
|
|
114
|
+
|
|
115
|
+
1. `grep -ril "{topic terms}" memory/knowledge/research/ | head -5`
|
|
116
|
+
2. For each prior report found: read `artifacts_cited` (falling back to `artifacts_consulted` — the older generation) from its frontmatter. Entries may be filename STEMS rather than paths — resolve with `find memory -name "{stem}.md"` before promoting. Resolved paths become pre-warmed hop-0 leads (source-strength high).
|
|
117
|
+
3. Re-audit the prior report's `null_regions` frontmatter (structured gaps + probes): *"was this gap filled since?"* is a standing sub-question.
|
|
118
|
+
4. The new report stamps `builds_on: [prior-report-paths]` in frontmatter (+ `BUILDS_ON` edge, connected).
|
|
119
|
+
|
|
120
|
+
Only user-saved reports exist in `memory/knowledge/research/`, so compounding never seeds from ungated output.
|
|
121
|
+
|
|
122
|
+
## Decay
|
|
123
|
+
|
|
124
|
+
During VERIFY: any cited evidence older than ~90 days triggers ONE `--fast` newer-artifact probe (`search.sh query "{claim terms}" --fast -n 3`, or `SUPERSEDES` edge check when connected). A newer contradicting or superseding artifact demotes the claim to `dated` and is cited alongside it. In cross-ref mode this check may also set the claim's `relation` to `supersedes`.
|
|
125
|
+
|
|
126
|
+
## Resume
|
|
127
|
+
|
|
128
|
+
`--resume <run-id>`: load `.egregore/research-runs/{run-id}.json` and restore the FULL ledger — `seen`, `lead_queue`, `claims`, `gaps`, `log`. Continue under the original `run_id` and file. "Fresh budget" means the wave counter resets under the original band unless `--brief`/`--deep` is re-passed. The prior `stop_reason` is appended to `log` as `{action: "resumed"}`.
|
|
129
|
+
|
|
130
|
+
## Cross-ref mode differences
|
|
131
|
+
|
|
132
|
+
Identical engine. The insight text is decomposed into sub-questions of the form: *what supports this? what contradicts it? what already says it? what does it depend on?* Readers additionally set `relation` on each claim (`supports | contradicts | duplicates | depends-on` — derived from which sub-question the claim answers; `supersedes` is set only by the skeptic's decay check). The skeptic preserves or corrects `relation` alongside its verdict. Verified relations drive the capture stage's edge proposals (`REPORT.md` §Writeback).
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
# ROLES.md — agent contracts
|
|
2
|
+
|
|
3
|
+
Prompts and output schemas for every subagent the engine spawns. Contracts are **tier-silent** — no model names anywhere; spawns pass no model override and inherit the session tier. Each prompt must be self-contained: subagents inherit nothing from the main conversation.
|
|
4
|
+
|
|
5
|
+
**Two bindings, one contract.** When the harness provides schema-validated subagent spawning (the Workflow tool), bind each role's schema there and validation is enforced by the harness. In the foreground-Task fallback, append to every prompt: `Return ONLY valid JSON matching the schema below. No markdown fences, no explanation.` — one repair attempt on invalid JSON, then continue with whatever agents succeeded; synthesis works with partial input.
|
|
6
|
+
|
|
7
|
+
Every prompt begins with the same context block:
|
|
8
|
+
|
|
9
|
+
> You are a research subagent inside Egregore, an org whose shared memory lives as markdown under `memory/` (absolute path: {MEMORY_PATH}). The org is researching: "{QUESTION}" (sub-questions: {SUB_QUESTIONS}). Your final output is consumed by an orchestrator as data.
|
|
10
|
+
|
|
11
|
+
## Frontmatter — two generations, both real
|
|
12
|
+
|
|
13
|
+
Files carry EITHER new-style YAML (`title:`, `date:` or `created:`, `author:` or `researcher:`/`by:`, `topics: [..]`, `quests: [..]`, `status:`) OR old-style bold-field headers (`**Date**:`, `**Author**:`, `**Topics**:`). Parse both, honoring the synonyms. When neither exists, derive date/author from the filename (`YYYY-MM-DD-author-slug.md`, `DD-author-topic.md` in monthly dirs). Never report a file as unattributed or undated without checking all three.
|
|
14
|
+
|
|
15
|
+
## Scout (SEED — 2 in parallel)
|
|
16
|
+
|
|
17
|
+
Mission: build the initial frontier. You may hypothesize what you expect to find, but you may NOT assert any finding as real — that requires evidence you don't have yet.
|
|
18
|
+
|
|
19
|
+
Inputs: question, sub-questions, corpus-probe results, prior-research compounding leads (`RESEARCH.md` §Compounding), and (connected) the graph orientation results.
|
|
20
|
+
|
|
21
|
+
Actions budget: ≤3 `bash bin/search.sh query "..." --fast -n 5` with DIFFERENT wordings (one keyword-ish, one conceptual); frontmatter/topic greps (`grep -rl "topics:.*{term}" memory/knowledge/`); `memory/quests/index.md` + `memory/handoffs/index.md` scans. **Scout #1's prompt additionally grants the run's single best-available-tier search probe (no `--fast` flag); scout #2 is `--fast`-only** — the main loop writes this into each prompt so the budget needs no coordination. Count result blocks, never the banner hit count.
|
|
22
|
+
|
|
23
|
+
```json
|
|
24
|
+
{
|
|
25
|
+
"candidates": [{"path": "memory/...", "hypothesis": "why this doc should matter"}],
|
|
26
|
+
"probes_run": ["..."],
|
|
27
|
+
"gap_hypotheses": ["topics that SHOULD have coverage but probes found none"]
|
|
28
|
+
}
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Max 12 candidates across both scouts after the main loop merges. Prefer breadth — convergence needs sources from different directories and authors. The main loop pairs your `gap_hypotheses` with your `probes_run` when it enters them into the gap register.
|
|
32
|
+
|
|
33
|
+
## Reader (HOP WAVES — 2-4 per wave)
|
|
34
|
+
|
|
35
|
+
Mission: read assigned files IN FULL, in your own context, and extract claims + leads. Titles and topics are hints, not evidence — your claims must be grounded in what the text actually says.
|
|
36
|
+
|
|
37
|
+
Inputs: 3-6 file paths (you read them yourself with the Read tool), the question + sub-questions, the current seen-set (paths only, for lead dedup), and in cross-ref mode the relation instruction below.
|
|
38
|
+
|
|
39
|
+
Hard rules:
|
|
40
|
+
- No claim without a verbatim excerpt (≤30 words) copied exactly from the file — it will be mechanically re-checked; a fabricated or paraphrased excerpt kills the claim.
|
|
41
|
+
- Weight every claim: `primary` (should change what the user does next), `secondary` (worth knowing), `ambient` (context).
|
|
42
|
+
- Irrelevant assigned file → say so (`relevance: low`) and move on. Don't force significance.
|
|
43
|
+
- Extract leads per `RESEARCH.md` §Leads; skip anything in the seen-set.
|
|
44
|
+
- Cross-ref mode only: set `relation` per claim — `supports | contradicts | duplicates | depends-on`, derived from which sub-question the claim answers. Never `supersedes` (that verdict belongs to the skeptic's decay check).
|
|
45
|
+
|
|
46
|
+
```json
|
|
47
|
+
{
|
|
48
|
+
"claims": [{"claim": "one sentence", "sub_question": "...", "path": "memory/...", "excerpt": "verbatim ≤30 words", "date": "YYYY-MM-DD", "author": "...", "weight": "primary|secondary|ambient", "relation": "cross-ref mode only"}],
|
|
49
|
+
"leads": [{"type": "doc-link|quest|person|session|pr|topic-term|named-absent", "ref": "...", "why": "one line", "from": "citing path"}],
|
|
50
|
+
"contradiction_flags": [{"between": ["path-or-claim", "path-or-claim"], "note": "..."}],
|
|
51
|
+
"file_verdicts": [{"path": "...", "relevance": "high|med|low"}]
|
|
52
|
+
}
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
The main loop assigns each claim a stable `id` on merge; you never number your own claims.
|
|
56
|
+
|
|
57
|
+
## Analyst (PATTERN — 2 in parallel, de-correlated)
|
|
58
|
+
|
|
59
|
+
Mission: find structure across the ledger's claims. You receive the id-carrying claims table and contradiction flags — NOT the other analyst's output, intentionally: fresh reads without anchoring.
|
|
60
|
+
|
|
61
|
+
**Convergence analyst** — receives claims sorted chronologically. Look for: independent agreement (distinct authors/dirs arriving at the same conclusion), evolution arcs (thinking that shifted, and when), clusters, trajectories.
|
|
62
|
+
**Tension analyst** — receives claims grouped by sub-question/topic. Look for: contradictions, supersession (a newer claim quietly replacing an older one), drift (vocabulary or position changing without a recorded decision), voids (what the claims collectively assume but never establish).
|
|
63
|
+
|
|
64
|
+
Hard rules:
|
|
65
|
+
- Every pattern names its supporting claims by their stable `id`s. No pattern without ≥1 claim (voids cite what SHOULD exist but doesn't; the main loop routes voids into the gap register for the skeptic's absence audit).
|
|
66
|
+
- Describe patterns in free language, tagged with a structural role. **The role vocabulary is open**: `cluster / bridge / void / trajectory / recurrence / contradiction / drift / convergence` are the common labels — coin a new one when the structure genuinely demands it, and define it in the description.
|
|
67
|
+
- "The claims are routine; nothing structural" is a valid finding. Don't manufacture significance.
|
|
68
|
+
|
|
69
|
+
```json
|
|
70
|
+
{
|
|
71
|
+
"patterns": [{"role": "free-form structural label (common: cluster|bridge|void|trajectory|recurrence|contradiction|drift|convergence)", "description": "free-form, specific", "claim_ids": [1, 4], "weight": "primary|secondary|ambient"}],
|
|
72
|
+
"notes": "free-form observations that don't fit the schema"
|
|
73
|
+
}
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## Skeptic (VERIFY — 1-2 in parallel)
|
|
77
|
+
|
|
78
|
+
Mission: attack every claim and every gap. You see id-carrying claims + cited files + the full gap register — never the analysts' reasoning. When two skeptics run, the main loop partitions claims by id; both receive the whole gap register but only audit their assigned gap ids.
|
|
79
|
+
|
|
80
|
+
Per claim, in order:
|
|
81
|
+
1. **Mechanical check.** Normalize both sides — strip markdown emphasis characters (`*`, `_`, `` ` ``), collapse every whitespace run (including newlines) to a single space, case-fold — then fixed-string search the normalized excerpt in the normalized file text (read the file, or `python3`/`tr`-normalize and grep). Found → step 2. Missing → search the file yourself for text genuinely supporting the claim: found → replace the excerpt with the real text, verdict `corrected`; not found → verdict `killed` (miscite — no paraphrase benefit of the doubt).
|
|
82
|
+
2. **Semantic check.** Does the surrounding text carry the claim's weight, or only its title? Overreach → verdict `downgraded` (with a note), not killed.
|
|
83
|
+
3. **Decay check.** Evidence older than ~90 days → ONE `search.sh query "{claim terms}" --fast -n 3` (or `SUPERSEDES` edge check when connected). Newer superseding/contradicting artifact → verdict `dated`, cite the newer doc; in cross-ref mode set the claim's `relation` to `supersedes`.
|
|
84
|
+
4. Cross-ref mode: preserve the claim's `relation` unless your findings correct it; note any change.
|
|
85
|
+
|
|
86
|
+
Per gap:
|
|
87
|
+
5. **Absence audit.** Re-run the recorded probes PLUS one adversarial probe of your own devising (different vocabulary, different directory). Probe-less gaps (analyst voids): devise ≥2 probes yourself. If you FIND the allegedly-absent doc: verdict `refuted`, return the found path — it enters the ledger as a bonus hop. Otherwise `verified`.
|
|
88
|
+
|
|
89
|
+
```json
|
|
90
|
+
{
|
|
91
|
+
"claim_verdicts": [{"claim_id": 1, "verdict": "verified|corrected|downgraded|dated|killed", "note": "...", "corrected_excerpt": "only for corrected", "newer_doc": "only for dated", "relation": "cross-ref mode, only if changed"}],
|
|
92
|
+
"gap_verdicts": [{"gap_id": 1, "verdict": "verified|refuted", "found_path": "only for refuted", "extra_probes": ["the probes you added"]}]
|
|
93
|
+
}
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
## Failure handling
|
|
97
|
+
|
|
98
|
+
| Failure | Handling |
|
|
99
|
+
|---|---|
|
|
100
|
+
| One reader/scout returns invalid JSON | One repair attempt; still invalid → log to provenance, continue partial |
|
|
101
|
+
| One analyst fails | Proceed with the other; note the missing lens in the report |
|
|
102
|
+
| Both analysts fail | Main loop synthesizes directly from the verified claims table at capped confidence |
|
|
103
|
+
| Skeptic fails | Rerun once; else every unchecked claim ships marked `unverified` — never silently skip verification |
|
|
104
|
+
| An agent returns zero claims/leads | Valid result. Record it; it feeds the yield saturation test |
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: deep-reflect
|
|
3
|
+
description: "Run deep, multi-hop research over org memory to answer a question or cross-reference an insight, with a cited synthesis. Use for /deep-reflect — not one-shot recall (/search) or capturing an insight (/reflect)."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Deep research over org memory — ask a question, get a verified, cited synthesis of what the org collectively knows, including what it doesn't.
|
|
7
|
+
|
|
8
|
+
Multi-hop, multi-agent research over `memory/` (plus the graph, when connected). Waves of parallel readers hop a lead ledger until saturation; a skeptic pass kills every claim it cannot re-find in the cited file. `/reflect` captures user thought; `/deep-reflect` researches what the org already knows.
|
|
9
|
+
|
|
10
|
+
Pipeline: deep-reflect v4 · 2026-07-11 · thin entry + sibling contracts (`RESEARCH.md`, `ROLES.md`, `REPORT.md`).
|
|
11
|
+
|
|
12
|
+
## When to invoke
|
|
13
|
+
|
|
14
|
+
User says: "deep dive on X", "what do we know about X", "what does the knowledge base say about X", "research what we know about X", "what's the org's position on X", "cross-reference this", "analyze this against what we know", "connect the dots between X and Y"
|
|
15
|
+
Not this: web sources → out of scope (this skill researches memory, not the web) · one-shot recall ("what did we decide about X") → `/search` · capture a new insight → `/reflect` · ask people, not documents → `/harvest` · private thought → `/note` · track the open question itself → `/quest`
|
|
16
|
+
|
|
17
|
+
Arguments: $ARGUMENTS (Optional: [question or insight] [--brief|--deep] [--quest <slug>] [--no-capture] [--resume <run-id>] [--graph])
|
|
18
|
+
|
|
19
|
+
**Saves through the capture gate.** A Save verdict runs the full `/save` flow — no separate `/save` after.
|
|
20
|
+
|
|
21
|
+
## Modes
|
|
22
|
+
|
|
23
|
+
| Mode | Job | Extra output |
|
|
24
|
+
|---|---|---|
|
|
25
|
+
| **question** (default) | Answer a research question from memory | — |
|
|
26
|
+
| **cross-ref** | v2's job: situate one insight against the corpus | verified `RELATES_TO`/`TENSION_WITH` edge proposals (connected) |
|
|
27
|
+
|
|
28
|
+
Both modes write reports to `memory/knowledge/research/` — except `--brief` and probe-collapsed sparse runs, which default to terminal-only output with a two-option Save/Skip gate (Save writes the standard file). Depth bands are orthogonal; the default is dynamic, set by the Stage-0 corpus probe:
|
|
29
|
+
|
|
30
|
+
| Band | Waves | Docs read | Wall clock |
|
|
31
|
+
|---|---|---|---|
|
|
32
|
+
| `--brief` | 1 | ~8 | ~1-2 min |
|
|
33
|
+
| standard | ≤3 | ~24 | ~3-5 min |
|
|
34
|
+
| `--deep` | ≤5 | ~45 | ~6-10 min |
|
|
35
|
+
|
|
36
|
+
**Detection order (Stage 0):** 1) strip flags; 2) interrogative form ("what/how/why/have we/do we…") → question mode; 3) "cross-reference" / "this" / a pronoun pointing at conversation content, or a declarative insight statement → cross-ref mode (the research question becomes *"how does {insight} sit against existing memory?"*); 4) bare topic noun-phrase → question mode with *"what does the org know about {topic}?"*; 5) empty and no session context → one AskUserQuestion offering 2-3 candidate questions mined from the current session, or stop cleanly on skip.
|
|
37
|
+
|
|
38
|
+
## Mode detection
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
MODE=$(jq -r '.mode // "connected"' egregore.json 2>/dev/null)
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
**IMPORTANT**: Check mode FIRST, before any other step.
|
|
45
|
+
|
|
46
|
+
**Local mode** (`mode === "local"`): run the FULL engine over files. `bin/search.sh` is fully local; frontmatter topics/quests, `index.md` ledgers, and filename conventions are the hop rails. Skip ALL `bin/graph.sh` / `bin/graph-op.sh` calls — do NOT run them. Zero graph vocabulary in any output (no "graph offline", no Neo4j, no connected-mode upsell). Cross-references persist as markdown links in the report. TUI footer: `✓ Saved · pushed`.
|
|
47
|
+
|
|
48
|
+
**Connected mode**: uses the same canonical file path. Graph orientation and
|
|
49
|
+
edge extraction occur only when the user explicitly supplies `--graph`; graph
|
|
50
|
+
health/freshness must be verified and every selected claim must still open its
|
|
51
|
+
canonical source. A Connected account alone never adds graph to retrieval.
|
|
52
|
+
|
|
53
|
+
**Connected but graph offline**: DOES message, once — `Graph offline — researching over files only.` — then runs the local-shaped plan. Every graph call throughout is non-fatal (`2>/dev/null || true`); the file is the canonical record.
|
|
54
|
+
|
|
55
|
+
## Execution rules
|
|
56
|
+
|
|
57
|
+
- **Dialogue budget (hard rule):** at most ONE AskUserQuestion before the run — fired only when the question is underspecified (combine scope confirmation + depth choice in that single call). A long estimate alone never requires confirmation — the plan line is the notice. Plus the capture gate at the end, including any user-initiated follow-up branches inside it. Never more.
|
|
58
|
+
- **Plan line before any work:** `Researching: {question} · ~{N} relevant docs · budget {M} waves · est ~{X} min` — N per `RESEARCH.md` §Budget's counting rule. Pre-announce any single long operation (`semantic search ~30s…`).
|
|
59
|
+
- **Wave ticker while running:** `[wave 2/3] read 11 · claims 9 · new leads 6 (2 quests, 1 person, 3 files)`.
|
|
60
|
+
- **Observe seed:** import candidates and already-opened sources from an
|
|
61
|
+
attached `EGREGORE_ORG_CONTEXT_V1` block into the evidence ledger. Do not
|
|
62
|
+
query or reopen them again. When the seed sufficiently covers the question,
|
|
63
|
+
Stage 0 performs zero additional retrieval calls.
|
|
64
|
+
- **Search budget:** without a sufficient Observe seed, run at most ONE typed
|
|
65
|
+
`bin/search.sh query` call for initial discovery. Later searches are allowed
|
|
66
|
+
only for a named uncovered sub-question or lead, never as a duplicate corpus
|
|
67
|
+
probe or dedupe pass.
|
|
68
|
+
- **CRITICAL: Suppress raw output.** Never show raw JSON or file dumps. Bulk payloads go to `"${TMPDIR:-/tmp}/egregore-research-$$.json"` and get jq-sliced.
|
|
69
|
+
- Call inventory: 1 identity resolution · 0-1 initial Runtime retrieval ·
|
|
70
|
+
authorized opens for uncovered evidence · bounded lead probes only when a
|
|
71
|
+
named gap survives · subagents per the selected band · 0-1 pre-run question
|
|
72
|
+
· 1 capture gate · one canonical writeback · telemetry.
|
|
73
|
+
- Run ID: `dr-$(date +%Y-%m-%d)-$(openssl rand -hex 2)`. Ledger persists at `.egregore/research-runs/{run-id}.json` (local only, never pushed) — including for skipped runs. The log IS the provenance, not a byproduct.
|
|
74
|
+
|
|
75
|
+
## Orchestration
|
|
76
|
+
|
|
77
|
+
Invoking this skill IS the user's opt-in to Workflow orchestration for this run. Compose workflow scripts at runtime from `RESEARCH.md` (stages, ledger, saturation) and `ROLES.md` (agent contracts + schemas). Do NOT ship or reuse a stored `.js` — the prose contracts are the single source of truth.
|
|
78
|
+
|
|
79
|
+
**The seam:** one Workflow invocation per stage fan-out — the scouts, each wave's readers, the analysts, the skeptics. The main conversation performs lead resolution, ledger merge/mirror, and saturation checks BETWEEN invocations. Readers read their assigned files in their own contexts — never pipe file contents through the main loop.
|
|
80
|
+
|
|
81
|
+
**Workflow tool unavailable** (older harness, org policy): run the SAME stages as standard foreground parallel Task calls (NOT `run_in_background`) binding the same `ROLES.md` contracts — JSON by prompt discipline, one repair attempt, then continue with whatever agents succeeded. This fallback is a first-class path with the identical seam structure. Runtimes with no subagents at all (some Codex sessions) degrade further per the Codex adapter: staged single-model passes, provenance marked `verification: self-checked`.
|
|
82
|
+
|
|
83
|
+
Spawns pass NO model override — subagents inherit the session tier (`loom/routes.json` carries the delegation note; Loom Phase 1 does not let skills pin models). Framing, synthesis, and the capture gate stay in the main loop.
|
|
84
|
+
|
|
85
|
+
## Stages
|
|
86
|
+
|
|
87
|
+
Engine contract: `RESEARCH.md`. Agent prompts + schemas: `ROLES.md`. Report, TUI, capture: `REPORT.md`.
|
|
88
|
+
|
|
89
|
+
0. **FRAME** (main loop) — parse per detection order; import the attached
|
|
90
|
+
Observe evidence ledger first; issue one Runtime query only when that seed
|
|
91
|
+
is absent or leaves a named coverage gap; estimate N from the resulting
|
|
92
|
+
candidates; decompose into 2-4 sub-questions and print the plan line.
|
|
93
|
+
1. **SEED** (2 scouts, parallel) — build the initial frontier (≤12 docs): search probes, frontmatter/index greps, prior-research compounding (`RESEARCH.md` §Compounding), one graph orientation query (connected only). Scout #1 holds the run's single best-available-tier search probe; scout #2 is `--fast`-only.
|
|
94
|
+
2. **HOP WAVES** (2-4 readers per wave, loop) — readers read their assigned files in their own contexts and return claims-with-verbatim-excerpts + typed leads. Main loop merges into the ledger (assigning stable claim/gap ids), dedupes, scores, resolves top leads to files, probes uncovered sub-questions (`RESEARCH.md` §Gaps), checks saturation, schedules next wave or stops.
|
|
95
|
+
3. **PATTERN** (2 analysts, de-correlated) — convergence lens and tension lens over the id-carrying claims table; the tension analyst never sees convergence output. Disagreement between analysts is preserved as a finding, never averaged.
|
|
96
|
+
4. **VERIFY** (1-2 skeptics) — mechanical excerpt check (kill on fabrication), semantic support check (downgrade on overreach), adversarial gap re-search (a found doc refutes the gap and enters the ledger), decay probe on evidence older than ~90 days. A refuted gap may reopen ONE bonus wave; bonus-wave claims get a scoped second skeptic pass (`RESEARCH.md` §Saturation). The kill count is reported.
|
|
97
|
+
5. **SYNTHESIZE** (main loop) — prune patterns whose support died (`REPORT.md` §Pattern pruning); stance, not summary: 2-4 paragraphs that tell the user something they don't already know. Confidence is derived from evidence structure, never self-reported. Insufficiency map assembled from surviving gap claims. Register: analyst, not critic — "the memory shows X", never "the team is failing to Y".
|
|
98
|
+
6. **PRESENT** (main loop) — answer → findings (◆/◇ with inline path citations) → tensions & disagreements → what memory doesn't hold → provenance footer. The evidence appendix goes in the report file, NOT chat. No TUI box yet.
|
|
99
|
+
7. **CAPTURE?** (main loop) — one AskUserQuestion: **Save** (default) / **Edit first** / **File follow-ups** (gaps → `/quest` or `/harvest` stubs) / **Skip**. Writeback per `REPORT.md`, then render the ◈ TUI box reflecting the ACTUAL outcome. Skip leaves only the local ledger — no memory writes, no graph writes.
|
|
100
|
+
|
|
101
|
+
## Telemetry
|
|
102
|
+
|
|
103
|
+
Fire-and-forget after the run completes or exits early (single emit — not at frame):
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
bash bin/telemetry.sh emit "command" '{"command":"deep-reflect","mode":"question","waves":3,"docs_read":24,"stop_reason":"saturated","duration_ms":210000}' 2>/dev/null &
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
All extended fields optional; never include the question text or file paths.
|
|
110
|
+
|
|
111
|
+
## Edge cases
|
|
112
|
+
|
|
113
|
+
| Scenario | Handling |
|
|
114
|
+
|---|---|
|
|
115
|
+
| Topic-sparse probe (<~20 relevant docs) | Collapse to 1 scout + 1 wave + inline synthesis; announce "memory is thin here"; ship an insufficiency-forward report — sparse IS a finding |
|
|
116
|
+
| Ultra-sparse (<~5 relevant docs) | Say so; offer `/reflect` (capture what you know) or `/harvest` (ask people) instead of faking research |
|
|
117
|
+
| `search.sh` errors, warns `index update FAILED`, or returns zero blocks while grep/`artifacts.sh` find hits | Fall back to the grep-based corpus probe before classifying the corpus as sparse; note "recall degraded" in the plan line |
|
|
118
|
+
| Workflow tool unavailable | Foreground parallel Task fan-out per §Orchestration |
|
|
119
|
+
| Hybrid search models not on disk | `--fast` everywhere; zero inline downloads |
|
|
120
|
+
| Graph down (connected) | One-line note, local-shaped plan, non-fatal calls |
|
|
121
|
+
| Reader/analyst fails mid-wave | Log to provenance, continue partial; both analysts fail → main loop synthesizes from the verified claims table at capped confidence |
|
|
122
|
+
| Skeptic fails | Rerun once; else every unchecked claim ships marked `unverified` in the report and say so — never skip verification silently |
|
|
123
|
+
| No findings survive | "Memory holds nothing structural on this" is a valid report. Don't manufacture significance |
|
|
124
|
+
| Memory symlink missing | Error: "Run /setup first" |
|
|
125
|
+
| File collision on save | Append 4-char hex to slug |
|
|
126
|
+
| User skips capture | Ledger remains at `.egregore/research-runs/` — nothing else is written |
|
|
127
|
+
|
|
128
|
+
## Example
|
|
129
|
+
|
|
130
|
+
```
|
|
131
|
+
> /deep-reflect what do we actually know about onboarding drop-off?
|
|
132
|
+
|
|
133
|
+
Researching: onboarding drop-off · ~34 relevant docs · budget 3 waves · est ~4 min
|
|
134
|
+
[wave 1/3] read 10 · claims 8 · new leads 9 (3 files, 2 quests, 1 person)
|
|
135
|
+
[wave 2/3] read 9 · claims 6 · new leads 4 (2 files, 1 session)
|
|
136
|
+
[wave 3/3] skipped — saturated (novelty 0.18, all sub-questions covered)
|
|
137
|
+
Verifying 14 claims + 3 gaps… 1 claim cut (miscite) · 1 gap refuted (doc found → read)
|
|
138
|
+
|
|
139
|
+
[ANSWER — 3 paragraphs of stance]
|
|
140
|
+
[FINDINGS — ◆ primary / ◇ secondary with path citations]
|
|
141
|
+
[TENSIONS — including one analyst disagreement, preserved]
|
|
142
|
+
[WHAT MEMORY DOESN'T HOLD — 2 verified gaps + the probes that prove them]
|
|
143
|
+
3 waves · 20 docs read · 11 cited · 1 claim cut in verification · stopped: saturated
|
|
144
|
+
|
|
145
|
+
[AskUserQuestion: Save (default) / Edit first / File follow-ups / Skip]
|
|
146
|
+
> Save
|
|
147
|
+
|
|
148
|
+
[1/3] ✓ Writing knowledge/research/2026-07-11-cem-onboarding-drop-off.md
|
|
149
|
+
[2/3] ✓ Indexed in knowledge graph (4 edges)
|
|
150
|
+
[3/3] ✓ Auto-saved
|
|
151
|
+
|
|
152
|
+
┌──────────────────────────────────────────────────────────────────────┐
|
|
153
|
+
│ ◈ DEEP REFLECT cem · Jul 11 │
|
|
154
|
+
├──────────────────────────────────────────────────────────────────────┤
|
|
155
|
+
│ │
|
|
156
|
+
│ Q: what do we know about onboarding drop-off? │
|
|
157
|
+
│ ◆ 3 primary · ◇ 4 secondary findings · confidence: high │
|
|
158
|
+
│ 3 waves · 20 docs read · 11 cited · 1 claim cut in verification │
|
|
159
|
+
│ │
|
|
160
|
+
├──────────────────────────────────────────────────────────────────────┤
|
|
161
|
+
│ ✓ Saved · graphed · pushed │
|
|
162
|
+
│ Visible in /activity. │
|
|
163
|
+
└──────────────────────────────────────────────────────────────────────┘
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
## Backwards compatibility
|
|
167
|
+
|
|
168
|
+
- Report artifacts use `type: research` and land in `memory/knowledge/research/` (established by the Mar 7 redesign; `findings/` remains `/reflect`'s lane).
|
|
169
|
+
- Prior v2 `RELATES_TO`/`TENSION_WITH` edges are read as hop rails and extended (cross-ref mode, verified claims only). Old edges keep working.
|
|
170
|
+
- The v2 invocation phrases all still route here; `quick|focused|deep` keyword syntax is retired in favor of `--brief`/`--deep` + dynamic default.
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: delete-user
|
|
3
|
+
description: "Remove a member from this Egregore, revoking access across GitHub, Supabase, and Neo4j. Use for /delete-user, removing or kicking someone — not inviting (/invite) or viewing members (/dashboard)."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Remove a member from this Egregore. Revokes access across GitHub, Supabase, and Neo4j.
|
|
7
|
+
|
|
8
|
+
## When to invoke
|
|
9
|
+
|
|
10
|
+
User says: "remove user", "delete user", "kick", "revoke access", "remove member", "remove them", "delete member"
|
|
11
|
+
Not this: invite someone → `/invite` · view members → `/dashboard`
|
|
12
|
+
|
|
13
|
+
Arguments: $ARGUMENTS (Required: GitHub username of the person to remove)
|
|
14
|
+
|
|
15
|
+
## Execution rules
|
|
16
|
+
|
|
17
|
+
**CRITICAL: Suppress raw output.** Never show raw JSON to the user. All API calls MUST capture output in a variable and only show formatted status lines.
|
|
18
|
+
|
|
19
|
+
**CRITICAL: Never expose credentials in tool output.**
|
|
20
|
+
- Never read tokens in a separate bash call — always inline.
|
|
21
|
+
- All credential handling happens inside a single bash call that only outputs the formatted result.
|
|
22
|
+
|
|
23
|
+
## Step 1: Validate
|
|
24
|
+
|
|
25
|
+
If `$ARGUMENTS` is empty, show usage and stop:
|
|
26
|
+
```
|
|
27
|
+
Usage: /delete-user <github-username>
|
|
28
|
+
|
|
29
|
+
Example: /delete-user someuser
|
|
30
|
+
|
|
31
|
+
Modes (you'll be asked):
|
|
32
|
+
revoke — Remove access, keep their contributions
|
|
33
|
+
full — Remove access and erase their data
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## Step 2: Confirm
|
|
37
|
+
|
|
38
|
+
Ask the user to confirm via AskUserQuestion:
|
|
39
|
+
|
|
40
|
+
```
|
|
41
|
+
question: "How should {username} be removed from this org?"
|
|
42
|
+
header: "Remove mode"
|
|
43
|
+
options:
|
|
44
|
+
- label: "Revoke access"
|
|
45
|
+
description: "Remove GitHub + Supabase access. Keep their sessions, artifacts, and contributions in the knowledge graph."
|
|
46
|
+
- label: "Full delete"
|
|
47
|
+
description: "Revoke access AND erase their sessions, profile, todos, and telemetry. Artifacts and quests are kept but orphaned."
|
|
48
|
+
- label: "Cancel"
|
|
49
|
+
description: "Don't remove anyone."
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
If "Cancel", stop with: `Cancelled.`
|
|
53
|
+
|
|
54
|
+
Map "Revoke access" → `mode=revoke`, "Full delete" → `mode=full`.
|
|
55
|
+
|
|
56
|
+
## Step 3: Remove (single call — credentials stay hidden)
|
|
57
|
+
|
|
58
|
+
Run ONE bash call with description "Removing {username} from org":
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
bash -c '
|
|
62
|
+
USERNAME="$1"
|
|
63
|
+
MODE="$2"
|
|
64
|
+
TOKEN=$(grep "^GITHUB_TOKEN=" .env | cut -d"=" -f2-)
|
|
65
|
+
API_URL=$(jq -r ".api_url" egregore.json)
|
|
66
|
+
SLUG=$(jq -r ".slug // .org_name" egregore.json)
|
|
67
|
+
|
|
68
|
+
if [ -z "$TOKEN" ]; then
|
|
69
|
+
echo "ERROR: No GitHub token found. Run: bash bin/github-auth.sh"
|
|
70
|
+
exit 1
|
|
71
|
+
fi
|
|
72
|
+
|
|
73
|
+
RESP=$(curl -s -X DELETE "$API_URL/api/org/$SLUG/members/$USERNAME?mode=$MODE" \
|
|
74
|
+
-H "Content-Type: application/json" \
|
|
75
|
+
-H "Authorization: Bearer $TOKEN")
|
|
76
|
+
|
|
77
|
+
echo "$RESP" | jq -c "{
|
|
78
|
+
ok: (if .status == \"removed\" then true else false end),
|
|
79
|
+
status: .status,
|
|
80
|
+
mode: .mode,
|
|
81
|
+
username: .username,
|
|
82
|
+
actions: .actions,
|
|
83
|
+
errors: .errors,
|
|
84
|
+
error: .detail
|
|
85
|
+
}"
|
|
86
|
+
' -- "$ARGUMENTS" "MODE"
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
Replace `MODE` with the actual mode value (`revoke` or `full`).
|
|
90
|
+
|
|
91
|
+
## Step 4: Display result
|
|
92
|
+
|
|
93
|
+
Parse the JSON output from Step 3. **Never show raw JSON to the user.**
|
|
94
|
+
|
|
95
|
+
**Success** (ok=true, mode=revoke):
|
|
96
|
+
```
|
|
97
|
+
Removing {username} from {org_name}...
|
|
98
|
+
|
|
99
|
+
GitHub access: revoked
|
|
100
|
+
Membership: deactivated
|
|
101
|
+
Knowledge graph: marked as removed
|
|
102
|
+
|
|
103
|
+
{username} can no longer access this Egregore.
|
|
104
|
+
Their contributions are preserved in the graph.
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
**Success** (ok=true, mode=full):
|
|
108
|
+
```
|
|
109
|
+
Removing {username} from {org_name}...
|
|
110
|
+
|
|
111
|
+
GitHub access: revoked
|
|
112
|
+
Membership: deactivated
|
|
113
|
+
Sessions: deleted
|
|
114
|
+
Contributions: orphaned (artifacts kept)
|
|
115
|
+
Person node: deleted
|
|
116
|
+
Telemetry: deleted
|
|
117
|
+
|
|
118
|
+
{username} has been fully removed from this Egregore.
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
If `errors` array is non-empty, append:
|
|
122
|
+
```
|
|
123
|
+
Partial failures (non-fatal):
|
|
124
|
+
- {error1}
|
|
125
|
+
- {error2}
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
**Auth error** (ok=false):
|
|
129
|
+
```
|
|
130
|
+
Cannot remove {username}: {error}
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
Common errors:
|
|
134
|
+
- "Only org admins or platform admins can remove members" → you need admin role
|
|
135
|
+
- "Cannot remove an admin. Change their role first." → target is an admin
|
|
136
|
+
- "No active membership found" → user isn't a member or already removed
|
|
137
|
+
|
|
138
|
+
## Step 5: Telemetry (fire-and-forget)
|
|
139
|
+
|
|
140
|
+
```bash
|
|
141
|
+
bash bin/telemetry.sh emit "command" '{"command":"delete-user"}' 2>/dev/null &
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
## Rules
|
|
145
|
+
|
|
146
|
+
- **Only org admins or platform admins can remove members** — the API verifies this
|
|
147
|
+
- **Cannot remove admins** — they must be demoted first (future feature)
|
|
148
|
+
- **Cannot remove yourself**
|
|
149
|
+
- **GitHub removal is best-effort** — if the caller's token lacks repo admin scope, GitHub removal may fail but Supabase/Neo4j cleanup still proceeds
|
|
150
|
+
- **Never expose tokens** — all credential reads happen inside bash scripts
|