Pull latest for current repo and shared memory.
Note: /activity auto-syncs. Use /pull only when you need to sync without viewing activity.
When to invoke
User says: "/pull", "pull latest", "sync my branch", "get the latest changes", "update memory", or needs to sync without also viewing activity.
Not this: also want to see recent activity → /activity (auto-syncs already).
Loom routing
Skip this section if your prompt contains LOOM-EXECUTOR — you are the executor; run the skill as specced below. Full protocol: .claude/context/loom.md.
- Resolve:
ROUTE=$(bash bin/loom.sh route pull), then DECISION_ID=$(printf '%s\n' "$ROUTE" | jq -r '.decision_id // empty').
- If
mode ≠ delegate, or the user signalled depth ("deep", "think hard", --deep) → run this skill inline as normal. On a depth override, print bash bin/loom.sh footer pull --override after the output and set "override":true in telemetry.
- Otherwise delegate: spawn the Agent tool with
subagent_type: "loom-executor", model = the route's tier, prompt =
LOOM-DECISION-ID: $DECISION_ID on its own first line, then
LOOM-EXECUTOR: Execute .claude/skills/pull/SKILL.md, plus the user's
arguments and any context the spec needs from the session. Print the
executor's final output verbatim, then print the output of
bash bin/loom.sh footer pull.
- If the spawn fails or the executor's first line is
LOW_CONFIDENCE: —
triage the reason: needs-user-interaction or a main-loop-only tool → take
over and finish this skill inline (no escalation); genuine uncertainty or
failure → reassign ROUTE=$(bash bin/loom.sh escalate pull "<reason>"),
refresh DECISION_ID from ROUTE, then re-spawn once on the new tier
carrying the returned decision ID
(sticky for this session).
- Telemetry (fire-and-forget):
bash bin/telemetry.sh emit "command" '{"command":"pull","routed":true,"mode":"delegate","model":"<actual>","route_tier":"<table tier>","class":"<class>","escalated":<bool>,"override":<bool>,"source":"<source>"}' 2>/dev/null &
What to do
- Resolve the validated base branch with
bin/lib/config.sh → _get_base_branch, then sync it with remote
- If on a
dev/* working branch, rebase onto the base branch (fallback: merge)
- Check memory symlink exists — if not, derive directory from
egregore.json and create symlink
- Pull memory repo via symlink
Execution
# 1. Update local base branch ref without switching branches (safe for concurrent sessions)
# Pass a managed repo name to _get_base_branch when operating on one.
BASE_BRANCH=$(bash -c 'SCRIPT_DIR="$PWD"; CONFIG="$PWD/egregore.json"; . "$PWD/bin/lib/config.sh" && _get_base_branch "$1"' _ "${REPO:-}") ||
{ echo "Could not resolve the configured base branch; stopping before Git changes." >&2; exit 1; }
git fetch origin "$BASE_BRANCH:$BASE_BRANCH" --quiet
# 2. If on a working branch, rebase onto the base branch
CURRENT=$(git branch --show-current)
if [[ "$CURRENT" == dev/* ]]; then
git rebase "$BASE_BRANCH" --quiet || (git rebase --abort && git merge "$BASE_BRANCH" -m "Sync with $BASE_BRANCH")
fi
# 3. Memory — derive directory from egregore.json, never hardcode
MEMORY_DIR=$(basename "$(jq -r '.memory_repo' egregore.json)" .git)
if [ ! -L memory ]; then
ln -s "../$MEMORY_DIR" memory
fi
# 4. Pull memory and capture what arrived
MEMORY_BEFORE=$(git -C memory rev-parse HEAD 2>/dev/null)
git -C memory pull origin main --quiet
MEMORY_AFTER=$(git -C memory rev-parse HEAD 2>/dev/null)
# 5. Show what arrived in memory (new/changed files since last pull)
if [ "$MEMORY_BEFORE" != "$MEMORY_AFTER" ]; then
MEMORY_FILES=$(git -C memory diff --name-only "$MEMORY_BEFORE" "$MEMORY_AFTER")
MEMORY_COUNT=$(echo "$MEMORY_FILES" | wc -l | tr -d ' ')
fi
Output
Show what arrived — don't leave the user wondering if things synced:
Pulling...
configured base ↓ 3 commits → synced
dev/oz/... ✓ rebased onto configured base
memory ↓ 2 commits — 4 files updated
handoffs/2026-02/12-renckorzay-giza-docs.md (new)
handoffs/index.md
artifacts/giza-architecture.md (new)
artifacts/giza-api-spec.md (new)
If memory is already up to date:
memory ✓ up to date
1---2name: pull-23description: Use for /pull when you need to sync the current branch and shared memory without also viewing activity (/activity auto-syncs already).4---56Pull latest for current repo and shared memory.78**Note:** `/activity` auto-syncs. Use `/pull` only when you need to sync without viewing activity.910## When to invoke1112User says: "/pull", "pull latest", "sync my branch", "get the latest changes", "update memory", or needs to sync without also viewing activity.13Not this: also want to see recent activity → `/activity` (auto-syncs already).1415## Loom routing1617**Skip this section if your prompt contains `LOOM-EXECUTOR`** — you are the executor; run the skill as specced below. Full protocol: `.claude/context/loom.md`.18191. Resolve: `ROUTE=$(bash bin/loom.sh route pull)`, then `DECISION_ID=$(printf '%s\n' "$ROUTE" | jq -r '.decision_id // empty')`.202. If `mode` ≠ `delegate`, or the user signalled depth ("deep", "think hard", `--deep`) → run this skill inline as normal. On a depth override, print `bash bin/loom.sh footer pull --override` after the output and set `"override":true` in telemetry.213. Otherwise delegate: spawn the Agent tool with `subagent_type:22 "loom-executor"`, `model` = the route's `tier`, prompt =23 `LOOM-DECISION-ID: $DECISION_ID` on its own first line, then24 `LOOM-EXECUTOR: Execute .claude/skills/pull/SKILL.md`, plus the user's25 arguments and any context the spec needs from the session. Print the26 executor's final output **verbatim**, then print the output of27 `bash bin/loom.sh footer pull`.284. If the spawn fails or the executor's first line is `LOW_CONFIDENCE:` —29 triage the reason: needs-user-interaction or a main-loop-only tool → take30 over and finish this skill inline (no escalation); genuine uncertainty or31 failure → reassign `ROUTE=$(bash bin/loom.sh escalate pull "<reason>")`,32 refresh `DECISION_ID` from `ROUTE`, then re-spawn once on the new tier33 carrying the returned decision ID34 (sticky for this session).355. Telemetry (fire-and-forget):36 `bash bin/telemetry.sh emit "command" '{"command":"pull","routed":true,"mode":"delegate","model":"<actual>","route_tier":"<table tier>","class":"<class>","escalated":<bool>,"override":<bool>,"source":"<source>"}' 2>/dev/null &`3738## What to do39401. Resolve the validated base branch with `bin/lib/config.sh` → `_get_base_branch`, then sync it with remote412. If on a `dev/*` working branch, rebase onto the base branch (fallback: merge)423. Check memory symlink exists — if not, derive directory from `egregore.json` and create symlink434. Pull memory repo via symlink4445## Execution4647```bash48# 1. Update local base branch ref without switching branches (safe for concurrent sessions)49# Pass a managed repo name to _get_base_branch when operating on one.50BASE_BRANCH=$(bash -c 'SCRIPT_DIR="$PWD"; CONFIG="$PWD/egregore.json"; . "$PWD/bin/lib/config.sh" && _get_base_branch "$1"' _ "${REPO:-}") ||51 { echo "Could not resolve the configured base branch; stopping before Git changes." >&2; exit 1; }52git fetch origin "$BASE_BRANCH:$BASE_BRANCH" --quiet5354# 2. If on a working branch, rebase onto the base branch55CURRENT=$(git branch --show-current)56if [[ "$CURRENT" == dev/* ]]; then57 git rebase "$BASE_BRANCH" --quiet || (git rebase --abort && git merge "$BASE_BRANCH" -m "Sync with $BASE_BRANCH")58fi5960# 3. Memory — derive directory from egregore.json, never hardcode61MEMORY_DIR=$(basename "$(jq -r '.memory_repo' egregore.json)" .git)62if [ ! -L memory ]; then63 ln -s "../$MEMORY_DIR" memory64fi6566# 4. Pull memory and capture what arrived67MEMORY_BEFORE=$(git -C memory rev-parse HEAD 2>/dev/null)68git -C memory pull origin main --quiet69MEMORY_AFTER=$(git -C memory rev-parse HEAD 2>/dev/null)7071# 5. Show what arrived in memory (new/changed files since last pull)72if [ "$MEMORY_BEFORE" != "$MEMORY_AFTER" ]; then73 MEMORY_FILES=$(git -C memory diff --name-only "$MEMORY_BEFORE" "$MEMORY_AFTER")74 MEMORY_COUNT=$(echo "$MEMORY_FILES" | wc -l | tr -d ' ')75fi76```7778## Output7980Show what arrived — don't leave the user wondering if things synced:8182```83Pulling...84 configured base ↓ 3 commits → synced85 dev/oz/... ✓ rebased onto configured base86 memory ↓ 2 commits — 4 files updated87 handoffs/2026-02/12-renckorzay-giza-docs.md (new)88 handoffs/index.md89 artifacts/giza-architecture.md (new)90 artifacts/giza-api-spec.md (new)91```9293If memory is already up to date:94```95 memory ✓ up to date96```