{ id = "0009", slug = "claude-session-context", description = "Add SessionStart hook and static project-context.md for auto-loading project identity into Claude Code sessions", check = { tag = "NuCmd", cmd = "let root = $env.ONTOREF_PROJECT_ROOT; let hook = $\"($root)/.claude/hooks/session-context.sh\"; let ctx = $\"($root)/.claude/project-context.md\"; if ($hook | path exists) and ($ctx | path exists) { exit 0 } else { exit 1 }", expect_exit = 0, }, instructions = " 1. Create .claude/hooks/session-context.sh with the following content and make it executable: #!/usr/bin/env bash # Hook: SessionStart # Injects current project identity, state dimensions, and hard constraints # as initial context for every Claude Code session in this directory. set -euo pipefail REPO_ROOT=\"$(git rev-parse --show-toplevel 2>/dev/null || pwd)\" if ! command -v nu &>/dev/null; then exit 0 fi export ONTOREF_ACTOR=developer echo \"## Project Context (auto-loaded at session start)\" echo \"\" ontoref describe project --fmt text 2>/dev/null || true echo \"\" ontoref describe state 2>/dev/null || true chmod +x .claude/hooks/session-context.sh 2. Add the following to .claude/settings.local.json (merge into existing JSON): \"hooks\": { \"SessionStart\": [ { \"hooks\": [ { \"type\": \"command\", \"command\": \".claude/hooks/session-context.sh\" } ] } ] } 3. Generate the static fallback file: ONTOREF_ACTOR=developer ontoref describe project --fmt text > .claude/project-context.md 4. Add the import at the top of .claude/CLAUDE.md (immediately after the # heading): @.claude/project-context.md 5. In reflection/hooks/git-event.nu, add regeneration of project-context.md on post-merge/post-checkout. After the mode-detect call, insert: let context_file = $\"($ontoref_root)/.claude/project-context.md\" if ($context_file | path parent | path exists) { let r = (do { ^nu $wrapper describe project --fmt text } | complete) if $r.exit_code == 0 { $r.stdout | save --force $context_file } } ", }