Prompt Portability Audit

reference-prompt-portability-audit Doc

architecture reference

Prompt Portability Audit

Complete inventory of claude-custom assets (35 hooks, 4 agents, 1 command) with portability assessment for Goose migration. Conducted 2026-03-14.

Summary

Category Total Portable Needs Adaptation Claude-Specific
Hooks 35 17 (49%) 11 (31%) 7 (20%)
Agent Definitions 4 4 (100%) 0 0
Commands/Skills 1 0 1 (100%) 0
<strong>Total</strong> <strong>40</strong> <strong>21 (53%)</strong> <strong>12 (30%)</strong> <strong>7 (17%)</strong>

Portability Key

  • PORTABLE — Works with any framework. Generic bash/Python, checks files, runs linters. Minimal adaptation needed.
  • NEEDS_ADAPTATION — Core logic is reusable but references Claude-specific APIs, hook JSON format, or environment variables. Goose equivalent exists.
  • CLAUDE_SPECIFIC — Deeply tied to Claude Code internals (permission decision API, tool matcher format, agent spawn gates). Needs full rewrite for Goose.

Hooks: Enforcement (8)

Hook Type What it does Portability Adaptation needed
block-main-commits.sh PreToolUse Blocks git commit/push on main/master NEEDS_ADAPTATION Hook JSON permissionDecision format
block-write-tools.sh PreToolUse Blocks Write, Edit, Bash tools entirely NEEDS_ADAPTATION Tool name matcher API
block-docs-writes.sh PreToolUse Blocks all 17 pal-e-docs MCP write ops PORTABLE MCP tool blocklist is framework-agnostic
block-dottie-code-writes.sh PreToolUse Blocks Dottie from Write/Edit/Bash on repos PORTABLE Path pattern matching is generic
block-claude-custom-main-edit.sh PreToolUse Blocks Write/Edit to claude-custom on main PORTABLE Git branch check + path resolution
block-pr-merge.sh PreToolUse Prompts user before PR merge PORTABLE Merge gate pattern is reusable
block-mcp-merge.sh PreToolUse Forces confirmation before MCP merge NEEDS_ADAPTATION MCP tool JSON schema + hook “ask” API
block-upstream.sh PreToolUse Blocks gh pr/issue create on upstream repos PORTABLE Repo blocklist logic is generic

Hooks: Validation & Template Enforcement (8)

Hook Type What it does Portability Adaptation needed
check-issue.sh PreToolUse Enforces issue-driven development. Validates issues exist via API. NEEDS_ADAPTATION API calls platform-specific, branching logic reusable
check-mcp-servers.sh SessionStart Detects missing MCP servers at session start CLAUDE_SPECIFIC Reads ~/.mcp.json format, process fingerprinting
check-issue-template.sh PreToolUse Enforces issue body template compliance NEEDS_ADAPTATION REST API + template validation, fail-open
check-note-template.sh PreToolUse Enforces pal-e-docs note templates by tags NEEDS_ADAPTATION REST API + HTML parsing
check-phase-template.sh PreToolUse Enforces phase note template fields PORTABLE Field validation is generic
check-pr-template.sh PreToolUse Enforces PR body: Closes #N + heading validation NEEDS_ADAPTATION REST API calls, logic reusable
check-agent-spawn.sh PreToolUse Capability-based agent spawn gate via JSON schema CLAUDE_SPECIFIC Agent spawn context + JSON schema matching
check-ruff-before-commit.sh PreToolUse Runs ruff check before git commit in Python repos PORTABLE Linter enforcement is generic

Hooks: Labeling & Automation (3)

Hook Type What it does Portability Adaptation needed
label-on-branch.sh PostToolUse Auto-sets status:in-progress on branch creation NEEDS_ADAPTATION Forgejo API, label-setting pattern reusable
label-on-pr.sh PostToolUse Auto-sets status:qa on PR submission NEEDS_ADAPTATION Forgejo API, comments PR URL on issue
label-on-verdict.sh PostToolUse Auto-sets status based on QA verdict NEEDS_ADAPTATION Forgejo API, verdict parsing reusable

Hooks: Reminders & Guidance (6)

Hook Type What it does Portability Adaptation needed
remind-review-loop.sh PostToolUse Reminds agent to run review-fix loop after PR PORTABLE Command pattern matching
remind-mcp-review-loop.sh PostToolUse Reminds about review-fix loop after MCP PR CLAUDE_SPECIFIC MCP-specific trigger
remind-sprint-update.sh PostToolUse Reminds to move board item to done after merge PORTABLE Advisory text only
remind-update-docs.sh PostToolUse Mandates /update-docs after merge (blocking) PORTABLE Context injection
stop-doc-checkin.sh Stop Reminds to update pal-e-docs before session ends PORTABLE Reminder text only
warn-delete-note.sh PreToolUse Warns before deleting notes PORTABLE Warning text only

Hooks: Merge & Rebase (2)

Hook Type What it does Portability Adaptation needed
post-merge-rebase.sh PostToolUse Fast-forwards local main after gh pr merge PORTABLE Git operations are generic
post-mcp-merge-rebase.sh PostToolUse Same as above for MCP tool calls CLAUDE_SPECIFIC MCP tool response JSON format

Hooks: Linting & Formatting (2)

Hook Type What it does Portability Adaptation needed
auto-ruff-format.sh PreToolUse Auto-formats staged Python files with ruff before commit PORTABLE Ruff + venv detection is generic
pypi-pr-checklist.sh PreToolUse Enforces PyPI version bump checklist PORTABLE Checklist validation is generic

Hooks: Session & Worktree Management (4)

Hook Type What it does Portability Adaptation needed
check-claude-custom-clean.sh SessionStart Warns if ~/claude-custom has uncommitted changes PORTABLE Git status check is generic
cleanup-worktrees.sh SessionStart Removes stale worktrees (&gt;7 days old) PORTABLE Worktree detection is generic
session-start-context.sh SessionStart Injects platform detection + SOPs + plans + personality NEEDS_ADAPTATION REST API + pal-e-docs specific, architecture reusable
inject-subagent-context.sh SubagentStart Injects agent-type-specific guidance into spawned agents PORTABLE Agent context mapping is generic

Hooks: Helper/Shared (1)

Hook Type What it does Portability Adaptation needed
forgejo-helper.sh Sourced Shared Forgejo API functions (10+ helpers) NEEDS_ADAPTATION Forgejo API specific, credential management reusable

Agent Definitions (4)

Agent File Role Portability Notes
Betty Sue betty-sue.md Main session: planning, docs, agent dispatch PORTABLE Pure personality definition. No implementation details.
Dev dev.md Code implementation: writes code, opens PRs PORTABLE YAML frontmatter needs format translation for Goose.
QA qa.md PR review: reads code, produces verdict PORTABLE YAML frontmatter needs format translation. Read-only constraints portable.
Dottie dottie.md Doc librarian: reads/writes pal-e-docs PORTABLE YAML frontmatter needs format translation. MCP access list portable.
Key finding: All agent personalities are pure text — they describe behavior, voice, and constraints without implementation coupling. The YAML frontmatter (mcpServers, disallowedTools, isolation) needs format translation for Goose, but the core personality prompts are directly reusable.

Commands/Skills (1)

Command File What it does Portability Notes
/update-docs update-docs.md Post-merge documentation chain walk NEEDS_ADAPTATION Workflow is reusable but references Forgejo API + pal-e-docs tools. Core chain: close issue → update phase → update plan → update project → move board item → update memory.

Porting Strategy

Phase 1: Immediate (17 portable hooks)

These hooks use generic bash (git checks, linter enforcement, reminder text, path matching). They can be ported by translating the hook event trigger format from Claude Code to Goose’s extension system.

Phase 2: Adaptation (12 hooks + 1 command)

These hooks have reusable core logic but reference platform-specific APIs (Forgejo, pal-e-docs REST, Claude Code hook JSON format). The porting strategy is:
  • Extract the validation/automation logic into standalone functions
  • Create a Goose extension wrapper that calls those functions
  • Translate Claude Code’s permissionDecision: "deny" to Goose’s equivalent gating mechanism

Phase 3: Rewrite (7 Claude-specific hooks)

These hooks are deeply tied to Claude Code internals — permission decision API, agent spawn gates, MCP tool response format. They need full reimplementation as Goose extensions with equivalent behavior.

Agent Porting

All 4 agent definitions are portable. The porting path is:
  • Convert YAML frontmatter to Goose agent config format
  • Copy personality text verbatim (it’s framework-agnostic)
  • Map disallowedTools to Goose’s permission system
  • Map mcpServers to Goose’s extension connections