Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@ summary: Timeline of guardrail helper changes mirrored from Sweetistics and rela

# Changelog

## 2026-09-25: PStack split into Codex and Claude halves
- Stopped mirroring the 53 Codex-tuned PStack skills listed in `skills/.codex-only` into `~/.claude/skills`; `sync-skills` prunes its own links there and keeps them for `~/.agents` and `~/.codex`. Claude Code now gets PStack from the `pstack` plugin in the new private [BramVR/claude-pstack](https://github.com/BramVR/claude-pstack) fork of `michael-denyer/pstack-claude`, with Codex-parity model roles (Fable judgment, Opus code, Sonnet scouts) and an opt-in routing hook.

## 2026-09-23: Opus design and review roles
- Use Opus 5.5 for Interrogate at xhigh and optional Claude Autoreview at high; add it to Arena’s cross-judge pool at high, with Claude CLI routing and a 2.1.280 minimum-version check.
- Replace Architect’s Astra low candidate with Opus 5.5 high through `claude -p`; retain GPT-6 Sol high, Fable 5.1 high, and the three-candidate requirement.
Expand Down
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,8 @@ It writes one flat per-skill symlink to each supported discovery root:

`~/.agents/skills` must be a real directory, not a whole-directory symlink.

PStack split: skills here are the Codex-tuned PStack. Names in `skills/.codex-only` skip `~/.claude/skills` (owned links there are pruned); Claude Code gets Claude-tuned copies from the `pstack` plugin in [BramVR/claude-pstack](https://github.com/BramVR/claude-pstack) (`claude plugin marketplace add BramVR/claude-pstack`, `claude plugin install pstack@pstack-claude`). Update the list when either side adds or drops a PStack skill.

Sources, in collision priority order: `agent-scripts/skills` > `~/Projects/manager/skills` (if present) > codex-local extras in `~/.codex/skills` > claude-local extras in `~/.claude/skills`. `~/.agents/skills` is a mirror destination only. Repo-owned skills resolve to their own repo, e.g. `gog -> ~/Projects/gogcli/.agents/skills/gog`.

Broken links are pruned always. Generated links are tracked in `~/.agents/.sync-skills-v1.tsv` and pruned when their source disappears; non-colliding foreign links are left alone. Matching pre-existing links are not automatically claimed when the state file is first created.
Expand Down
26 changes: 26 additions & 0 deletions scripts/sync-skills
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
# Bram's setup is documented as per-skill links too, so no whole-root symlink
# is created (see README: "Do not replace this with a broad ... symlink").
# Sources: agent-scripts > manager > codex-local > claude-local.
# skills/.codex-only names agent-scripts skills kept out of ~/.claude/skills
# (Claude gets its own copies from the pstack plugin).
# ~/.agents/skills is destination-only.
#
# Usage: sync-skills [-n|--dry-run] [--no-instructions]
Expand Down Expand Up @@ -175,6 +177,23 @@ claim() { # claim <root> <label>; first root to claim a name wins.
done
}
claim "$AGENT_SKILLS" agent-scripts

codex_only_names=()
if [ -f "$AGENT_SKILLS/.codex-only" ]; then
while IFS= read -r codex_only_line || [ -n "$codex_only_line" ]; do
case $codex_only_line in '' | '#'*) continue ;; esac
codex_only_names+=("$codex_only_line")
done < "$AGENT_SKILLS/.codex-only"
fi
# codex_only <name> <target>: listed and still served from agent-scripts.
codex_only() {
local n
[ "$2" = "$(canon "$AGENT_SKILLS/$1")" ] || return 1
for n in ${codex_only_names[@]+"${codex_only_names[@]}"}; do
[ "$n" = "$1" ] && return 0
done
return 1
}
claim "$MANAGER_SKILLS" manager
claim "$CODEX_ROOT" codex-local codex
claim "$CLAUDE_ROOT" claude-local claude
Expand Down Expand Up @@ -210,6 +229,13 @@ for root_index in "${!mirror_roots[@]}"; do
name=${names[$name_index]}
target=${targets[$name_index]}
linkpath="$root/$name"
if [ "$role" = claude ] && codex_only "$name" "$target"; then
# Prune only our own link; foreign links and real dirs stay untouched.
if [ -L "$linkpath" ] && owned=$(state_lookup claude "$name") && [ "$owned" = "$(readlink "$linkpath")" ]; then
plan_remove "$linkpath" "$owned" "pruned codex-only link $name -> $owned"
fi
continue
fi
Comment on lines +232 to +238
if [ -L "$linkpath" ]; then
observed=$(readlink "$linkpath")
if [ "$observed" = "$target" ]; then
Expand Down
56 changes: 56 additions & 0 deletions skills/.codex-only
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
# Codex-tuned PStack skills. sync-skills links them into ~/.agents and ~/.codex only;
# Claude Code gets the Claude-tuned copies from the pstack plugin (BramVR/claude-pstack).
# One skill name per line.
architect
arena
automate-me
blast-radius
bro
create-verification-skill
deslop
figure-it-out
fix-ci
fix-merge-conflicts
get-pr-comments
how
interrogate
maintain-verification-skill
make-pr-easy-to-review
no-comments
poteto-mode
principle-attack-the-premise
principle-boundary-discipline
principle-build-the-lever
principle-encode-lessons-in-structure
principle-exhaust-the-design-space
principle-experience-first
principle-fix-root-causes
principle-foundational-thinking
principle-guard-the-context-window
principle-laziness-protocol
principle-make-operations-idempotent
principle-migrate-callers-then-delete-legacy-apis
principle-minimize-reader-load
principle-model-the-domain
principle-never-block-on-the-human
principle-outcome-oriented-execution
principle-prove-it-works
principle-redesign-from-first-principles
principle-separate-before-serializing-shared-state
principle-sequence-verifiable-units
principle-subtract-before-you-add
principle-test-behavior-not-implementation
principle-type-system-discipline
recall
reflect
setup-pstack
show-me-your-work
swarm
tdd
teach
technical-writing
thermo-nuclear-code-quality-review
typescript-best-practices
unslop
what-did-i-get-done
why
18 changes: 18 additions & 0 deletions tests/sync-skills.sh
Original file line number Diff line number Diff line change
Expand Up @@ -520,4 +520,22 @@ done
assert_contains "$prune_output" "pruned stale link removed-agent -> $(canonical "$agent_skills/removed-agent")"
assert_contains "$prune_output" "pruned stale link removed-manager -> $(canonical "$manager_skills/removed-manager")"

new_case
make_skill "$agent_skills" shared
make_skill "$agent_skills" codex-tuned
make_skill "$agent_skills" foreign-kept
run_sync >/dev/null
assert_link "$claude_root/codex-tuned" "$(canonical "$agent_skills/codex-tuned")"
ln -sfn "$case_root/elsewhere" "$claude_root/foreign-kept"
printf '%s\n' '# comment' codex-tuned foreign-kept > "$agent_skills/.codex-only"
codex_only_output=$(run_sync)
assert_contains "$codex_only_output" "pruned codex-only link codex-tuned -> $(canonical "$agent_skills/codex-tuned")"
assert_absent "$claude_root/codex-tuned"
assert_link "$claude_root/foreign-kept" "$case_root/elsewhere"
assert_link "$claude_root/shared" "$(canonical "$agent_skills/shared")"
for root in "$agents_root" "$codex_root"; do
assert_link "$root/codex-tuned" "$(canonical "$agent_skills/codex-tuned")"
done
assert_not_contains "$(run_sync)" "link $claude_root/codex-tuned"

printf 'sync-skills tests passed\n'
Loading