create-egregore 0.20.0 → 0.20.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 (160) hide show
  1. package/assets/egregore-launcher.js +80 -15
  2. package/lib/local.js +4 -20
  3. package/lib/setup.js +21 -4
  4. package/package.json +2 -2
  5. package/runtime/codex/.codex/config.toml +3 -0
  6. package/runtime/codex/.codex/skills/archive/SKILL.md +1 -1
  7. package/runtime/codex/.codex/skills/branch/SKILL.md +1 -1
  8. package/runtime/codex/.codex/skills/checkup/SKILL.md +1 -1
  9. package/runtime/codex/.codex/skills/commit/SKILL.md +1 -1
  10. package/runtime/codex/.codex/skills/contribute/SKILL.md +1 -1
  11. package/runtime/codex/.codex/skills/delete-user/SKILL.md +1 -1
  12. package/runtime/codex/.codex/skills/ingest/SKILL.md +1 -1
  13. package/runtime/codex/.codex/skills/ingest-corpus/SKILL.md +29 -0
  14. package/runtime/codex/.codex/skills/ingest-notion/SKILL.md +1 -1
  15. package/runtime/codex/.codex/skills/ingest-user-interview/SKILL.md +1 -1
  16. package/runtime/codex/.codex/skills/issue/SKILL.md +1 -1
  17. package/runtime/codex/.codex/skills/me/SKILL.md +1 -1
  18. package/runtime/codex/.codex/skills/meeting/SKILL.md +1 -1
  19. package/runtime/codex/.codex/skills/note/SKILL.md +1 -1
  20. package/runtime/codex/.codex/skills/notion-connect/SKILL.md +1 -1
  21. package/runtime/codex/.codex/skills/onboarding/SKILL.md +1 -1
  22. package/runtime/codex/.codex/skills/pr/SKILL.md +1 -1
  23. package/runtime/codex/.codex/skills/pull/SKILL.md +1 -1
  24. package/runtime/codex/.codex/skills/push/SKILL.md +1 -1
  25. package/runtime/codex/.codex/skills/reflect/SKILL.md +1 -1
  26. package/runtime/codex/.codex/skills/review-pr/SKILL.md +1 -1
  27. package/runtime/codex/.codex/skills/save/SKILL.md +3 -1
  28. package/runtime/codex/.codex/skills/slack-connect/SKILL.md +1 -1
  29. package/runtime/codex/.codex/skills/summon/SKILL.md +1 -1
  30. package/runtime/codex/.codex/skills/sync-repos/SKILL.md +1 -1
  31. package/runtime/codex/.codex/skills/teams-connect/SKILL.md +1 -1
  32. package/runtime/codex/.codex/skills/telegram-connect/SKILL.md +1 -1
  33. package/runtime/codex/.codex/skills/telemetry/SKILL.md +1 -1
  34. package/runtime/codex/.codex/skills/test/SKILL.md +1 -1
  35. package/runtime/codex/.codex/skills/tutorial/SKILL.md +1 -1
  36. package/runtime/codex/.codex/skills/update/SKILL.md +1 -1
  37. package/runtime/codex/.codex/spec-manifest.json +4 -4
  38. package/runtime/codex/AGENTS.md +52 -39
  39. package/runtime/codex/bin/agent.sh +32 -8
  40. package/runtime/codex/bin/codex-render-spec.mjs +31 -34
  41. package/runtime/codex/bin/codex-sync-skills.sh +6 -1
  42. package/runtime/codex/bin/contribute-guard.sh +79 -0
  43. package/runtime/codex/bin/handoff-pr-backfill.sh +1 -1
  44. package/runtime/codex/bin/handoff-run.sh +8 -3
  45. package/runtime/codex/bin/handoff-save-egregore.sh +20 -8
  46. package/runtime/codex/bin/ingest.py +260 -5
  47. package/runtime/codex/bin/lib/git-message.sh +37 -0
  48. package/runtime/codex/bin/lib/git-sync.sh +26 -2
  49. package/runtime/codex/bin/lib/greeting.sh +2 -2
  50. package/runtime/codex/bin/search.sh +46 -4
  51. package/runtime/codex/bin/session-autosave.sh +13 -2
  52. package/runtime/codex/bin/settings.sh +63 -4
  53. package/runtime/codex/bin/worktree-create.sh +4 -1
  54. package/runtime/codex/manifest.json +5 -1
  55. package/runtime/pi/.codex/config.toml +3 -0
  56. package/runtime/pi/.codex/skills/archive/SKILL.md +1 -1
  57. package/runtime/pi/.codex/skills/branch/SKILL.md +1 -1
  58. package/runtime/pi/.codex/skills/checkup/SKILL.md +1 -1
  59. package/runtime/pi/.codex/skills/commit/SKILL.md +1 -1
  60. package/runtime/pi/.codex/skills/contribute/SKILL.md +1 -1
  61. package/runtime/pi/.codex/skills/delete-user/SKILL.md +1 -1
  62. package/runtime/pi/.codex/skills/ingest/SKILL.md +1 -1
  63. package/runtime/pi/.codex/skills/ingest-corpus/SKILL.md +29 -0
  64. package/runtime/pi/.codex/skills/ingest-notion/SKILL.md +1 -1
  65. package/runtime/pi/.codex/skills/ingest-user-interview/SKILL.md +1 -1
  66. package/runtime/pi/.codex/skills/issue/SKILL.md +1 -1
  67. package/runtime/pi/.codex/skills/me/SKILL.md +1 -1
  68. package/runtime/pi/.codex/skills/meeting/SKILL.md +1 -1
  69. package/runtime/pi/.codex/skills/note/SKILL.md +1 -1
  70. package/runtime/pi/.codex/skills/notion-connect/SKILL.md +1 -1
  71. package/runtime/pi/.codex/skills/onboarding/SKILL.md +1 -1
  72. package/runtime/pi/.codex/skills/pr/SKILL.md +1 -1
  73. package/runtime/pi/.codex/skills/pull/SKILL.md +1 -1
  74. package/runtime/pi/.codex/skills/push/SKILL.md +1 -1
  75. package/runtime/pi/.codex/skills/reflect/SKILL.md +1 -1
  76. package/runtime/pi/.codex/skills/review-pr/SKILL.md +1 -1
  77. package/runtime/pi/.codex/skills/save/SKILL.md +3 -1
  78. package/runtime/pi/.codex/skills/slack-connect/SKILL.md +1 -1
  79. package/runtime/pi/.codex/skills/summon/SKILL.md +1 -1
  80. package/runtime/pi/.codex/skills/sync-repos/SKILL.md +1 -1
  81. package/runtime/pi/.codex/skills/teams-connect/SKILL.md +1 -1
  82. package/runtime/pi/.codex/skills/telegram-connect/SKILL.md +1 -1
  83. package/runtime/pi/.codex/skills/telemetry/SKILL.md +1 -1
  84. package/runtime/pi/.codex/skills/test/SKILL.md +1 -1
  85. package/runtime/pi/.codex/skills/tutorial/SKILL.md +1 -1
  86. package/runtime/pi/.codex/skills/update/SKILL.md +1 -1
  87. package/runtime/pi/.codex/spec-manifest.json +4 -4
  88. package/runtime/pi/.pi/APPEND_SYSTEM.md +76 -39
  89. package/runtime/pi/.pi/spec-manifest.json +2 -2
  90. package/runtime/pi/AGENTS.md +52 -39
  91. package/runtime/pi/bin/agent.sh +32 -8
  92. package/runtime/pi/bin/codex-render-spec.mjs +31 -34
  93. package/runtime/pi/bin/codex-sync-skills.sh +6 -1
  94. package/runtime/pi/bin/contribute-guard.sh +79 -0
  95. package/runtime/pi/bin/handoff-pr-backfill.sh +1 -1
  96. package/runtime/pi/bin/handoff-run.sh +8 -3
  97. package/runtime/pi/bin/handoff-save-egregore.sh +20 -8
  98. package/runtime/pi/bin/ingest.py +260 -5
  99. package/runtime/pi/bin/lib/git-message.sh +37 -0
  100. package/runtime/pi/bin/lib/git-sync.sh +26 -2
  101. package/runtime/pi/bin/lib/greeting.sh +2 -2
  102. package/runtime/pi/bin/pi-render-spec.mjs +52 -26
  103. package/runtime/pi/bin/search.sh +46 -4
  104. package/runtime/pi/bin/session-autosave.sh +13 -2
  105. package/runtime/pi/bin/settings.sh +63 -4
  106. package/runtime/pi/bin/worktree-create.sh +4 -1
  107. package/runtime/pi/manifest.json +5 -1
  108. package/runtime/prime/.codex/config.toml +3 -0
  109. package/runtime/prime/.codex/skills/archive/SKILL.md +1 -1
  110. package/runtime/prime/.codex/skills/branch/SKILL.md +1 -1
  111. package/runtime/prime/.codex/skills/checkup/SKILL.md +1 -1
  112. package/runtime/prime/.codex/skills/commit/SKILL.md +1 -1
  113. package/runtime/prime/.codex/skills/contribute/SKILL.md +1 -1
  114. package/runtime/prime/.codex/skills/delete-user/SKILL.md +1 -1
  115. package/runtime/prime/.codex/skills/ingest/SKILL.md +1 -1
  116. package/runtime/prime/.codex/skills/ingest-corpus/SKILL.md +29 -0
  117. package/runtime/prime/.codex/skills/ingest-notion/SKILL.md +1 -1
  118. package/runtime/prime/.codex/skills/ingest-user-interview/SKILL.md +1 -1
  119. package/runtime/prime/.codex/skills/issue/SKILL.md +1 -1
  120. package/runtime/prime/.codex/skills/me/SKILL.md +1 -1
  121. package/runtime/prime/.codex/skills/meeting/SKILL.md +1 -1
  122. package/runtime/prime/.codex/skills/note/SKILL.md +1 -1
  123. package/runtime/prime/.codex/skills/notion-connect/SKILL.md +1 -1
  124. package/runtime/prime/.codex/skills/onboarding/SKILL.md +1 -1
  125. package/runtime/prime/.codex/skills/pr/SKILL.md +1 -1
  126. package/runtime/prime/.codex/skills/pull/SKILL.md +1 -1
  127. package/runtime/prime/.codex/skills/push/SKILL.md +1 -1
  128. package/runtime/prime/.codex/skills/reflect/SKILL.md +1 -1
  129. package/runtime/prime/.codex/skills/review-pr/SKILL.md +1 -1
  130. package/runtime/prime/.codex/skills/save/SKILL.md +3 -1
  131. package/runtime/prime/.codex/skills/slack-connect/SKILL.md +1 -1
  132. package/runtime/prime/.codex/skills/summon/SKILL.md +1 -1
  133. package/runtime/prime/.codex/skills/sync-repos/SKILL.md +1 -1
  134. package/runtime/prime/.codex/skills/teams-connect/SKILL.md +1 -1
  135. package/runtime/prime/.codex/skills/telegram-connect/SKILL.md +1 -1
  136. package/runtime/prime/.codex/skills/telemetry/SKILL.md +1 -1
  137. package/runtime/prime/.codex/skills/test/SKILL.md +1 -1
  138. package/runtime/prime/.codex/skills/tutorial/SKILL.md +1 -1
  139. package/runtime/prime/.codex/skills/update/SKILL.md +1 -1
  140. package/runtime/prime/.codex/spec-manifest.json +4 -4
  141. package/runtime/prime/.prime/agent/APPEND_SYSTEM.md +77 -40
  142. package/runtime/prime/.prime/agent/spec-manifest.json +2 -2
  143. package/runtime/prime/AGENTS.md +52 -39
  144. package/runtime/prime/bin/agent.sh +32 -8
  145. package/runtime/prime/bin/codex-render-spec.mjs +31 -34
  146. package/runtime/prime/bin/codex-sync-skills.sh +6 -1
  147. package/runtime/prime/bin/contribute-guard.sh +79 -0
  148. package/runtime/prime/bin/handoff-pr-backfill.sh +1 -1
  149. package/runtime/prime/bin/handoff-run.sh +8 -3
  150. package/runtime/prime/bin/handoff-save-egregore.sh +20 -8
  151. package/runtime/prime/bin/ingest.py +260 -5
  152. package/runtime/prime/bin/lib/git-message.sh +37 -0
  153. package/runtime/prime/bin/lib/git-sync.sh +26 -2
  154. package/runtime/prime/bin/lib/greeting.sh +2 -2
  155. package/runtime/prime/bin/prime-render-spec.mjs +52 -28
  156. package/runtime/prime/bin/search.sh +46 -4
  157. package/runtime/prime/bin/session-autosave.sh +13 -2
  158. package/runtime/prime/bin/settings.sh +63 -4
  159. package/runtime/prime/bin/worktree-create.sh +4 -1
  160. package/runtime/prime/manifest.json +5 -1
@@ -14,11 +14,20 @@ Your subagent mechanism (`rlm(...)`) spawns Prime Agent child sessions, not Egre
14
14
 
15
15
  ## Identity & Upstream
16
16
 
17
- This is an Egregore instance — a downstream fork of the upstream framework at `egregore-labs/egregore`. The framework (`bin/`, `.claude/skills/`, `.claude/hooks/`, `.claude/context/`, `.claude/agents/`, `.pi/`, `loom/`, `CLAUDE.md`, `skills/`) is synced from upstream on every session start and via `/update`. It is not authored in this repo.
17
+ Framework direction comes only from `egregore.json.upstream_url`:
18
+
19
+ - **Source** — literal `"none"`: framework changes are authored here.
20
+ `/update` and `/contribute` stop; use `/save`. Public OSS is downstream and
21
+ receives changes only through this repository's release flow.
22
+ - **Downstream** — a repository URL, or an absent key defaulting to
23
+ `egregore-labs/egregore`: framework paths are synced and not authored here.
24
+
25
+ Never infer direction from a repository name or Git remote.
18
26
 
19
27
  **Where changes belong:**
20
- - **Framework is outdated or a skill is missing:** run `/update` first. It pulls the latest from upstream.
21
- - **Framework behavior needs changing or has a bug:** `/contribute` opens a PR against `egregore-labs/egregore`, or file a GitHub issue on that repo. Never patch framework files locally to "just fix it here" — the next `/update` will overwrite your edits and other instances won't get the fix.
28
+ - **Downstream framework is stale:** run `/update`.
29
+ - **Downstream framework needs a fix:** use `/contribute` or file an upstream issue; local patches are overwritten by `/update`.
30
+ - **Source framework needs a fix:** use `/save` into its configured integration and release flow; never `/contribute`.
22
31
  - **Org-level work** (memory, org-specific knowledge, managed repos, `egregore.json`): `/save` to this repo.
23
32
 
24
33
  When a user reports broken or missing framework behavior, the first question is "when did you last `/update`?"
@@ -53,37 +62,34 @@ The project-local Prime Agent extension renders the Egregore startup card (ident
53
62
 
54
63
  **Mandatory behavioral rule.** When the user describes work, your **first action** — before reading files, exploring code, or anything else — is to get onto a working branch:
55
64
 
56
- The integration branch is `develop` by default. When top-level
57
- `egregore.json.base_branch` is set, that configured branch replaces
58
- `develop` as the branch point, rebase target, PR base, and protected
59
- integration branch.
65
+ The integration branch is `develop` unless top-level `egregore.json.base_branch` sets another; the configured branch is then the branch point, rebase target, PR base, and protected branch everywhere below.
60
66
 
61
67
  1. Derive a topic slug from what the user said (kebab-case, 2–4 words)
62
68
  2. Run `bin/agent.sh branch --topic "<topic>"` — it resolves the configured base and creates a work branch from `origin/{base}` in a task worktree (`dev/{author}/{slug}`, or `feature/{slug}` / `bugfix/{slug}` when the topic reads as a feature or fix). Continue all file work from the printed path.
63
- 3. Give a value-first workspace receipt. Do not lead with Git terminology:
64
-
65
- `Your stable project is protected. I’m working in a separate workspace for **{topic}**, where changes stay isolated, reviewable, and reversible.`
66
-
67
- Then expose the implementation as secondary detail:
68
-
69
- `Workspace: {branch} (worktree).`
69
+ 3. Give a value-first workspace receipt — do not lead with Git terminology: `Your stable project is protected. I’m working in a separate workspace for **{topic}**, where changes stay isolated, reviewable, and reversible.` Then, as secondary detail: `Workspace: {branch} (worktree).`
70
70
 
71
71
  **Fallback:** If `bin/agent.sh branch` fails, resolve `{base}` with
72
72
  `_get_base_branch`, then use
73
- `git checkout -b dev/{author}/{slug} origin/{base}`.
73
+ `git checkout --no-track -b dev/{author}/{slug} origin/{base}`.
74
74
 
75
75
  4. Update graph (fire-and-forget): `bash bin/graph-op.sh set-topic "$(cat .egregore-session-id 2>/dev/null)" "topic from slug" "dev/author/slug" 2>/dev/null &`
76
76
 
77
77
  ### Starting-work UX contract
78
78
 
79
- Before execution begins, make Egregore's useful structure legible without turning every task start into a tutorial:
79
+ Sequence: **intent → safe workspace → relevant context → consequential assumptions → execution**. Make Egregore's structure legible without turning task starts into a tutorial; keep technical identifiers secondary to user value.
80
+
81
+ - **Workspace** — the value-first receipt above, only for a new workspace or topic pivot; do not repeat it on the same branch.
82
+ - **Context** — when organizational retrieval materially informs the work, keep the required Egregore Retrieval Beat plus one compact receipt: `↳ Context restored: {decision, handoff, or prior work} · {source/date}`. Never claim context was restored when retrieval found nothing useful.
83
+ - **Assumptions** — surface only consequential ones: `Assumption: {assumption} — based on {evidence}.` Add a correction path when cheap; do not narrate obvious operational choices.
84
+ - **Transition** — state the outcome you are starting toward in one short sentence and begin.
80
85
 
81
- - **Workspace** — use the value-first receipt above for a newly created workspace or topic pivot. If already on the appropriate working branch, do not repeat it.
82
- - **Context** — when organizational retrieval materially informs the work, keep the required Egregore Retrieval Beat and then add one compact result receipt: `↳ Context restored: {decision, handoff, or prior work} · {source/date}`. Never claim context was restored when retrieval found nothing useful.
83
- - **Assumptions** — surface only consequential assumptions that could change the implementation. Use `Assumption: {assumption} — based on {evidence}.` Add a correction path when cheap; do not narrate obvious operational choices.
84
- - **Transition** — once workspace, context, and assumptions are settled, state the outcome you are starting toward in one short sentence and begin.
86
+ ### Returning-work UX contract
85
87
 
86
- The intended sequence is: **intent → safe workspace → relevant context → consequential assumptions → execution**. Keep technical identifiers available but subordinate them to user value.
88
+ When the user continues the current branch's work or asks to resume — sequence: **continuation intent → prior workspace → restored context → open threads → resumed execution**:
89
+
90
+ - Do not create a new workspace for the same topic. After confirming relevance, say: `I found your previous work on **{topic}** and restored its workspace and context.` Show `Workspace: {branch} (worktree).` secondarily.
91
+ - Retrieve relevant decisions, handoffs, or prior work; keep the Retrieval Beat and `↳ Context restored:` receipt. Never claim context was restored from a branch name alone.
92
+ - Name only unresolved items that could change the next move, state the next outcome briefly, and continue without replaying setup.
87
93
 
88
94
  ### Handoff claiming
89
95
 
@@ -92,7 +98,7 @@ If `addressed_to_user` handoffs exist and the user is picking one up, create the
92
98
  bash bin/graph-op.sh claim-handoff "$SESSION_ID" "$HANDOFF_SESSION_ID" 2>/dev/null &
93
99
  ```
94
100
 
95
- **Auto-checkout repos from handoff**: After claiming, check the `addressed_rich` context for `repoState`. If the handoff includes repo state (non-empty `repoState` array), check out the handoff's branches in each managed repo:
101
+ **Auto-checkout repos from handoff**: after claiming, if `addressed_rich` carries a non-empty `repoState`, check out each entry's branch in its managed repo:
96
102
 
97
103
  ```bash
98
104
  PARENT_DIR="$(cd .. && pwd)"
@@ -105,21 +111,19 @@ if [ -d "$REPO_DIR/.git" ] || [ -f "$REPO_DIR/.git" ]; then
105
111
  fi
106
112
  ```
107
113
 
108
- Report results: `✓ Checked out {branch} in {repo1}, {repo2}`. If a branch no longer exists (PR was merged): `◐ {repo}: PR #{N} merged — on {base}`. If `repoState` is absent or empty, skip auto-checkout silently.
114
+ Report `✓ Checked out {branch} in {repo1}, {repo2}`; for a merged-away branch, `◐ {repo}: PR #{N} merged — on {base}`. If `repoState` is absent or empty, skip silently.
109
115
 
110
- **Exceptions** — skip branching when:
111
- - The user explicitly created or named a branch themselves
112
- - Already on a working branch AND the user's intent continues the current branch's topic
116
+ **Exceptions** — skip branching when the user explicitly created or named a branch themselves, or the intent continues the current working branch's topic.
113
117
 
114
- **Topic pivot while on a working branch:** If the user describes work **unrelated** to the current branch's topic, treat it as a new topic and create a new branch (`bin/agent.sh branch --topic "<new topic>"`). Do NOT mix unrelated work on one branch.
118
+ **Topic pivot:** work **unrelated** to the current branch's topic gets a new branch (`bin/agent.sh branch --topic "<new topic>"`). Do NOT mix unrelated work on one branch.
115
119
 
116
120
  If still on the configured base branch after two messages, create a branch immediately from whatever context you have.
117
121
 
118
122
  ### Branch-guard protocol
119
123
 
120
- The `.prime/agent/extensions/egregore.ts` `tool_call` gate (loaded from the project-local extension) protects project writes on the configured base branch as well as `develop`/`main`/`master`. Its block message is operational guidance, not a reason to interrupt the user with routine Git choices:
124
+ The `.prime/agent/extensions/egregore.ts` `tool_call` gate (loaded from the project-local extension) protects project writes on the configured base plus `develop`/`main`/`master`. Its block message is operational guidance — do not interrupt the user with routine Git choices:
121
125
 
122
- - **Topic is clear** (the user said "fix X", "add Y feature") → run `bin/agent.sh branch --topic "<topic>"` automatically, continue in the printed worktree, and say one short sentence so the branch change is visible. Do not ask the user to approve routine branching.
126
+ - **Topic is clear** → run `bin/agent.sh branch --topic "<topic>"` automatically, continue in the printed worktree, and say one short sentence so the change is visible — never ask approval for routine branching.
123
127
  - **Topic is genuinely ambiguous** → ask only for the topic, using compact numbered options:
124
128
 
125
129
  ```text
@@ -132,9 +136,11 @@ The `.prime/agent/extensions/egregore.ts` `tool_call` gate (loaded from the proj
132
136
  Wait for the reply, then branch.
133
137
  - **The user explicitly requested the protected branch** → that request is consent. Record it with `echo '{branch}' > .egregore-branch-consent`, then retry. Never create the marker merely to silence the hook.
134
138
 
135
- Memory, managed-repo, and runtime-state writes should bypass the project guard. If one triggers it, correct the operation target/context instead of asking for protected-branch consent.
139
+ If Prime Agent project extensions are disabled, keep the same rule.
136
140
 
137
- If Prime Agent project extensions are disabled, follow the same discipline as a standing instruction: never write or commit on the configured base, develop, main, or master.
141
+ **History:** Do not merge, cherry-pick, or rebase another task merely to read
142
+ it; use `gh pr view/diff`, `git show`, or a temporary worktree. Integrate
143
+ only for dependencies. Deletion needs no rewrite unless purging secrets.
138
144
 
139
145
  ### Onboarding exception
140
146
 
@@ -270,7 +276,7 @@ Always use HTTPS for git operations — `github-auth.sh` handles credential stor
270
276
 
271
277
  ## Loom Routing
272
278
 
273
- Loom routes commands across model tiers on the Claude Code runtime (`loom/routes.json` + `bin/loom.sh` + a model-pinned executor subagent). Prime Agent has no built-in subagent delegation — every command runs inline in the current session. Ignore "Loom routing" preambles if you encounter them in a skill spec, and skip `bin/loom.sh` calls; `loom/` and `.claude/agents/` are framework files synced for the Claude runtime.
279
+ Loom routes commands across model tiers on the Claude Code runtime (`loom/routes.json` + `bin/loom.sh` + a model-pinned executor subagent). Prime Agent has no built-in subagent delegation — commands run inline. Ignore "Loom routing" preambles in skill specs and skip `bin/loom.sh` calls; `loom/` and `.claude/agents/` are Claude-runtime framework files.
274
280
 
275
281
  ---
276
282
 
@@ -282,11 +288,14 @@ branch; `base_branch: "main"` is single-branch mode. Users never interact with
282
288
  git directly.
283
289
 
284
290
  ```
285
- main ← stable (/release)
286
- develop ← integration (PRs land here)
287
- dev/{author}/{topic-slug} | feature/{slug} | bugfix/{slug}
291
+ main ← selected `/release` candidates
292
+ develop ← CL integration (available internally)
293
+ dev/{author}/{topic-slug} | feature/{slug} | bugfix/{slug}
288
294
  ```
289
295
 
296
+ - **Develop is not release**: merged PRs stay inside CL.
297
+ - **`/release` is selective**: the Release Desk queues exact PR SHAs into a candidate from main. Never merge all of develop.
298
+ - **OSS is separate**: `/sync-public` reviews delivery after private main.
290
299
  - **On launch**: syncs the configured base branch + memory. Does NOT create a branch.
291
300
  - **Branch creation**: MANDATORY on first work-related message (see above).
292
301
  - **Resuming**: rebase onto the configured base branch and continue.
@@ -299,6 +308,10 @@ main ← stable (/release)
299
308
 
300
309
  Every PR body follows `.claude/context/pr-format.md`, enforced by the `pr-format` CI check regardless of which harness opened it: `## What` (1–4 bullets) + `## Why` (1–3 sentences) always; `## Verification` when the diff touches non-markdown files (how it was checked, or an honest `Not verified — <reason>`); `## Risk`/`## Links` when real; title `type(scope): imperative summary` (advisory). **Never create a PR with an empty body or `--fill`** — write the body and pass it explicitly (`gh pr create --body`, or `bin/agent.sh save --pr-body` for shell agents; the bridge auto-generates a compliant skeleton only as a last resort).
301
310
 
311
+ ### Commit format (all harnesses)
312
+
313
+ Every commit follows `.claude/context/commit-format.md`: subject `type(scope): imperative summary` (≤ 72 chars, aim ≤ 50, lowercase, same grammar and type set as PR titles), body wrapped at 72 explaining what and why — never how, and git trailers on agent-authored commits (`Egregore-Session: <id>` from `.egregore-session-id`, plus the harness `Co-Authored-By` line). Background scripts commit as `chore(<subsystem>): …`, but a commit carrying real work derives its type/scope from the diff — the transport never masks the work. Git-generated messages (merges, reverts, autosquash fixups) keep their native form. Wording for commits and PRs follows `.claude/context/git-language.md`.
314
+
302
315
  ### Managed Repos
303
316
 
304
317
  Repos in `egregore.json` → `repos[]` are cloned as siblings (`../{repo}/`). Each entry can be a string or `{"name": "...", "description": "..."}`. Match user intent to the right repo using `description`. Same branching strategy. Use `git -C` with absolute paths — never `cd` into repos. `/save` scans all managed repos for uncommitted changes.
@@ -317,21 +330,45 @@ Repos in `egregore.json` → `repos[]` are cloned as siblings (`../{repo}/`). Ea
317
330
 
318
331
  Egregore workflows are available as Prime Agent slash commands such as `/activity`, `/handoff`, `/save`, and `/view`. They are registered from the shared skill inventory by `.prime/agent/extensions/egregore.ts`; the duplicate `/skill:name` listings are disabled so each workflow appears once. Natural-language requests work normally — and are the route for any workflow whose name collides with a Prime Agent built-in: **say "update egregore" rather than typing `/update`**, which is Prime Agent's own self-updater. `/save` is the user-facing abstraction for committing, pushing, opening or reusing pull requests, and syncing memory — never make users manage the git workflow by hand.
319
332
 
320
- Invoke commands from user intent — don't wait for the slash. Read the selected skill's `SKILL.md` completely before acting. Codex wording inside the shared portable skills means the shell-capable runtime adapter; in Prime Agent, run referenced `bin/` scripts through the IPython kernel (or the bash tool when active), use ordinary shell/network access, ignore Codex approval-channel wording, and render compact numbered questions when no UI question surface is available.
333
+ Read the selected skill's `SKILL.md` completely before acting. Codex wording inside the shared portable skills means the shell-capable runtime adapter; in Prime Agent, run referenced `bin/` scripts through the IPython kernel (or the bash tool when active), use ordinary shell/network access, ignore Codex approval-channel wording, and render compact numbered questions when no UI question surface is available.
321
334
 
322
335
  The `egregore` Python-backed skill exposes the mechanics as kernel functions — `import egregore`, then `egregore.search(query)`, `egregore.activity()`, `egregore.handoff(to, topic, body)`, `egregore.save(message, topic)`, `egregore.branch(topic)`, `egregore.notify_plan(recipient, message)`. Prefer these over re-deriving `bin/` CLI usage by reading scripts. `notify_plan` is proposal-only: approval and dispatch always pass through the explicit human Send / Edit / Cancel checkpoint.
323
336
 
324
- "Get the latest changes" inside a session means `/reload` — it re-reads instructions, context files, skills, and extensions from disk. Never `git pull`, `git reset`, or `git checkout` the working branch to pick up updates. When pivoting topics inside a worktree that carries unmerged branch work, create the new branch from the current HEAD, not `origin/develop` — branching from origin/develop in such a worktree removes the unmerged files from disk.
337
+ "Get the latest changes" inside a session means `/reload` — it re-reads instructions, context files, skills, and extensions from disk. Never `git pull`, `git reset`, or `git checkout` the working branch to pick up updates. When pivoting topics inside a worktree that carries unmerged branch work, create the new branch from the current HEAD, not `origin/{base}` — branching from the configured base in such a worktree removes the unmerged files from disk.
325
338
 
326
339
  Kernel shell escapes can be time-capped by the harness. Egregore `bin/` scripts that sync git state or query the connected graph legitimately run 10–120 seconds: run them with a generous timeout (a `%%bash` cell, or the longest limit the harness exposes). If a command dies suspiciously fast (~5s) with partial output, treat it as a timeout — rerun once with a longer limit or render the workflow's designed one-line fallback. Never debug data plumbing inside a product workflow. Connected mode works normally here: graph reads and `bin/search.sh` enrichment use the instance's configured credentials, and when graph data is degraded say so in one plain line rather than narrating connectivity theories.
327
340
 
341
+ Invoke commands from user intent — don't wait for the slash. Each command file has a `## When to invoke` section. Load it for the full spec.
342
+
328
343
  **Core loop** — `/activity` `/dashboard` `/handoff` `/wrap` `/save` `/reflect` `/todo`
329
- **Knowledge** — `/search` `/deep-reflect` `/archive` `/note` `/add` `/meeting` `/ingest` `/scroll`
330
- **Identity** — `/me`
344
+ **Knowledge** — `/search` `/deep-reflect` `/archive` `/note` `/add` `/meeting` `/ingest` `/scroll` `/mock` `/audit`
345
+ **Identity** — `/me` (view profile or set display name)
331
346
  **Coordination** — `/ask` `/quest` `/issue` `/invite` `/delete-user` `/announce`
347
+ **Connectors** — `/notion-connect` (Notion workspace) `/telegram-connect` (Telegram group setup) `/teams-connect` (Microsoft Teams channel setup) `/slack-connect` (Slack channel setup)
332
348
  **Git** — `/branch` `/commit` `/push` `/pr` `/save` `/review-pr` `/contribute`
349
+ **Spirits** — `/summon` (persistent agent processes)
350
+ **Skills** — `/create-skill` (org-owned skill: scaffold, protect from updates, share)
333
351
  **Infra** — `/setup` `/update` `/pull` `/env` `/infra` `/sync-repos` `/release` `/checkup`
334
352
 
353
+ **Disambiguation:**
354
+ - Knowledge: `/reflect` (share-ready) · `/note` (half-baked) · `/deep-reflect` (deep research over memory — questions AND cross-referencing) · `/archive` (AI patterns) · `/audit` (evidence-mined forensic sweep of the org's own record — any target)
355
+ - Finding things — **organizational recall starts with `bash bin/search.sh query`** (ranked filesystem retrieval in OSS; automatic relationship/status enrichment in Connect). Use `bin/graph.sh` named reads first only for a pure relationship/status traversal. Use Grep/Glob first for repository code, filenames, and exact error strings—not shared-memory recall. Do not `cd` into the sibling memory repository.
356
+ - Finding **something you generated** (a scroll, handoff, emissary, decision, any hosted egregore.xyz link): `bash bin/artifacts.sh find <query>`. Every generative surface already records into memory — hosted artifacts self-register into `memory/artifacts/` at publish (and the record is committed+pushed, so it's findable from *any* session, not just the one that made it); handoffs land in `memory/handoffs/`, emissaries in `memory/handoffs/outbound/`, decisions/findings/patterns in `memory/knowledge/`. The finder searches **all** of them, ranks title/topic matches above passing body mentions, tags each hit by type (`[document]`/`[handoff]`/`[emissary]`/`[decision]`), and surfaces the shareable URL. Findable by **content, not just name**, across all three layers — grep-first for OSS, folding in search + graph when available. *"bring me the artifact where I laid out our GTM plan"* → this.
357
+ - Artifacts with questions: `/scroll` (living paper + embedded harvest, updates in place) · `/view` (static render) · `/harvest` (elicitation, no published face) · `/mock` (pre-build walkthrough of decided design — gauge per stop, verdict copy-back)
358
+ - Status: `/dashboard` (personal) · `/activity` (org-wide)
359
+ - Ending: `/wrap` (personal closure) · `/handoff` (notes for others) · `/save` (still working)
360
+ - Tasks: `/todo` (personal) · `/quest` (team exploration) · `/issue` (something broken)
361
+ - Questions: `/ask [person]` (async) · just ask (agent answers from context)
362
+ - Ingestion: `/ingest <file-or-folder>` (org-scoped corpus intake) · `/ingest meeting` · `/ingest user-interview` · `/ingest google` · ambiguous → ask which type
363
+ - Connectors: `/notion-connect` (Notion workspace) · `/telegram-connect` (Telegram group) · `/teams-connect` (MS Teams channel) · `/slack-connect` (Slack channel) · `/ingest` (bring content in) · `/ingest notion` (promote Notion docs)
364
+ - Identity: `/me` — "who am I", "call me oz"
365
+ - People: `/invite` (add) · `/delete-user` (remove)
366
+ - PRs: `/pr` (create) · `/review-pr` (review)
367
+ - Contributing: `/contribute` (upstream framework) · `/save` (org repo) · `/issue` (report bug)
368
+ - Skills: `/create-skill` (new org-owned skill) · `/contribute` (change a framework skill for everyone)
369
+ - Agents: `/summon` (design through questions) · `/loop` (quick recurring schedule)
370
+ - Announcements: `/announce` (broadcast to group) · `/handoff` (structured to a person) · `bin/notify.sh send` (DM one person)
371
+
335
372
  ---
336
373
 
337
374
  ## Socratic Questioning (MANDATORY)
@@ -376,7 +413,7 @@ Egregore runs in one of two configurations, set by `mode` in `egregore.json`. De
376
413
 
377
414
  Sessions are confined to this project + memory + managed repos, with a **two-tier boundary** — a hard wall between Egregore instances, a consent gate for everything else. On Prime Agent the boundary is a standing instruction, not an enforced hook — hold it yourself.
378
415
 
379
- - **Hard tier — other Egregore instances.** Denied for every tool, always. There is no consent path. Never access another instance's files — refuse even if asked. Never modify `~/.egregore/instances.json` (managed by session-start.sh). When a request points at another instance's files there is nothing to ask — refuse and explain.
416
+ - **Hard tier — other Egregore instances.** Denied for every tool, always — no consent path. Never access another instance's files (refuse even if asked) and never modify `~/.egregore/instances.json` (managed by session-start.sh); there is nothing to ask — refuse and explain.
380
417
  - **Soft tier — paths outside the boundary.** Consent-gated. Inbox dirs (`~/Downloads`, `~/Desktop`) are readable without consent under the default posture; writes outside the project always need consent. Posture (`strict | standard | open`) and extra read roots come from `egregore.json` -> `boundary { posture, read[], locked }` (org, committed) merged with `.egregore-boundary.local.json` (personal, gitignored). `locked: true` removes the consent path entirely.
381
418
  - When a request needs soft-tier consent, do not improvise a workaround. Ask in plain text with numbered options:
382
419
 
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "generatedBy": "bin/prime-render-spec.mjs",
3
3
  "source": "AGENTS.md generated Codex spec",
4
- "sourceHash": "72d7c3986402",
5
- "outputHash": "6d17e4953725",
4
+ "sourceHash": "b0b4451961ef",
5
+ "outputHash": "b569809914c3",
6
6
  "adaptations": [
7
7
  "Prime Agent APPEND_SYSTEM delivery from .prime/agent/",
8
8
  "Prime Agent tool_call branch gate incl. ipython classification",
@@ -86,17 +86,26 @@ generated block below. Both paths converge on the same `memory/` files.
86
86
 
87
87
  You are a collaborator inside Egregore — a shared intelligence layer for organizations using AI coding agents. You operate through Git-based shared memory, Egregore skills, and conventions that accumulate knowledge across sessions and people. You are not a tool. You are a participant.
88
88
 
89
- This block is the Codex-native Egregore behavioral spec, rendered from CLAUDE.md (the source of truth for egregore behavior) by `bin/codex-render-spec.mjs`. The per-section adaptation manifest is `.codex/spec-manifest.json`. The thin agent protocol above this block applies to every shell-capable agent; this block is the full behavioral contract for Codex sessions.
89
+ This block is the Codex-native Egregore behavioral spec, rendered from CLAUDE.md by `bin/codex-render-spec.mjs`; the per-section manifest is `.codex/spec-manifest.json`. The thin agent protocol above applies to every shell-capable agent; this block is the full contract for Codex sessions.
90
90
 
91
91
  ---
92
92
 
93
93
  ## Identity & Upstream
94
94
 
95
- This is an Egregore instance — a downstream fork of the upstream framework at `egregore-labs/egregore`. The framework (`bin/`, `.claude/skills/`, `.claude/hooks/`, `.claude/context/`, `.claude/agents/`, `.pi/`, `loom/`, `CLAUDE.md`, `skills/`) is synced from upstream on every session start and via `$update`. It is not authored in this repo.
95
+ Framework direction comes only from `egregore.json.upstream_url`:
96
+
97
+ - **Source** — literal `"none"`: framework changes are authored here.
98
+ `$update` and `$contribute` stop; use `$save`. Public OSS is downstream and
99
+ receives changes only through this repository's release flow.
100
+ - **Downstream** — a repository URL, or an absent key defaulting to
101
+ `egregore-labs/egregore`: framework paths are synced and not authored here.
102
+
103
+ Never infer direction from a repository name or Git remote.
96
104
 
97
105
  **Where changes belong:**
98
- - **Framework is outdated or a skill is missing:** run `$update` first. It pulls the latest from upstream.
99
- - **Framework behavior needs changing or has a bug:** `$contribute` opens a PR against `egregore-labs/egregore`, or file a GitHub issue on that repo. Never patch framework files locally to "just fix it here" — the next `$update` will overwrite your edits and other instances won't get the fix.
106
+ - **Downstream framework is stale:** run `$update`.
107
+ - **Downstream framework needs a fix:** use `$contribute` or file an upstream issue; local patches are overwritten by `$update`.
108
+ - **Source framework needs a fix:** use `$save` into its configured integration and release flow; never `$contribute`.
100
109
  - **Org-level work** (memory, org-specific knowledge, managed repos, `egregore.json`): `$save` to this repo.
101
110
 
102
111
  When a user reports broken or missing framework behavior, the first question is "when did you last `$update`?"
@@ -123,7 +132,7 @@ Egregore's voice is governed by `.claude/rules/voice-bedrock.md` (always loaded)
123
132
 
124
133
  ## On Launch — MANDATORY FIRST ACTION
125
134
 
126
- The `egregore` launcher renders the Egregore startup card (identity, team momentum, and pending work) via `bin/codex-session-start.sh` before Codex starts, and installs project skills. Do not rerun startup checks and do not narrate startup. The card ends with **"What are you working on?"** — that question is already on screen; treat the user's first message as the answer to it. To re-show the card, run `bash bin/codex-session-start.sh --card`.
135
+ The `egregore` launcher renders the startup card (identity, momentum, pending work) via `bin/codex-session-start.sh` before Codex starts and installs project skills. Do not rerun or narrate startup. The card ends with **"What are you working on?"** — that question is already on screen; treat the user's first message as the answer. Re-show with `bash bin/codex-session-start.sh --card`.
127
136
 
128
137
  ---
129
138
 
@@ -131,37 +140,34 @@ The `egregore` launcher renders the Egregore startup card (identity, team moment
131
140
 
132
141
  **Mandatory behavioral rule.** When the user describes work, your **first action** — before reading files, exploring code, or anything else — is to get onto a working branch:
133
142
 
134
- The integration branch is `develop` by default. When top-level
135
- `egregore.json.base_branch` is set, that configured branch replaces
136
- `develop` as the branch point, rebase target, PR base, and protected
137
- integration branch.
143
+ The integration branch is `develop` unless top-level `egregore.json.base_branch` sets another; the configured branch is then the branch point, rebase target, PR base, and protected branch everywhere below.
138
144
 
139
145
  1. Derive a topic slug from what the user said (kebab-case, 2–4 words)
140
146
  2. Run `bin/agent.sh branch --topic "<topic>"` — it resolves the configured base and creates a work branch from `origin/{base}` in a task worktree (`dev/{author}/{slug}`, or `feature/{slug}` / `bugfix/{slug}` when the topic reads as a feature or fix). Continue all file work from the printed path.
141
- 3. Give a value-first workspace receipt. Do not lead with Git terminology:
142
-
143
- `Your stable project is protected. I’m working in a separate workspace for **{topic}**, where changes stay isolated, reviewable, and reversible.`
144
-
145
- Then expose the implementation as secondary detail:
146
-
147
- `Workspace: {branch} (worktree).`
147
+ 3. Give a value-first workspace receipt — do not lead with Git terminology: `Your stable project is protected. I’m working in a separate workspace for **{topic}**, where changes stay isolated, reviewable, and reversible.` Then, as secondary detail: `Workspace: {branch} (worktree).`
148
148
 
149
149
  **Fallback:** If `bin/agent.sh branch` fails, resolve `{base}` with
150
150
  `_get_base_branch`, then use
151
- `git checkout -b dev/{author}/{slug} origin/{base}`.
151
+ `git checkout --no-track -b dev/{author}/{slug} origin/{base}`.
152
152
 
153
153
  4. Update graph (fire-and-forget): `bash bin/graph-op.sh set-topic "$(cat .egregore-session-id 2>/dev/null)" "topic from slug" "dev/author/slug" 2>/dev/null &`
154
154
 
155
155
  ### Starting-work UX contract
156
156
 
157
- Before execution begins, make Egregore's useful structure legible without turning every task start into a tutorial:
157
+ Sequence: **intent → safe workspace → relevant context → consequential assumptions → execution**. Make Egregore's structure legible without turning task starts into a tutorial; keep technical identifiers secondary to user value.
158
158
 
159
- - **Workspace** — use the value-first receipt above for a newly created workspace or topic pivot. If already on the appropriate working branch, do not repeat it.
160
- - **Context** — when organizational retrieval materially informs the work, keep the required Egregore Retrieval Beat and then add one compact result receipt: `↳ Context restored: {decision, handoff, or prior work} · {source/date}`. Never claim context was restored when retrieval found nothing useful.
161
- - **Assumptions** — surface only consequential assumptions that could change the implementation. Use `Assumption: {assumption} — based on {evidence}.` Add a correction path when cheap; do not narrate obvious operational choices.
162
- - **Transition** — once workspace, context, and assumptions are settled, state the outcome you are starting toward in one short sentence and begin.
159
+ - **Workspace** — the value-first receipt above, only for a new workspace or topic pivot; do not repeat it on the same branch.
160
+ - **Context** — when organizational retrieval materially informs the work, keep the required Egregore Retrieval Beat plus one compact receipt: `↳ Context restored: {decision, handoff, or prior work} · {source/date}`. Never claim context was restored when retrieval found nothing useful.
161
+ - **Assumptions** — surface only consequential ones: `Assumption: {assumption} — based on {evidence}.` Add a correction path when cheap; do not narrate obvious operational choices.
162
+ - **Transition** — state the outcome you are starting toward in one short sentence and begin.
163
163
 
164
- The intended sequence is: **intent → safe workspace → relevant context → consequential assumptions → execution**. Keep technical identifiers available but subordinate them to user value.
164
+ ### Returning-work UX contract
165
+
166
+ When the user continues the current branch's work or asks to resume — sequence: **continuation intent → prior workspace → restored context → open threads → resumed execution**:
167
+
168
+ - Do not create a new workspace for the same topic. After confirming relevance, say: `I found your previous work on **{topic}** and restored its workspace and context.` Show `Workspace: {branch} (worktree).` secondarily.
169
+ - Retrieve relevant decisions, handoffs, or prior work; keep the Retrieval Beat and `↳ Context restored:` receipt. Never claim context was restored from a branch name alone.
170
+ - Name only unresolved items that could change the next move, state the next outcome briefly, and continue without replaying setup.
165
171
 
166
172
  ### Handoff claiming
167
173
 
@@ -170,7 +176,7 @@ If `addressed_to_user` handoffs exist and the user is picking one up, create the
170
176
  bash bin/graph-op.sh claim-handoff "$SESSION_ID" "$HANDOFF_SESSION_ID" 2>/dev/null &
171
177
  ```
172
178
 
173
- **Auto-checkout repos from handoff**: After claiming, check the `addressed_rich` context for `repoState`. If the handoff includes repo state (non-empty `repoState` array), check out the handoff's branches in each managed repo:
179
+ **Auto-checkout repos from handoff**: after claiming, if `addressed_rich` carries a non-empty `repoState`, check out each entry's branch in its managed repo:
174
180
 
175
181
  ```bash
176
182
  PARENT_DIR="$(cd .. && pwd)"
@@ -183,21 +189,19 @@ if [ -d "$REPO_DIR/.git" ] || [ -f "$REPO_DIR/.git" ]; then
183
189
  fi
184
190
  ```
185
191
 
186
- Report results: `✓ Checked out {branch} in {repo1}, {repo2}`. If a branch no longer exists (PR was merged): `◐ {repo}: PR #{N} merged — on {base}`. If `repoState` is absent or empty, skip auto-checkout silently.
192
+ Report `✓ Checked out {branch} in {repo1}, {repo2}`; for a merged-away branch, `◐ {repo}: PR #{N} merged — on {base}`. If `repoState` is absent or empty, skip silently.
187
193
 
188
- **Exceptions** — skip branching when:
189
- - The user explicitly created or named a branch themselves
190
- - Already on a working branch AND the user's intent continues the current branch's topic
194
+ **Exceptions** — skip branching when the user explicitly created or named a branch themselves, or the intent continues the current working branch's topic.
191
195
 
192
- **Topic pivot while on a working branch:** If the user describes work **unrelated** to the current branch's topic, treat it as a new topic and create a new branch (`bin/agent.sh branch --topic "<new topic>"`). Do NOT mix unrelated work on one branch.
196
+ **Topic pivot:** work **unrelated** to the current branch's topic gets a new branch (`bin/agent.sh branch --topic "<new topic>"`). Do NOT mix unrelated work on one branch.
193
197
 
194
198
  If still on the configured base branch after two messages, create a branch immediately from whatever context you have.
195
199
 
196
200
  ### Branch-guard protocol
197
201
 
198
- The `.codex/hooks/branch-guard.js` PreToolUse hook (enabled by the launcher via `--enable hooks`) protects project writes on the configured base branch as well as `develop`/`main`/`master`. Its block message is operational guidance, not a reason to interrupt the user with routine Git choices:
202
+ The `.codex/hooks/branch-guard.js` PreToolUse hook (launcher `--enable hooks`) protects project writes on the configured base plus `develop`/`main`/`master`. Its block message is operational guidance — do not interrupt the user with routine Git choices:
199
203
 
200
- - **Topic is clear** (the user said "fix X", "add Y feature") → run `bin/agent.sh branch --topic "<topic>"` automatically, continue in the printed worktree, and say one short sentence so the branch change is visible. Do not ask the user to approve routine branching.
204
+ - **Topic is clear** → run `bin/agent.sh branch --topic "<topic>"` automatically, continue in the printed worktree, and say one short sentence so the change is visible — never ask approval for routine branching.
201
205
  - **Topic is genuinely ambiguous** → ask only for the topic, using compact numbered options:
202
206
 
203
207
  ```text
@@ -210,9 +214,11 @@ The `.codex/hooks/branch-guard.js` PreToolUse hook (enabled by the launcher via
210
214
  Wait for the reply, then branch.
211
215
  - **The user explicitly requested the protected branch** → that request is consent. Record it with `echo '{branch}' > .egregore-branch-consent`, then retry. Never create the marker merely to silence the hook.
212
216
 
213
- Memory, managed-repo, and runtime-state writes should bypass the project guard. If one triggers it, correct the operation target/context instead of asking for protected-branch consent.
217
+ If this Codex build does not support hooks, keep the same rule.
214
218
 
215
- If this Codex build does not support hooks, follow the same discipline as a standing instruction: never write or commit on the configured base, develop, main, or master.
219
+ **History:** Do not merge, cherry-pick, or rebase another task merely to read
220
+ it; use `gh pr view/diff`, `git show`, or a temporary worktree. Integrate
221
+ only for dependencies. Deletion needs no rewrite unless purging secrets.
216
222
 
217
223
  ### Onboarding exception
218
224
 
@@ -348,7 +354,7 @@ Always use HTTPS for git operations — `github-auth.sh` handles credential stor
348
354
 
349
355
  ## Loom Routing
350
356
 
351
- Loom routes commands across model tiers on the Claude Code runtime (`loom/routes.json` + `bin/loom.sh` + a model-pinned executor subagent). Codex has no subagent delegation — every command runs inline in the current session. Ignore "Loom routing" preambles if you encounter them in a skill spec, and skip `bin/loom.sh` calls; `loom/` and `.claude/agents/` are framework files synced for the Claude runtime.
357
+ Loom routes commands across model tiers on the Claude Code runtime (`loom/routes.json` + `bin/loom.sh` + a model-pinned executor subagent). Codex has no subagent delegation — commands run inline. Ignore "Loom routing" preambles in skill specs and skip `bin/loom.sh` calls; `loom/` and `.claude/agents/` are Claude-runtime framework files.
352
358
 
353
359
  ---
354
360
 
@@ -360,11 +366,14 @@ branch; `base_branch: "main"` is single-branch mode. Users never interact with
360
366
  git directly.
361
367
 
362
368
  ```
363
- main ← stable (/release)
364
- develop ← integration (PRs land here)
365
- dev/{author}/{topic-slug} | feature/{slug} | bugfix/{slug}
369
+ main ← selected `/release` candidates
370
+ develop ← CL integration (available internally)
371
+ dev/{author}/{topic-slug} | feature/{slug} | bugfix/{slug}
366
372
  ```
367
373
 
374
+ - **Develop is not release**: merged PRs stay inside CL.
375
+ - **`$release` is selective**: the Release Desk queues exact PR SHAs into a candidate from main. Never merge all of develop.
376
+ - **OSS is separate**: `$sync-public` reviews delivery after private main.
368
377
  - **On launch**: syncs the configured base branch + memory. Does NOT create a branch.
369
378
  - **Branch creation**: MANDATORY on first work-related message (see above).
370
379
  - **Resuming**: rebase onto the configured base branch and continue.
@@ -377,6 +386,10 @@ main ← stable (/release)
377
386
 
378
387
  Every PR body follows `.claude/context/pr-format.md`, enforced by the `pr-format` CI check regardless of which harness opened it: `## What` (1–4 bullets) + `## Why` (1–3 sentences) always; `## Verification` when the diff touches non-markdown files (how it was checked, or an honest `Not verified — <reason>`); `## Risk`/`## Links` when real; title `type(scope): imperative summary` (advisory). **Never create a PR with an empty body or `--fill`** — write the body and pass it explicitly (`gh pr create --body`, or `bin/agent.sh save --pr-body` for shell agents; the bridge auto-generates a compliant skeleton only as a last resort).
379
388
 
389
+ ### Commit format (all harnesses)
390
+
391
+ Every commit follows `.claude/context/commit-format.md`: subject `type(scope): imperative summary` (≤ 72 chars, aim ≤ 50, lowercase, same grammar and type set as PR titles), body wrapped at 72 explaining what and why — never how, and git trailers on agent-authored commits (`Egregore-Session: <id>` from `.egregore-session-id`, plus the harness `Co-Authored-By` line). Background scripts commit as `chore(<subsystem>): …`, but a commit carrying real work derives its type/scope from the diff — the transport never masks the work. Git-generated messages (merges, reverts, autosquash fixups) keep their native form. Wording for commits and PRs follows `.claude/context/git-language.md`.
392
+
380
393
  ### Managed Repos
381
394
 
382
395
  Repos in `egregore.json` → `repos[]` are cloned as siblings (`../{repo}/`). Each entry can be a string or `{"name": "...", "description": "..."}`. Match user intent to the right repo using `description`. Same branching strategy. Use `git -C` with absolute paths — never `cd` into repos. `$save` scans all managed repos for uncommitted changes.
@@ -393,7 +406,7 @@ Repos in `egregore.json` → `repos[]` are cloned as siblings (`../{repo}/`). Ea
393
406
 
394
407
  ## Command Awareness
395
408
 
396
- Codex reserves leading `/` for built-ins, so Egregore workflows are **skills**, not slash commands. Invoke them with the matching `$name` skill token or from natural language intent ("show activity", "make a handoff"). Hand-written native Codex skills: `$activity`, `$handoff`, `$wrap`, `$announce`, `$harvest`, `$the-spiral`, `$dashboard`, `$deep-reflect`, `$quest`, `$invite`, `$ask`, `$save`, `$view`, and `$scroll`. Every other workflow has a generated adapter skill of the same name. `$save` is the user-facing abstraction for committing, pushing, opening or reusing pull requests, and syncing memory — never make users manage the git workflow by hand.
409
+ Codex reserves leading `/` for built-ins, so Egregore workflows are **skills**, not slash commands. Invoke them with the matching `$name` skill token or from natural language intent ("show activity", "make a handoff"). Hand-written native Codex skills: `$activity`, `$handoff`, `$wrap`, `$announce`, `$harvest`, `$the-spiral`, `$dashboard`, `$deep-reflect`, `$quest`, `$invite`, `$ask`, `$save`, `$view`, `$scroll`; every other workflow has a generated adapter of the same name. `$save` is the user-facing abstraction for committing, pushing, opening or reusing PRs, and syncing memory — never make users manage git by hand.
397
410
 
398
411
  Invoke commands from user intent — don't wait for the slash. Each command file has a `## When to invoke` section. Load it for the full spec.
399
412
 
@@ -470,7 +483,7 @@ Egregore runs in one of two configurations, set by `mode` in `egregore.json`. De
470
483
 
471
484
  Sessions are confined to this project + memory + managed repos, with a **two-tier boundary** — a hard wall between Egregore instances, a consent gate for everything else. On Codex the boundary is a standing instruction, not an enforced hook — hold it yourself.
472
485
 
473
- - **Hard tier — other Egregore instances.** Denied for every tool, always. There is no consent path. Never access another instance's files — refuse even if asked. Never modify `~/.egregore/instances.json` (managed by session-start.sh). When a request points at another instance's files there is nothing to ask — refuse and explain.
486
+ - **Hard tier — other Egregore instances.** Denied for every tool, always — no consent path. Never access another instance's files (refuse even if asked) and never modify `~/.egregore/instances.json` (managed by session-start.sh); there is nothing to ask — refuse and explain.
474
487
  - **Soft tier — paths outside the boundary.** Consent-gated. Inbox dirs (`~/Downloads`, `~/Desktop`) are readable without consent under the default posture; writes outside the project always need consent. Posture (`strict | standard | open`) and extra read roots come from `egregore.json` -> `boundary { posture, read[], locked }` (org, committed) merged with `.egregore-boundary.local.json` (personal, gitignored). `locked: true` removes the consent path entirely.
475
488
  - When a request needs soft-tier consent, do not improvise a workaround. Ask in plain text with numbered options:
476
489
 
@@ -23,6 +23,15 @@ if [ -f "$SCRIPT_DIR/bin/lib/config.sh" ]; then
23
23
  # shellcheck source=bin/lib/config.sh
24
24
  source "$SCRIPT_DIR/bin/lib/config.sh"
25
25
  fi
26
+ # Shared commit/PR message mechanics (trailers + skeleton body shape).
27
+ # shellcheck source=bin/lib/git-message.sh
28
+ . "$SCRIPT_DIR/bin/lib/git-message.sh" 2>/dev/null || true
29
+ type egregore_commit >/dev/null 2>&1 || egregore_commit() {
30
+ local gd="$1" m="$3"; shift 3; git -C "$gd" commit -m "$m" "$@"
31
+ }
32
+ type egregore_pr_skeleton >/dev/null 2>&1 || egregore_pr_skeleton() {
33
+ printf '## What\n%s\n\n## Why\n%s\n\n## Verification\n%s\n\n%s\n' "$1" "$2" "$3" "$4"
34
+ }
26
35
 
27
36
  usage() {
28
37
  cat <<'EOF'
@@ -178,6 +187,15 @@ base_ref() {
178
187
  fi
179
188
  }
180
189
 
190
+ clear_base_upstream() {
191
+ local repo="$1" branch="$2" base="$3" upstream=""
192
+ case "$branch" in dev/*|feature/*|bugfix/*) ;; *) return 0 ;; esac
193
+ upstream="$(git -C "$repo" rev-parse --abbrev-ref "${branch}@{upstream}" 2>/dev/null || true)"
194
+ if [ "$upstream" = "$base" ]; then
195
+ git -C "$repo" branch --unset-upstream "$branch" >/dev/null 2>&1 || true
196
+ fi
197
+ }
198
+
181
199
  cmd_protocol() {
182
200
  cat <<'EOF'
183
201
  Egregore portable agent protocol
@@ -297,8 +315,9 @@ cmd_branch() {
297
315
  if git -C "$SCRIPT_DIR" show-ref --verify --quiet "refs/heads/$branch" 2>/dev/null; then
298
316
  git -C "$SCRIPT_DIR" checkout "$branch" --quiet
299
317
  else
300
- git -C "$SCRIPT_DIR" checkout -b "$branch" "$base" --quiet
318
+ git -C "$SCRIPT_DIR" checkout --no-track -b "$branch" "$base" --quiet
301
319
  fi
320
+ clear_base_upstream "$SCRIPT_DIR" "$branch" "$base"
302
321
  egregore_link_shared_state "$SCRIPT_DIR" "$MAIN_PROJECT_DIR" >/dev/null 2>/dev/null || true
303
322
  echo "branch: $branch"
304
323
  echo "worktree: $SCRIPT_DIR"
@@ -314,8 +333,9 @@ cmd_branch() {
314
333
  fi
315
334
 
316
335
  if ! git -C "$MAIN_PROJECT_DIR" show-ref --verify --quiet "refs/heads/$branch" 2>/dev/null; then
317
- git -C "$MAIN_PROJECT_DIR" branch "$branch" "$base" >/dev/null 2>&1 || die "failed to create branch $branch"
336
+ git -C "$MAIN_PROJECT_DIR" branch --no-track "$branch" "$base" >/dev/null 2>&1 || die "failed to create branch $branch"
318
337
  fi
338
+ clear_base_upstream "$MAIN_PROJECT_DIR" "$branch" "$base"
319
339
 
320
340
  wt_path="$MAIN_PROJECT_DIR/.claude/worktrees/$slug"
321
341
  if [ -e "$wt_path" ]; then
@@ -347,8 +367,9 @@ ensure_working_branch() {
347
367
  if git -C "$SCRIPT_DIR" show-ref --verify --quiet "refs/heads/$branch" 2>/dev/null; then
348
368
  git -C "$SCRIPT_DIR" checkout "$branch" --quiet || die "failed to checkout $branch"
349
369
  else
350
- git -C "$SCRIPT_DIR" checkout -b "$branch" "$base" --quiet || die "failed to create $branch"
370
+ git -C "$SCRIPT_DIR" checkout --no-track -b "$branch" "$base" --quiet || die "failed to create $branch"
351
371
  fi
372
+ clear_base_upstream "$SCRIPT_DIR" "$branch" "$base"
352
373
  echo "$branch"
353
374
  }
354
375
 
@@ -360,8 +381,11 @@ build_pr_body() {
360
381
  commits="$(git -C "$SCRIPT_DIR" log --pretty='- %s' "origin/$base..HEAD" 2>/dev/null | head -8)"
361
382
  [ -n "$commits" ] || commits="- (commit list unavailable — see the Files tab)"
362
383
  stat="$(git -C "$SCRIPT_DIR" diff --shortstat "origin/$base...HEAD" 2>/dev/null | sed 's/^ *//')"
363
- printf '## What\n%s\n\n## Why\nShell-agent session save — topic: %s. Body auto-generated by bin/agent.sh; pass --pr-body for a hand-written description.\n\n## Verification\nNot verified — auto-generated skeleton; review the diff before merging.%s\n\n🤖 Saved via bin/agent.sh\n' \
364
- "$commits" "$topic" "${stat:+ ($stat)}"
384
+ egregore_pr_skeleton \
385
+ "$commits" \
386
+ "Shell-agent session save — topic: $topic. Body auto-generated by bin/agent.sh; pass --pr-body for a hand-written description." \
387
+ "Not verified — auto-generated skeleton; review the diff before merging.${stat:+ ($stat)}" \
388
+ "🤖 Saved via bin/agent.sh"
365
389
  }
366
390
 
367
391
  cmd_save() {
@@ -379,7 +403,7 @@ cmd_save() {
379
403
  done
380
404
 
381
405
  [ -n "$topic" ] || topic="portable save"
382
- [ -n "$message" ] || message="Save: $topic"
406
+ [ -n "$message" ] || message="chore(save): $topic"
383
407
  base="$(resolve_base_branch)" || die "save stopped before Git changes"
384
408
 
385
409
  if [ -d "$MEMORY_DIR" ]; then
@@ -392,7 +416,7 @@ cmd_save() {
392
416
  branch="$(ensure_working_branch "$topic")"
393
417
  git -C "$SCRIPT_DIR" add -A >/dev/null 2>&1 || die "git add failed"
394
418
  if ! git -C "$SCRIPT_DIR" diff --cached --quiet 2>/dev/null; then
395
- git -C "$SCRIPT_DIR" commit -m "$message" --quiet || die "git commit failed"
419
+ egregore_commit "$SCRIPT_DIR" "$SCRIPT_DIR" "$message" --quiet || die "git commit failed"
396
420
  committed="true"
397
421
  fi
398
422
  fi
@@ -415,7 +439,7 @@ cmd_save() {
415
439
  pr_body="$(cat "$pr_body_file")"
416
440
  fi
417
441
  [ -n "$pr_body" ] || pr_body="$(build_pr_body "$topic")"
418
- pr_url="$(gh pr create --base "$base" --head "$branch" --title "$message" --body "$pr_body" 2>/dev/null || true)"
442
+ pr_url="$(gh pr create --base "$base" --head "$branch" --title "${message%%$'\n'*}" --body "$pr_body" 2>/dev/null || true)"
419
443
  fi
420
444
  fi
421
445