Weekly Engineering Retro
garrytan/gstack
Builds a weekly engineering retrospective from git history: commit counts, per-person contributions, work patterns and code quality numbers over a chosen window.
Attach a code repo's ψ vault to a caretaker oracle — check, link, heal, unlink.
$ npx skills add Soul-Brews-Studio/arra-oracle-skills-cli --skill psi -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install Soul-Brews-Studio/arra-oracle-skills-cli psi --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/Soul-Brews-Studio/arra-oracle-skills-cli.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/psi .claude/skills/psi && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "psi" agent skill from https://github.com/Soul-Brews-Studio/arra-oracle-skills-cli/tree/alpha/skills/psi into .claude/skills/psi/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "psi", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/Soul-Brews-Studio/arra-oracle-skills-cli/tree/alpha/skills/psiType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add Soul-Brews-Studio/arra-oracle-skills-cli --skill psi -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install Soul-Brews-Studio/arra-oracle-skills-cli psi --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Soul-Brews-Studio/arra-oracle-skills-cli.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/psi .agents/skills/psi && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "psi" agent skill from https://github.com/Soul-Brews-Studio/arra-oracle-skills-cli/tree/alpha/skills/psi into .agents/skills/psi/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "psi", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add Soul-Brews-Studio/arra-oracle-skills-cli --skill psi -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install Soul-Brews-Studio/arra-oracle-skills-cli psi --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Soul-Brews-Studio/arra-oracle-skills-cli.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/psi .cursor/skills/psi && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "psi" agent skill from https://github.com/Soul-Brews-Studio/arra-oracle-skills-cli/tree/alpha/skills/psi into .cursor/skills/psi/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "psi", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/Soul-Brews-Studio/arra-oracle-skills-cli.git --path skills/psi--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add Soul-Brews-Studio/arra-oracle-skills-cli --skill psi -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install Soul-Brews-Studio/arra-oracle-skills-cli psi --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Soul-Brews-Studio/arra-oracle-skills-cli.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/psi .gemini/skills/psi && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "psi" agent skill from https://github.com/Soul-Brews-Studio/arra-oracle-skills-cli/tree/alpha/skills/psi into .gemini/skills/psi/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "psi", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install Soul-Brews-Studio/arra-oracle-skills-cli psiInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add Soul-Brews-Studio/arra-oracle-skills-cli --skill psi -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/Soul-Brews-Studio/arra-oracle-skills-cli.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/psi .github/skills/psi && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "psi" agent skill from https://github.com/Soul-Brews-Studio/arra-oracle-skills-cli/tree/alpha/skills/psi into .github/skills/psi/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "psi", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add Soul-Brews-Studio/arra-oracle-skills-cli --skill psi -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install Soul-Brews-Studio/arra-oracle-skills-cli psi --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Soul-Brews-Studio/arra-oracle-skills-cli.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/psi .opencode/skills/psi && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "psi" agent skill from https://github.com/Soul-Brews-Studio/arra-oracle-skills-cli/tree/alpha/skills/psi into .opencode/skills/psi/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "psi", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
psiAttach a code repo's ψ vault to a caretaker oracle — check, link, heal, unlink.
Psi is an agent skill from Soul-Brews-Studio/arra-oracle-skills-cli. Attach a code repo's ψ vault to a caretaker oracle — check, link, heal, unlink. Use when a plain code repo (open-source, not an oracle) should keep memory in another oracle's vault, when the user says "psi check", "psi link", "share the vault", "symlink ψ to neo", "who takes care of this repo's memory", or when a ψ symlink went missing after a checkout. Do NOT trigger for creating an oracle (use /awaken), cloning repos for development (use /incubate), or writing a retrospective (use /rrr).
Its SKILL.md is about 4.9k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Product & Project Management, covering Retrospectives. The repository describes itself as: Install Oracle skills to Claude Code, OpenCode, Cursor, and 12+ AI coding agents. The licence is MIT.
6 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 9feea09. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
gitrgrsyncpython3From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use git and rsync, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Psi loads about 4.9k tokens when it runs. Until then it costs about 125 tokens; SKILL.md has 1,507 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from Soul-Brews-Studio/arra-oracle-skills-cli at commit 9feea09, republished under its MIT licence (© Soul-Brews-Studio). 1,507 words, ~4,949 tokens.
.claude/skills/psi/SKILL.md (or your agent's skills folder)."A code repo does not need to be an oracle to have a memory."
Point a plain code repo's ψ at a caretaker oracle's vault, so the repo keeps a brain
without becoming an oracle and without committing vault content into public source history.
/psi # same as check
/psi check # what is ψ here, who takes care of it, is it safe
/psi link # ask which oracle, then absorb → symlink → ignore → verify
/psi heal # symlink vanished after a checkout, or ignore rules incomplete
/psi unlink # go back to a standalone real ψcode repo/ψ ──symlink──▶ caretaker oracle/ψ
(ignored, never committed) (tracked — it IS the brain)| Repo kind | ψ | git |
|---|---|---|
| code repo — software someone else could clone and build | symlink to caretaker | ignored, never tracked |
| oracle repo — has an oracle identity | real directory | tracked |
Never assume which oracle takes care of a repo. Show the fleet and let the human name it. Linking to the wrong vault mixes two oracles' memory.
maw lsAsk: "Which oracle should take care of this repo's memory?" The human answers with a
name (neo, pulse, beta). Resolve it — the short name works:
maw locate "$ORACLE_NAME" # prints: repo: /path/to/<name>-oracle and ψ/: presentTake the repo: line as CARETAKER. If maw locate finds nothing, or its ψ/ is not
present, stop and say so — do not fall back to a guess.
Do not loop over repos or scan the filesystem looking for candidates. One repo, one question, one answer.
checkReport what you verified, never what you assume. Every line is the output of a command —
readlink -f for the real target, ls-files -s for the mode bits, check-ignore -v for
the rule that actually matched. Close with one FOCUS line: the single next action.
REPO=$(git rev-parse --show-toplevel) || exit 1
GI="$REPO/.gitignore"
# ── ψ: type, size, staleness ─────────────────────────────────────────────
if [ -L "$REPO/ψ" ]; then
TARGET=$(readlink "$REPO/ψ"); REAL=$(readlink -f "$REPO/ψ")
[ -e "$REPO/ψ/" ] && ALIVE=alive || ALIVE='DANGLING'
case "$TARGET" in /*) ABS=' ⚠️ absolute';; *) ABS='';; esac
PSI="symlink → $TARGET$ABS"; PSI2="resolves $REAL ($ALIVE)"
elif [ -d "$REPO/ψ" ]; then
N=$(find "$REPO/ψ" -type f ! -name '.DS_Store' | wc -l | tr -d ' ')
NEW=$(find "$REPO/ψ" -type f ! -name '.DS_Store' -exec stat -f '%m' {} \; 2>/dev/null | sort -rn | head -1)
AGE=$(( ( $(date +%s) - ${NEW:-$(date +%s)} ) / 86400 ))
PSI="real dir · $N files · newest $(date -r "${NEW:-0}" +%F 2>/dev/null) (${AGE}d old)"; PSI2=""
else
PSI="absent"; PSI2=""
fi
# ── git: is any of it tracked? is the LINK itself committed? ─────────────
TRACKED=$(git -C "$REPO" ls-files ψ | wc -l | tr -d ' ')
git -C "$REPO" ls-files -s ψ | rg -q '^120000' && BLOB='⚠️ SYMLINK COMMITTED' || BLOB=no
# ── ignore: both forms, and the rule git actually matched ───────────────
rg -qx 'ψ' "$GI" 2>/dev/null && BARE=yes || BARE='NO ⚠️'
rg -qx 'ψ/' "$GI" 2>/dev/null && SLASH=yes || SLASH=NO
# cut -f1, NOT an awk positional field ref — see "Never use positional parameters"
# below. check-ignore -v separates source from pathname with a TAB, so field 1 is
# the matching rule.
RULE=$(git -C "$REPO" check-ignore -v ψ 2>/dev/null | cut -f1)
[ -n "$RULE" ] || RULE='NOT IGNORED ⚠️'
# ── kind + caretaker ────────────────────────────────────────────────────
[ "$TRACKED" -gt 0 ] && KIND='oracle repo (ψ is tracked — it IS the brain)' \
|| KIND='code repo (ψ must stay ignored)'
# NOTE: no \K — this rg build rejects it, and the error would silently read as "none".
CARE=$(sed -n 's/^oracle: *//p' "$REPO/.claude/PSI_CARETAKER" 2>/dev/null)
[ -n "$CARE" ] || CARE='none recorded'
# ── render: no borders. two-space margin, aligned columns, grouped by blank
# lines. identity block first, then the checks, then one FOCUS line.
# Each check names the command that proved it — the report is its own audit.
# NOTE: printf inline per row — no row()/fact() helpers, because a helper
# would need positional parameters and the host rewrites those. See below.
F=' %-14s%s\n' # identity line
R=' %-14s%-42s%-3s %s\n' # check line
echo
printf "$F" repo "$(basename "$REPO")"
printf "$F" kind "$KIND"
printf "$F" ψ "$PSI"
[ -n "$PSI2" ] && printf "$F" '' "$PSI2"
echo
printf "$R" tracked "$TRACKED entries" "$([ "$TRACKED" -eq 0 ] && echo ✓ || echo ⚠)" 'git ls-files ψ'
printf "$R" symlink-blob "$BLOB" "$([ "$BLOB" = no ] && echo ✓ || echo ⚠)" 'ls-files -s ψ → 120000'
printf "$R" bare-ψ "$BARE" "$([ "$BARE" = yes ] && echo ✓ || echo ⚠)" 'rg -qx ψ .gitignore'
printf "$R" 'ψ/' "$SLASH" "$([ "$SLASH" = yes ] && echo ✓ || echo ·)" 'rg -qx ψ/ .gitignore'
printf "$R" ignore-rule "$RULE" "$(case $RULE in *NOT*) echo ⚠;; *) echo ✓;; esac)" 'git check-ignore -v ψ'
printf "$R" caretaker "$CARE" "$([ "$CARE" = 'none recorded' ] && echo · || echo ✓)" '.claude/PSI_CARETAKER'
echoKeep the two-space margin and the blank-line grouping — the whitespace is what makes it readable without rules. Widen a column only if a value would otherwise wrap; never add borders back.
The host substitutes the invocation's positional arguments into the skill body before the
model ever sees it. Running /psi link to neo but … rewrote an awk program that
referenced field one into awk '{print to}', and a four-parameter printf helper into
printf … "to" "neo" "but" "when" — silent corruption, no error.
So: no shell functions taking positional parameters, and no dollar-digit inside
awk/sed programs. Use cut -f1, a named variable, or a printf format string held in
a variable — all three are immune.
Emit exactly one, first match wins — most dangerous first:
| Condition | FOCUS |
|---|---|
symlink-blob committed | leaking a machine path in git history → /psi heal, then decide on a history rewrite |
symlink DANGLING | brain unreachable → /psi heal |
| symlink target absolute | breaks on every other machine → /psi heal (rewrites relative) |
code repo & bare-ψ=NO | ψ will leak the moment it is linked → add the bare rule |
code repo & NOT IGNORED | do not commit → fix .gitignore first |
| code repo, real dir, no caretaker | orphaned vault — no oracle reads these N files → /psi link |
| oracle repo, ψ tracked | ✅ correct — the vault belongs here, nothing to do |
| symlink alive, relative, ignored | ✅ linked and safe |
A stale newest date is worth naming even on a ✅ — a vault whose newest file is weeks old
is why a later /recap will hand back a stale handoff as if it were current.
link — a six-phase ritualRun it step by step, not as one script. Announce each phase as you enter it, do that phase's work, show the result, then continue. Two phases are hard gates: stop and wait for a human answer. After the phases, run the checklist, then print the report.
Phase 1/6 · Survey what ψ is now
Phase 2/6 · Caretaker ← GATE: the human names the oracle
Phase 3/6 · Preview ← GATE: the human approves the dry run
Phase 4/6 · Absorb copy + count both sides
Phase 5/6 · Link park → symlink → verify through it
Phase 6/6 · Seal ignore rules + caretaker recordNever run a later phase's commands while announcing an earlier one. A gate that is "announced and then passed in the same breath" is not a gate.
Run check first and show it. Then stop, with the reason, when:
already linked, exit 0,Show maw ls, then ask which oracle should take care of this repo's memory and wait for
the answer. Resolve it with maw locate, and confirm the caretaker's ψ/: present plus
that it is not behind its remote. Never pick a name yourself, never carry one over from a
previous run.
Show the itemized dry run and the counts, then wait for approval. Dry-run output is not consent. If the human says nothing, nothing happens.
Replacing a populated ψ with a symlink orphans everything inside it. Fetch the caretaker first so a stale vault is not merged over newer content.
Every linked repo lives under ψ/family/<host>/<owner>/<repo>, always lowercased.
Below family/ the path is the ghq tree exactly, so it reads the same in both places:
/opt/Code/github.com/soul-brews-studio/arra-oracle-skills-cli ← the code (ghq)
neo-oracle/ψ/family/github.com/soul-brews-studio/arra-oracle-skills-cli ← its memory
└ family ┘└─ host ──┘└─ owner ───────┘└─ repo ────────────┘family/ keeps the oracle's kin clear of its own organs. Without it an owner directory
lands beside memory/, inbox/, teams/ — and an org literally named teams collides
with the oracle's own. One directory to list to see everything an oracle tends.
The host is derived, never assumed. gitlab.com, codeberg.org, or a self-hosted
git.example.com each get their own subtree, so two repos sharing an owner/name on
different hosts never collide.
Lowercase is not cosmetic either: Soul-Brews-Studio and soul-brews-studio are the same
repo, but on a case-sensitive volume they become two vaults, and the split is invisible
until memory goes missing.
git -C "$CARETAKER" fetch --quiet 2>/dev/null
# host/owner/repo from the origin remote, lowercased — never from the directory
# name, which may have been renamed locally. Handles https, ssh, scp-style,
# git://, an embedded user, a custom port, and gitlab subgroups.
URL=$(git -C "$REPO" remote get-url origin 2>/dev/null)
[ -n "$URL" ] || { echo "✗ no origin remote — cannot derive the vault path"; exit 1; }
SLUG=$(printf '%s' "$URL" | sed -E \
-e 's#^(ssh|git\+ssh|https?|git)://##' \
-e 's#^[^@/]+@##' \
-e 's#:[0-9]+/#/#' \
-e 's#:#/#' \
-e 's#\.git$##' \
-e 's#/+$##' \
| tr '[:upper:]' '[:lower:]')
NS="$CARETAKER/ψ/family/$SLUG" # ψ/family/<host>/<owner>/<repo>, lowercase
rsync -a --dry-run --itemize-changes "$REPO/ψ/" "$NS/"Verified against every remote shape:
| remote | slug |
|---|---|
https://github.com/Soul-Brews-Studio/arra-oracle-skills-cli | github.com/soul-brews-studio/arra-oracle-skills-cli |
git@github.com:laris-co/Neo-Oracle.git | github.com/laris-co/neo-oracle |
git@gitlab.com:MyGroup/sub/proj.git | gitlab.com/mygroup/sub/proj |
ssh://git@git.example.com:2222/team/thing.git | git.example.com/team/thing |
git://codeberg.org/Owner/Proj.git | codeberg.org/owner/proj |
Print the itemized list and the file count, then wait for approval. Only then re-run
without --dry-run. Never --delete.
The absorb and the removal are never the same command, and never the same step. Step 3 sequences them: copy → count both sides → park the original → link → verify through the link, with an automatic rollback if the last check fails.
Order is the safety. The source is never removed; it is parked outside the repo and
only after the copy has been counted. If the link fails to resolve, roll back automatically.
Never rm -rf the vault — see "nothing deleted".
mkdir -p "$NS"
# 3a. copy for real (same command as the dry run, minus --dry-run)
rsync -a --exclude '.DS_Store' "$REPO/ψ/" "$NS/"
# 3b. VERIFY before anything moves. Counts must match exactly, or stop —
# the source is still untouched at this point, so aborting costs nothing.
SRC_N=$(find "$REPO/ψ" -type f ! -name '.DS_Store' | wc -l | tr -d ' ')
DST_N=$(find "$NS" -type f ! -name '.DS_Store' | wc -l | tr -d ' ')
if [ "$SRC_N" -ne "$DST_N" ]; then
echo "✗ ABORT — copied $DST_N of $SRC_N files. Source untouched; nothing removed."
exit 1
fi
echo "✓ verified $DST_N/$SRC_N files copied"
# 3c. PARK the original outside the repo (never delete, never leave it in git's way)
PARK="${TMPDIR:-/tmp}/psi-replaced-$(echo "$SLUG" | tr / -)-$(date +%Y%m%d-%H%M%S)"
mv "$REPO/ψ" "$PARK"
# 3d. link, relative
REL=$(python3 -c 'import os,sys;print(os.path.relpath(sys.argv[1],sys.argv[2]))' "$NS" "$REPO")
ln -sfn "$REL" "$REPO/ψ" # -n: do not descend into an existing symlink
# 3e. verify the link RESOLVES and the content is reachable THROUGH it.
# Any failure restores the parked original and exits.
restore() { rm -f "$REPO/ψ"; mv "$PARK" "$REPO/ψ"; echo "↩ restored original ψ"; }
[ -e "$REPO/ψ/" ] || { echo "✗ link does not resolve"; restore; exit 1; }
THRU=$(find "$REPO/ψ/" -type f ! -name '.DS_Store' | wc -l | tr -d ' ')
[ "$THRU" -ge "$SRC_N" ] || { echo "✗ only $THRU/$SRC_N reachable through the link"; restore; exit 1; }
readlink -f "$REPO/ψ"
echo "✓ $THRU files reachable through the link"
echo " original parked: $PARK (delete it yourself once satisfied)"ln -sfn, never ln -sf — with a pre-existing symlinked directory -f alone creates the
link inside the target instead of replacing it.
Why park instead of delete: at 3c the content exists in two places and has been counted in both, so parking looks redundant — until 3d writes a link that silently resolves somewhere unexpected. Parking makes 3e's rollback possible. Announce the park path; let the human delete it. Nothing deleted.
for pat in 'ψ' 'ψ/'; do
rg -qx "$pat" "$REPO/.gitignore" 2>/dev/null || echo "$pat" >> "$REPO/.gitignore"
done
if git -C "$REPO" ls-files --error-unmatch ψ >/dev/null 2>&1; then
git -C "$REPO" rm --cached -r --quiet ψ
echo "✓ untracked previously-committed ψ (history still holds it — rewrite separately)"
fi
git -C "$REPO" check-ignore -v ψ || echo "⚠️ ψ is NOT ignored — do not commit"Verification is part of the step. If check-ignore prints nothing, the link is not safe —
report that instead of declaring success.
mkdir -p "$REPO/.claude"
printf 'oracle: %s\nrepo: %s\nvault: %s\ndate: %s\n' \
"$ORACLE_NAME" "$CARETAKER" "$NS" "$(date +%F)" > "$REPO/.claude/PSI_CARETAKER"
rg -qx '.claude/PSI_CARETAKER' "$REPO/.gitignore" 2>/dev/null \
|| echo '.claude/PSI_CARETAKER' >> "$REPO/.gitignore"Machine-local, ignored like the link. check reads it to name the caretaker without asking
again.
After phase 6, verify the outcome. Every line re-runs a real command; nothing is asserted
from memory of what the phases intended to do. Print it. Unlike the retro checklist in
/rrr, this one is shown — it is the evidence that a data move succeeded.
C=' %-2s %-34s%s\n' # format in a variable — no helper, no positional params
# 1 counts match on both sides
SRC_OK=$([ "${SRC_N:-0}" -eq "$DST_N" ] && echo ✓ || echo ✗)
printf "$C" "$SRC_OK" "files copied" "$DST_N/$SRC_N"
# 2 reachable THROUGH the link, not just present in the vault
printf "$C" "$([ "${THRU:-0}" -ge "${SRC_N:-0}" ] && echo ✓ || echo ✗)" "reachable through ψ" "$THRU"
# 3 the link resolves
printf "$C" "$([ -e "$REPO/ψ/" ] && echo ✓ || echo ✗)" "link resolves" "$(readlink -f "$REPO/ψ")"
# 4 relative, not absolute
case "$(readlink "$REPO/ψ")" in /*) A=✗;; *) A=✓;; esac
printf "$C" "$A" "relative target" "$(readlink "$REPO/ψ")"
# 5 lowercase, nested owner/repo
printf "$C" "$([ "$SLUG" = "$(echo "$SLUG" | tr '[:upper:]' '[:lower:]')" ] && echo ✓ || echo ✗)" "vault path lowercase" "ψ/$SLUG"
# 6 git cannot see it
printf "$C" "$(git -C "$REPO" check-ignore -q ψ && echo ✓ || echo ✗)" "ignored by git" "$(git -C "$REPO" check-ignore -v ψ | cut -f1)"
# 7 the link itself is not committed
printf "$C" "$(git -C "$REPO" ls-files -s ψ | rg -q '^120000' && echo ✗ || echo ✓)" "symlink not committed" "$(git -C "$REPO" ls-files ψ | wc -l | tr -d ' ') tracked"
# 8 the original still exists somewhere
printf "$C" "$([ -d "$PARK" ] && echo ✓ || echo ✗)" "original parked" "$PARK"Any ✗ means stop and say so — do not print a success report over a failed checklist.
Items 2 and 8 are the ones that matter most: 2 proves the brain is actually reachable, 8
proves nothing was destroyed.
Close with a short report in the same borderless style as check. State what moved, where
it went, and what the human still owns.
ψ linked · arra-oracle-skills-cli → neo
moved 17 files → neo-oracle/ψ/family/github.com/soul-brews-studio/arra-oracle-skills-cli
symlink ../../laris-co/neo-oracle/ψ/family/github.com/soul-brews-studio/arra-oracle-skills-cli
ignored .gitignore:9:ψ (bare rule — ψ/ no longer matches a symlink)
caretaker neo
parked /var/.../psi-replaced-…-20260820-181051
yours to do delete the parked copy once satisfied
commit the .gitignore changeReport only what the checklist verified. If an item failed, the report says what failed and what state the repo is in — never a clean summary over a broken outcome.
healgit checkout and git merge silently delete an ignored symlink when they remove the
last tracked sibling at that path — no error is printed. Repair, reporting each fix:
PSI_CARETAKER exists but ψ is missing → recreate the relative symlink.ψ is a symlink that readlink -f cannot resolve → report the dangling target; do not
invent a replacement.ψ is tracked → git rm --cached -r ψ.Print ✓ nothing to heal when clean.
unlinkCopy the namespaced subtree back into a real ψ, replace the symlink, and leave the
caretaker's copy alone — never delete the vault side. Keep the ignore lines unless asked.
maw ls and let the human name the caretaker. Never guess, never scan for one.rm -rf a vault. Copy → count both sides → park the original
outside the repo → link → verify through the link, rolling back on any failure. The human
deletes the parked copy, not the skill.ψ and ψ/ in .gitignore, every time — a trailing slash matches directories
only, so a ψ/-only rule stops matching the moment ψ becomes a symlink.readlink -f, check-ignore), not what you intended.© Soul-Brews-Studio, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in skills/psi of Soul-Brews-Studio/arra-oracle-skills-cli.
Open the folder on GitHubat commit 9feea09
Psi next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Psi this skillSoul-Brews-Studio/arra-oracle-skills-cli | 123 | — | ~4.9k | Automated safety check: Pass | MIT | |
| Weekly Engineering Retrogarrytan/gstack | 136k | — | ~2.4k | Automated safety check: Pass | MIT | |
| Dough Execute Planterryyin/lizard | 2.5k | — | ~4.3k | Automated safety check: Pass | Custom licence | |
| Oral Paper SkillAdkid-Zephyr/oral-paper-skill | 357 | — | ~1.9k | Automated safety check: Pass | None | |
| Deck Retroasheshgoplani/agent-deck | 1.1k | — | ~1.8k | Automated safety check: Pass | MIT | |
| Dough Execution Retrospectiveterryyin/lizard | 2.5k | — | ~4k | Automated safety check: Pass | Custom licence |
garrytan/gstack
Builds a weekly engineering retrospective from git history: commit counts, per-person contributions, work patterns and code quality numbers over a chosen window.
terryyin/lizard
Executes one selected story or bounded retrospective correction through an executable plan, or one authorized planless slice from a selected simple story or a contextual instruction, with…
Adkid-Zephyr/oral-paper-skill
Help authors learn from exemplary ICLR, ICML, and NeurIPS papers through source-linked manuscript comparisons, concrete writing and experiment suggestions, and guided reflection.
asheshgoplani/agent-deck
Run a fully local agent-deck retrospective over the user's own transcripts, Recall index and logs.
terryyin/lizard
Reviews planned, completed planless quick, or quick-to-planned execution against original intent, aggregate commits, current whole-product architecture, and tests, including after cleanup.
HughYau/qiushi-skill
批评与自我批评:在工作完成、阶段验收、收到批评或同类错误反复出现时,对成果和过程做诚实、具体、基于事实的审视,输出可执行的改进项,并处理外来批评而不辩解。触发信号包括 review、复盘、审查、"帮我看看有没有问题"、"你确定吗";任务刚开始或只是单步查询时不触发。
Soul-Brews-Studio/arra-oracle-skills-cli
Mine Claude Code sessions — timeline, gaps, repo attribution, session history.
Soul-Brews-Studio/arra-oracle-skills-cli
Hand off the current session to the next one. An agent skill from Soul-Brews-Studio/arra-oracle-skills-cli.
Soul-Brews-Studio/arra-oracle-skills-cli
Clone and track external repos. An agent skill from Soul-Brews-Studio/arra-oracle-skills-cli.
Soul-Brews-Studio/arra-oracle-skills-cli
Convene a Round Table (โต๊ะกลม): 3–8 souls — persona files, Oracles, or real people's DNA — debate ONE stakes-bearing decision over exactly 4 rounds (OPEN, DEEPEN, CONVERGE, VOTE), one subagent per…
Soul-Brews-Studio/arra-oracle-skills-cli
Bring an Oracle into the current repo — its soul, ALL its skills and its expertise — by link, never by copy.
Soul-Brews-Studio/arra-oracle-skills-cli
Find projects, code, and knowledge across git history, repos, docs, and Oracle.
Categories
Attach a code repo's ψ vault to a caretaker oracle — check, link, heal, unlink. Psi is an agent skill from Soul-Brews-Studio/arra-oracle-skills-cli. Attach a code repo's ψ vault to a caretaker oracle — check, link, heal, unlink.
Psi fits situations like: A plain code repo (open-source; not an oracle) should keep memory in another oracles vault; the user says psi check; share the vault.
Run `npx skills add Soul-Brews-Studio/arra-oracle-skills-cli --skill psi -a claude-code`. Or copy the skill folder (skills/psi in Soul-Brews-Studio/arra-oracle-skills-cli) into .claude/skills/psi in your project. Claude Code loads it when a task matches its description.
Run `npx skills add Soul-Brews-Studio/arra-oracle-skills-cli --skill psi -a codex`. Or copy the skill folder (skills/psi in Soul-Brews-Studio/arra-oracle-skills-cli) into .agents/skills/psi in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add Soul-Brews-Studio/arra-oracle-skills-cli --skill psi -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/psi, .gemini/skills/psi, .github/skills/psi and .opencode/skills/psi in your project.
Going by SKILL.md and its folder, Psi needs the command-line tools its instructions call (git, rg, rsync and python3).
SKILL.md contains no URLs. Its commands use git, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Psi is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 4.9k tokens (SKILL.md is roughly 20k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Psi: Weekly Engineering Retro (garrytan/gstack, 136k stars), Dough Execute Plan (terryyin/lizard, 2.5k stars), Oral Paper Skill (Adkid-Zephyr/oral-paper-skill, 357 stars) and Deck Retro (asheshgoplani/agent-deck, 1.1k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
Soul-Brews-Studio (a GitHub organization) maintains it in Soul-Brews-Studio/arra-oracle-skills-cli, which has 123 GitHub stars. The repository holds 31 skills in this directory. The repository was last updated on October 3, 2026.
Source: Soul-Brews-Studio/arra-oracle-skills-cli on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.