Help us improve
Share bugs, ideas, or general feedback.
From ark-skills
Diagnostic check for Ark ecosystem health — plugins, CLAUDE.md, vault, integrations
npx claudepluginhub helloworldsungin/ark-skills --plugin ark-skillsHow this skill is triggered — by the user, by Claude, or both
Slash command
/ark-skills:ark-healthThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Run 23 diagnostic checks across the Ark ecosystem and produce a scored report with actionable fix instructions. Bash implementations for the longer checks live in `references/check-implementations.md` (load-on-demand).
Guides technical evaluation of code review feedback: read fully, restate for understanding, verify against codebase, respond with reasoning or pushback before implementing.
Share bugs, ideas, or general feedback.
Run 23 diagnostic checks across the Ark ecosystem and produce a scored report with actionable fix instructions. Bash implementations for the longer checks live in references/check-implementations.md (load-on-demand).
This skill is exempt from normal context-discovery. It must work when CLAUDE.md is missing, broken, or incomplete. When CLAUDE.md is absent:
Never abort early. Run all 23 checks regardless of earlier failures.
Four user-provided fields (see plugin CLAUDE.md § Context-Discovery Pattern for path-layout detail):
/- (e.g. ArkSignal-)Derived: counter file = {tasknotes_path}/meta/{task_prefix}counter.
Detection is session-capability: read the system-reminder skill list in the current session and match for the listed skill names. Plugin detection is session-based, never filesystem-based.
Check 1 — superpowers plugin | Tier: Critical
superpowers:* entry (e.g., superpowers:brainstorming, superpowers:writing-plans)/plugin install superpowers@claude-plugins-official (marketplace: anthropics/claude-plugins-official)Check 2 — gstack plugin | Tier: Standard
browse, qa, ship, review, design-review/plugin marketplace list for gstack source and install/browse, /qa, /ship, /review, /design-review, and moreCheck 3 — obsidian plugin | Tier: Standard
obsidian:* entry (e.g., obsidian:obsidian-cli)/plugin install obsidian@obsidian-skills (marketplace: kepano/obsidian-skills)Read CLAUDE.md first. If CLAUDE.md does not exist, checks 4–6 all fail and checks 7–20 report "cannot check — CLAUDE.md missing". Checks 21, 22, and 23 are exempt.
ls CLAUDE.md 2>/dev/null && echo "found" || echo "missing"
Check 4 — CLAUDE.md exists | Tier: Critical
CLAUDE.md exists in the project rootCLAUDE.md with the four required fields aboveCheck 5 — CLAUDE.md required fields | Tier: Critical
-, TaskNotes path)references/check-implementations.md § Check 5Check 6 — Task prefix format | Tier: Critical
- AND counter file exists at {tasknotes_path}/meta/{task_prefix}counter- (not --); create counter: echo "1" > {tasknotes_path}/meta/{task_prefix}counterreferences/check-implementations.md § Check 6These checks require vault root from CLAUDE.md. If CLAUDE.md is missing, report "cannot check — CLAUDE.md missing" for all five.
Check 7 — Vault directory exists | Tier: Critical
ls -d "${VAULT_ROOT}" 2>/dev/null && echo "PASS" || echo "FAIL: vault root not found at ${VAULT_ROOT}"
Check 8 — Vault structure | Tier: Critical
_meta/, _Templates/, and TaskNotes/ all exist; plus 00-Home.md (standalone layout) OR a project docs subdirectory (monorepo layout)/wiki-setup to initialize, or manually create missing directoriesreferences/check-implementations.md § Check 8Check 9 — Python 3.10+ | Tier: Critical
Required for index generation even at Quick tier.
PYTHON_VERSION=$(python3 --version 2>/dev/null | grep -oE '[0-9]+\.[0-9]+' | head -1)
MAJOR=$(echo "$PYTHON_VERSION" | cut -d. -f1)
MINOR=$(echo "$PYTHON_VERSION" | cut -d. -f2)
if [ -z "$PYTHON_VERSION" ]; then
echo "FAIL: python3 not found"
elif [ "$MAJOR" -gt 3 ] || ([ "$MAJOR" -eq 3 ] && [ "$MINOR" -ge 10 ]); then
echo "PASS: Python $PYTHON_VERSION"
else
echo "FAIL: Python $PYTHON_VERSION is too old (need >= 3.10)"
fi
python3 --version ≥ 3.10brew install python@3.12)Check 10 — Index status | Tier: Standard
Staleness is a warning, not a failure.
index.md existsindex.md exists but pages have been modified since generation — report count of stale pagesindex.md does not existcd {vault_root} && python3 _meta/generate-index.pyreferences/check-implementations.md § Check 10Check 11 — Task counter | Tier: Standard
{tasknotes_path}/meta/{task_prefix}counter and contains a valid integermkdir -p {tasknotes_path}/meta && echo "1" > {counter_file}references/check-implementations.md § Check 11Check 12 — Obsidian vault plugins | Tier: Standard
ls "${VAULT_ROOT}.obsidian/plugins/tasknotes/main.js" 2>/dev/null && echo "tasknotes: OK" || echo "tasknotes: MISSING"
ls "${VAULT_ROOT}.obsidian/plugins/obsidian-git/main.js" 2>/dev/null && echo "obsidian-git: OK" || echo "obsidian-git: MISSING"
tasknotes/main.js and obsidian-git/main.js exist in {vault_root}/.obsidian/plugins/Check 13 — TaskNotes MCP | Tier: Standard
Config check only — does not verify connectivity (Obsidian must be running for the endpoint to respond).
cat .mcp.json 2>/dev/null | grep -q "tasknotes" && echo "PASS: tasknotes MCP configured" || echo "FAIL: tasknotes not found in .mcp.json"
tasknotes entry exists in .mcp.json (project root).mcp.json (TaskNotes v4.5+ ships a built-in MCP server on its API port):
"mcpServers": {
"tasknotes": {
"type": "http",
"url": "http://localhost:8080/mcp"
}
}
Or CLI: claude mcp add --transport http --scope project tasknotes http://localhost:8080/mcpCheck 14 — MemPalace installed | Tier: Full | Non-blocking upgrade
command -v mempalace 2>/dev/null && mempalace --version 2>/dev/null && echo "PASS" || echo "FAIL: mempalace not found"
mempalace CLI on PATHpipx install "mempalace>=3.0.0,<4.0.0"; fallback pip install if pipx unavailable/wiki-query (deep synthesis, experiential recall) + history auto-index hookCheck 14a — MemPalace plugin installed (user scope) | Tier: Full | Returns: warn
The Claude Code plugin wires the MemPalace MCP server into every session, giving the LLM native access to 19 memory tools for T2 reads without a CLI round-trip.
# Block-aware parse: `claude plugin list` emits one block per plugin, each
# starting with " ❯ <name>@<marketplace>" and continuing until the next " ❯ ".
# We must scope Version/Scope/Status checks to the mempalace block — scanning
# the whole output as one stream false-PASSes when a DIFFERENT plugin is the
# user-scope/enabled one.
claude plugin list 2>/dev/null | awk '
/^ ❯ / {in_target = ($0 ~ /^ ❯ mempalace@/); next}
in_target && /Scope: user/ {scope=1}
in_target && /Status: ✔ enabled/ {enabled=1}
END {exit !(scope && enabled)}
' && echo "PASS" || echo "WARN: plugin not installed at user scope"
mempalace plugin present at user scope and enabled.# One-time shim — plugin declares command: mempalace-mcp but pip ships it as a module
cat > ~/.local/bin/mempalace-mcp <<'EOF'
#!/bin/bash
exec "$(pipx environment --value PIPX_LOCAL_VENVS)/mempalace/bin/python" -m mempalace.mcp_server "$@"
EOF
chmod +x ~/.local/bin/mempalace-mcp
claude plugin marketplace add milla-jovovich/mempalace
claude plugin install --scope user mempalace@mempalace
hook subcommand./mempalace:* slash commands, auto-save Stop/PreCompact hooks.Check 14b — MemPalace MCP server responds | Tier: Full | Returns: warn
Note: this probe verifies that Claude Code has the plugin's MCP wired up AND the shim actually starts. It does NOT prove the current interactive session has the
mcp__mempalace__*tools loaded — that's only knowable from inside the session. If this PASSes but the tools aren't showing, restart Claude Code.
# Probe 1: Claude Code's `claude mcp list` emits lines like
# "plugin:mempalace:mempalace: mempalace-mcp - ✓ Connected"
# when the plugin registered its MCP config and the shim is reachable.
if claude mcp list 2>/dev/null | grep -qE '^plugin:mempalace:.*- *✓ Connected'; then
echo "PASS"
elif command -v mempalace-mcp >/dev/null 2>&1; then
# Probe 2 (fallback): shim exists — do a stdio `initialize` handshake.
# Portable timeout: `timeout`/`gtimeout` aren't on stock macOS, so use perl
# (universally available) which sets an alarm before exec-ing the target.
HANDSHAKE=$(
echo '{"jsonrpc":"2.0","method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"health","version":"0"}},"id":1}' \
| perl -e 'alarm 5; exec @ARGV' mempalace-mcp 2>/dev/null
)
if echo "$HANDSHAKE" | grep -q '"protocolVersion"'; then
echo "PASS"
else
echo "WARN: shim exists but MCP initialize handshake failed"
fi
else
echo "WARN: MCP not reachable — plugin not wired and no shim on PATH"
fi
claude mcp list OR the shim responds to initialize within 5s.claude mcp list doesn't show mempalace → plugin not registered; re-run Check 14a upgrade./ark-onboard Step 13 to rebuild on Python 3.13.mcp__mempalace__* tools in a restarted Claude Code session.Check 14c — MemPalace hook state (informational) | Tier: Full | Returns: pass (both states)
mempalace v3.3.5 ships #1023 (PID-file guard), #784 (per-source-file
mine_lock), #976 (HNSW thread-safety, v3.3.4), #1322 (wiresquarantine_stale_hnswfor #1121/#1132/#1263), and #1162 (serialize ChromaCollection writes through palace lock). With this stack landed, the plugin's own Stop/PreCompact hooks are substantially safer than at v3.3.2. Neutralizing them is now a defense-in-depth choice for very large palaces, not a corruption-prevention requirement. Watch #1457 (quarantine gate misses zero-bytelink_lists.bin— the issue is CLOSED upstream via PR #1461 merged 2026-05-14, but the fix is NOT yet in a PyPI release: v3.3.5 still treats a 0-bytelink_lists.binas benign, and the fix is slated for unpublished v3.3.6); this check can retire once 3.3.6 ships to PyPI and is installed.
# JSON-aware: check `.hooks.Stop` and `.hooks.PreCompact` specifically.
# A raw grep would false-warn on any hooks.json that mentions those strings
# outside the `.hooks` path (e.g., in a description), and it tells us nothing
# about whether the hooks are actually *active* (non-empty array).
ACTIVE=""
while IFS= read -r f; do
[ -z "$f" ] && continue
HAS_ACTIVE_HOOK=$(python3 - "$f" 2>/dev/null <<'PY'
import json, sys
try:
d = json.load(open(sys.argv[1]))
h = d.get("hooks", {}) or {}
active = bool(h.get("Stop")) or bool(h.get("PreCompact"))
print("1" if active else "0")
except Exception:
print("0")
PY
)
[ "$HAS_ACTIVE_HOOK" = "1" ] && ACTIVE="$ACTIVE $f"
done < <(find "$HOME/.claude/plugins/cache/mempalace/mempalace" -name hooks.json 2>/dev/null)
if [ -z "$ACTIVE" ]; then
echo "PASS: mempalace hooks neutralized (defense-in-depth)"
else
echo "PASS: mempalace hooks active (plugin auto-save enabled — relying on #1023 + #784 serialization)"
fi
hooks.json has .hooks.Stop or .hooks.PreCompact. Auto-save via plugin is off; the LLM must explicitly call mempalace_add_drawer / diary_write to save memories.for f in $(find ~/.claude/plugins/cache/mempalace/mempalace -name hooks.json); do
[ -f "$f.pre-1092-disable" ] || cp "$f" "$f.pre-1092-disable"
python3 -c "import json,sys; p=sys.argv[1]; d=json.load(open(p)); d['hooks']={}; d['description']='DISABLED defense-in-depth for #1092/#1109'; json.dump(d, open(p,'w'), indent=2)" "$f"
done
for backup in $(find ~/.claude/plugins/cache/mempalace/mempalace -name 'hooks.json.pre-1092-disable'); do
mv "$backup" "${backup%.pre-1092-disable}"
done
Check 14d — MemPalace palace read sanity | Tier: Full | Returns: warn
Exercises the HNSW read path via a real
mempalace_searchthrough the shim. If the palace read crashes, check for HNSW/SQLite drift (the corruption pattern in #1092) and offer thequarantine_stale_hnsw()recovery.
if ! command -v mempalace-mcp >/dev/null 2>&1; then
echo "SKIP: mempalace-mcp shim not on PATH (check 14a upgrade action)"
else
# Tee stderr to a log file so the "inspect /tmp/mempalace-mcp-last.log" warn
# message below actually points at evidence. Stdout stays clean for the sentinel grep.
PROBE_OUT=$(
printf '%s\n%s\n%s\n' \
'{"jsonrpc":"2.0","method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"health","version":"0"}},"id":1}' \
'{"jsonrpc":"2.0","method":"notifications/initialized"}' \
'{"jsonrpc":"2.0","method":"tools/call","params":{"name":"mempalace_search","arguments":{"query":"health probe","limit":1}},"id":2}' \
| perl -e 'alarm 20; exec @ARGV' mempalace-mcp 2>>/tmp/mempalace-mcp-last.log
)
# Portable mtime — BSD `stat -f %m` on macOS, GNU `stat -c %Y` on Linux.
_mtime() { stat -f %m "$1" 2>/dev/null || stat -c %Y "$1" 2>/dev/null; }
# MCP wraps tool output as escaped JSON inside content[].text, so the sentinel
# "total_before_filter" appears as \"total_before_filter\". Match without quote
# anchors to catch both forms.
if echo "$PROBE_OUT" | grep -q 'total_before_filter'; then
echo "PASS: palace read path healthy"
else
PALACE="$HOME/.mempalace/palace"
SQ_AGE=$(_mtime "$PALACE/chroma.sqlite3")
DRIFT_SEG=""
if [ -n "$SQ_AGE" ]; then
for seg in "$PALACE"/*-*-*-*-*; do
[ -f "$seg/data_level0.bin" ] || continue
SEG_AGE=$(_mtime "$seg/data_level0.bin")
[ -z "$SEG_AGE" ] && continue
DRIFT=$((SQ_AGE - SEG_AGE))
[ "$DRIFT" -gt 3600 ] && DRIFT_SEG="$seg (${DRIFT}s drift)"
done
fi
if [ -n "$DRIFT_SEG" ]; then
echo "WARN: palace read crashed + HNSW drift detected at $DRIFT_SEG — run quarantine_stale_hnsw (see below)"
else
echo "WARN: palace read crashed with no obvious drift — inspect /tmp/mempalace-mcp-last.log"
fi
fi
fi
mempalace_search returns a valid JSON-RPC response with "total_before_filter".data_level0.bin is more than 1 hour older than chroma.sqlite3 — matches the #1000 drift signature. Recovery:
$(pipx environment --value PIPX_LOCAL_VENVS)/mempalace/bin/python -c "
from mempalace.backends.chroma import quarantine_stale_hnsw
renamed = quarantine_stale_hnsw('$HOME/.mempalace/palace')
print('Quarantined segments:', renamed)
"
# Then restart Claude Code. Plugin MCP server reopens, chromadb writes a fresh segment
# from chroma.sqlite3. The quarantined dir is renamed to `<uuid>.drift-YYYYMMDD-HHMMSS`
# — not deleted — so you can recover if the heuristic misfires.
mempalace repair, (b) full nuke + re-mine (lossy).quarantine_stale_hnsw() automatically on MCP startup), this check can be retired.Check 15 — MemPalace wing indexed | Tier: Full | Requires Check 14
Covers the vault content wing (indexed by mine-vault.sh). The conversation history wing is separate — see Check 16.
WING=$(echo "$PWD" | sed 's|[/.]|-|g')
echo "Expected wing: $WING"
mempalace status 2>/dev/null | grep -q "$WING" && echo "PASS: wing found" || echo "FAIL: wing not indexed"
mempalace status shows a wing for this projectbash skills/shared/mine-vault.shCheck 16 — History auto-index hook | Tier: Full | Requires Check 14
Five sub-conditions. Conditions 1–2 determine pass/fail; conditions 3–5 are warnings (hook installed, but effect silently compromised).
~/.claude/hooks/ark-history-hook.sh.claude/settings.json (project-local; global registration also works but is harder to verify)mempalace status has a wing matching the expected key for $PWD50 * 4 = 200 new drawers since last compilecurrent_drawers == drawers_at_last_compile AND baseline > 500 (high signal: "stuck compile baseline" looks like "hook not running")bash skills/claude-history-ingest/hooks/install-hook.shreferences/check-implementations.md § Check 16Check 16b — History hook content drift | Tier: Full | Returns: warn | Requires Check 16
Detects when the installed copy at ~/.claude/hooks/ark-history-hook.sh diverges from the plugin's current version — for example, after a plugin upgrade that added the palace-global cross-wing mutex (v1.21.1). The user must re-run install-hook.sh to pick up the new script; a version-only plugin upgrade doesn't touch the already-installed copy.
INSTALLED="$HOME/.claude/hooks/ark-history-hook.sh"
PLUGIN_COPY=""
# Find the plugin's current copy. The cache may contain MULTIPLE versions
# (e.g., 1.16.0/, 1.20.0/, 1.21.x/) accumulated across upgrades. Pick the
# highest by VERSION, not alphabetical — under shell glob `1.20.0` sorts
# AFTER `1.16.0` only via `sort -V`. Falsely matching against an older cached
# copy would mask exactly the drift this check is designed to catch.
PLUGIN_COPY=$(ls -1 \
"$HOME/.claude/plugins/cache/ark-skills/ark-skills"/*/skills/claude-history-ingest/hooks/ark-history-hook.sh \
2>/dev/null | sort -V | tail -1)
# Fallbacks: legacy cache layout (no version subdir), then dev-mode CWD.
if [ -z "$PLUGIN_COPY" ] || [ ! -f "$PLUGIN_COPY" ]; then
for fallback in \
"$HOME/.claude/plugins/cache/ark-skills/skills/claude-history-ingest/hooks/ark-history-hook.sh" \
"$(pwd)/skills/claude-history-ingest/hooks/ark-history-hook.sh"; do
if [ -f "$fallback" ]; then
PLUGIN_COPY="$fallback"
break
fi
done
fi
if [ ! -f "$INSTALLED" ]; then
echo "SKIP: hook not installed (see Check 16)"
elif [ -z "$PLUGIN_COPY" ]; then
echo "SKIP: cannot locate plugin's reference copy"
elif cmp -s "$INSTALLED" "$PLUGIN_COPY"; then
echo "PASS: installed hook matches plugin's current version"
else
echo "WARN: installed hook drifts from plugin copy — re-install to pick up latest"
fi
cmp -s reports installed file is byte-identical to the plugin's current copy.bash skills/claude-history-ingest/hooks/install-hook.sh.~/.claude/hooks/*. A user still running a v1.20.x copy after upgrading the plugin to v1.21.1 is missing the cross-wing mutex and remains exposed to the HNSW write race that the release closes.Check 17 — NotebookLM CLI installed | Tier: Full | Non-blocking upgrade
command -v notebooklm 2>/dev/null && notebooklm --version 2>/dev/null && echo "PASS" || echo "FAIL: notebooklm not found"
notebooklm CLI on PATHpipx install notebooklm-cli/notebooklm-vault skillCheck 18 — NotebookLM config | Tier: Full | Requires Check 17
.notebooklm/config.json (project root or vault root) with non-empty notebook ID/notebooklm-vault to set up, or create .notebooklm/config.json with a valid notebook IDreferences/check-implementations.md § Check 18Check 19 — NotebookLM authenticated | Tier: Full | Non-blocking
notebooklm auth check --test 2>/dev/null && echo "PASS: authenticated" || echo "FAIL: auth check failed"
notebooklm auth check --test exits 0notebooklm auth login, then rerun /ark-healthCheck 20 — Vault externalized | Tier: Standard | Warn-only (never fails)
Detection inputs: vault artifact (symlink / real dir / missing), scripts/setup-vault-symlink.sh (present / absent), CLAUDE.md Vault layout opt-out row (present / absent).
VAULT_TARGET; (b) real directory + opt-out present; (c) missing + opt-out present + no script/ark-onboard Repair or Greenfield.references/check-implementations.md § Check 20Check 21 — OMC plugin | Tier: Standard | Upgrade-style (never fails)
Exempt from CLAUDE.md-missing skip rule (OMC presence is a CLI/cache-dir property). Detection mirrors the canonical HAS_OMC probe in skills/ark-workflow/SKILL.md:54-61 — detect first, then apply the ARK_SKIP_OMC=true override (downstream emergency rollback per skills/ark-workflow/references/omc-integration.md § Section 3).
if command -v omc >/dev/null 2>&1 || [ -d "$HOME/.claude/plugins/cache/omc" ]; then
HAS_OMC=true
else
HAS_OMC=false
fi
[ "$ARK_SKIP_OMC" = "true" ] && HAS_OMC=false
if [ "$HAS_OMC" = "true" ]; then
echo "PASS: OMC detected"
elif [ "$ARK_SKIP_OMC" = "true" ]; then
echo "SKIP: ARK_SKIP_OMC=true (user-suppressed)"
else
echo "UPGRADE: OMC not installed"
fi
omc on PATH OR ~/.claude/plugins/cache/omc exists, AND ARK_SKIP_OMC is not true/ark-workflow Path B (/autopilot, /ralph, /ultrawork, /team)ARK_SKIP_OMC=true → render as -- with note OMC suppressed (ARK_SKIP_OMC=true)Check 22 — ark-skills plugin version current | Tier: Standard | Warn-only (never fails)
Exempt from CLAUDE.md-missing skip rule. Compares .ark/plugin-version against $ARK_SKILLS_ROOT/VERSION and asserts .ark/ is not gitignored.
.ark/plugin-version exists and matches $ARK_SKILLS_ROOT/VERSIONupgrade available: run /ark-update (project vs current versions).ark/plugin-version absent → run /ark-update to record current version.ark/ is gitignored → remove pattern and commit before running /ark-updatereferences/check-implementations.md § Check 22Check 23 — ark-skills plugin cache integrity | Tier: Standard | Warn-only (never fails)
Exempt from CLAUDE.md-missing skip rule. Detects partial-cache failures where Claude Code's plugin loader populated the v$VERSION cache directory with fewer skill directories than the marketplace clone — symptom is "other projects can't see /ark-workflow etc." even though the plugin reports as "latest version". Compares skill-directory counts between ~/.claude/plugins/cache/ark-skills/ark-skills/$VERSION/skills/ (the runtime cache that drives session skill loading) and ~/.claude/plugins/marketplaces/ark-skills/skills/ (the upstream clone, source of truth).
cp -R fix command for the user to runrm -rf + /plugin updatereferences/check-implementations.md § Check 23Run all 23 checks in sequence. Do not abort on failure.
skip with message "cannot check — CLAUDE.md missing". Checks 21, 22, 23 are exempt.skip with message "requires MemPalace plugin (check 14a)".skip with message "requires check 16".skip with message "requires check N".Classify each result with one of four outcomes:
| Symbol | Outcome | Condition |
|---|---|---|
OK | Pass | Check passed |
!! | Fail | Check failed — has a fix instruction |
~~ | Warning | Non-blocking (Check 10 staleness, Check 14a/14b/14d MemPalace, Check 16 hook-state drift, Check 16b hook content drift, Check 20, Check 22, Check 23) |
-- | Available upgrade | Feature not installed, above current tier |
>> | Informational | State display only (Check 14c MemPalace hook state — always passes) |
fail. Warn, skip, and upgrade outcomes never demote tier.Check 21 (OMC plugin) is tier-agnostic. Warn-returning checks (10 index staleness, 14a MemPalace plugin, 14b MemPalace MCP reachable, 14d MemPalace palace read sanity, 16b history hook content drift, 20 vault externalized, 22 plugin version, 23 plugin cache integrity) are advisory — they surface in the scorecard but never block tier classification. Upgrade-returning checks (14 MemPalace, 17 NotebookLM CLI, 18 NotebookLM config, 21 OMC plugin) are also non-blocking. Informational checks (14c MemPalace hook state) always return pass and exist purely to surface state on the scorecard.
Run /ark-onboard to fix or upgrade.Ark Health Check -- {project_name}
Plugins
OK superpowers v{version}
OK obsidian v{version}
!! gstack -- not detected
Unlock: /browse, /qa, /ship, /review, /design-review + more
Check: /plugin marketplace list for gstack source
Project Configuration
OK CLAUDE.md exists and has required fields
OK Task prefix: {task_prefix} (counter at {N})
Vault Structure
OK Vault healthy ({N} pages, {standalone|monorepo} layout)
~~ Index stale ({N} pages modified since last generation)
Refresh: cd {vault_root} && python3 _meta/generate-index.py
OK Python {version} available
OK Vault externalized (symlink -> $HOME/.superset/vaults/{project})
Integrations
OK Obsidian vault plugins installed
!! TaskNotes MCP -- not in .mcp.json
Fix: Add tasknotes HTTP transport to .mcp.json
-- MemPalace -- not installed
Unlock: T2 retrieval for /wiki-query
Install: pipx install "mempalace>=3.0.0,<4.0.0"
~~ MemPalace plugin -- not installed (user scope)
Unlock: Auto-MCP server on all Claude Code sessions (19 read tools for T2)
Install: claude plugin marketplace add milla-jovovich/mempalace && claude plugin install --scope user mempalace@mempalace
Note: requires the `mempalace-mcp` shim — see check 14a for the one-liner
~~ MemPalace MCP -- not reachable this session
Fix: restart Claude Code to pick up the plugin's MCP server, or verify the shim at ~/.local/bin/mempalace-mcp
>> MemPalace hooks -- active (plugin auto-save on, relying on #1023 + #784)
Optional: neutralize for defense-in-depth on large palaces — see check 14c
>> MemPalace hooks -- neutralized (defense-in-depth, auto-save off)
Revisit: consider re-enabling on v3.3.5+ (#976 + #1162 + #1322 landed) — see check 14c
~~ MemPalace palace read -- crashed + HNSW drift detected
Fix: run quarantine_stale_hnsw() one-liner in check 14d; then restart Claude Code
Upstream: MemPalace #1062 (self-heal on MCP startup; retire check 14d when merged)
~~ History hook -- installed copy drifts from plugin's current version
Fix: bash skills/claude-history-ingest/hooks/install-hook.sh to re-install
Note: plugin upgrades don't overwrite ~/.claude/hooks/; re-run after every bump
-- OMC plugin -- not installed
Unlock: /ark-workflow Path B (autonomous execution)
Install: https://github.com/anthropics/oh-my-claudecode
Score: {tier} tier | {N} fix, {N} warning, {N} upgrades available
Run /ark-onboard to fix or upgrade
Rules:
-- {name} -- cannot check (CLAUDE.md missing) with -- symbol!! → indented Fix: line~~ → indented Refresh: / Fix: / Reset: line (Check 16 hook drift uses Fix: or Reset: per sub-warning)-- → indented Unlock: + Install: or Check: line>> → state-display only; indented Optional:, Revisit:, or Note: line (Check 14c MemPalace hook state)1 fix, not 1 fixesRun /ark-onboard to fix or upgrade/ark-health diagnoses and recommends only. All fixes go through /ark-onboard./ark-onboard's copy drifts from here, this file wins.~/.claude/plugins/.references/check-implementations.md (load-on-demand). This reduces the at-invocation token footprint without changing check semantics.