A fresh install now activates only the safety pack; discipline hooks and agents are opt-in via an onboarding step (step 6) or `kei configure`. "People don't need Rust-only" — they pick their own stack. - _primitives/hook-packs.toml: SSoT mapping pack -> hooks, stack -> packs + agent groups. safety always on; evidence/observability/epistemic/ orchestration/git-guard/stack-rust opt-in. rust-first/no-python only under the systems stack; git-guard (no-github-push) opt-in only, pulled by no stack. - lib-profile: extract generic _toml_array (reused by lib-packs); profile_members becomes a thin wrapper (no behavior change). - lib-packs: pack/stack/agent resolvers + selection loader. - lib-hooks: filter_snippet_by_packs (install-time allowlist) + prune_kit_hooks (reconfigure removes deselected kit hooks, keeps foreign ones); activate_hooks rewired to prune + filter + merge. No custom settings.json fields (/doctor safe). - lib-agents: install_manifests filters by stack agent set (empty = install all). - onboarding: pick_stack step (reuse _onb_read_choice), persists stack_profile + enabled_packs to onboarding.toml; i18n STR_* added. - bin/kei configure -> scripts/kei-configure.sh (re-pick without reinstall); install stamps ~/.claude/.kei-kit-dir. - numeric-claims-guard: money regex no longer matches shell positionals ($1..$9); requires decimal / unit / 2+ digits / tilde. Real money + time still caught. - gate one-liner added to 8 discipline hooks (runtime toggle via hooks-control). Verified end-to-end (scratch HOME): fresh=safety only; evidence pack adds numeric+citation; systems stack wires rust-first + 14 base/systems agents (no data-science/swift); reconfigure-shrink prunes kit hooks but keeps a foreign hook; settings schema clean; assembler golden 3/3. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
21 KiB
KeiSeiKit Hooks & Blocks Catalogue
Comprehensive index of all 55 hooks and 85 blocks in KeiSeiKit-public as of 2026-05-02.
Structure:
- Hooks (55): Claude Code safety + observability rules, wired into
.claude/settings.jsonhook events (PreToolUse, PostToolUse, UserPromptSubmit, Stop). - Blocks (85): Reusable architectural patterns covering API design, auth, databases, deployment, security, stacks, testing, rules, and domain-specific practices.
Part 1: Hooks Reference
All hooks live under hooks/ directory. Format: | Hook Name | Event | Severity | Purpose | Bypass Env |
Event types:
- PreToolUse:Bash — called before any shell command
- PreToolUse:Edit|Write — called before modifying files
- PreToolUse:Agent — called before spawning sub-agent
- PostToolUse:Agent — called after agent returns
- PostToolUse:Bash — called after shell command completes
- UserPromptSubmit — called when user submits a prompt
- Stop — called when session ends
Severity levels:
- block (exit 2) — Claude Code aborts the tool call
- enforce (exit 1) — error; must fix before retrying
- warn (exit 0 + stderr) — advisory message, tool call proceeds
- remind (exit 0 + stderr on trigger) — passive reminder
- advisory — informational, never blocks
Hook packs (opt-in posture)
A fresh install activates only the safety pack (plus cosmetic/infra hooks).
Discipline packs are opt-in, chosen during onboarding (step 6) or later via
kei configure. SSoT for pack membership + stack profiles is
_primitives/hook-packs.toml. Packs: safety (always on), evidence,
observability, epistemic, orchestration, git-guard (opt-in only),
stack-rust (only under the systems stack profile). Discipline hooks also
respect runtime toggling via KEI_DISABLED_HOOKS / KEI_HOOK_PROFILE (see the
hooks-control skill).
Core Safety Hooks
| Hook | Event | Severity | Purpose | Bypass Env |
|---|---|---|---|---|
| no-github-push.sh | PreToolUse:Bash | block | Block accidental push / repo-create to github.com (opt-in; for code kept on a private remote) | KEI_NO_GITHUB_PUSH_BYPASS |
| no-python-without-approval.sh | PreToolUse:Bash | block | Optional Rust-first policy — Python requires explicit justification (opt-in, stack-gated) | none |
| rust-first.sh | UserPromptSubmit | remind | Remind about Rust-first default for new work | none |
| secrets-pre-guard.sh | PreToolUse:Edit|Write | block | Detect hardcoded API keys, tokens, private keys before commit | KEI_SECRETS_GUARD_BYPASS |
| destructive-guard.sh | PreToolUse:Bash | block | Block dangerous commands (rm -rf /, git reset --hard main, truncate) | none |
| tomd-preread.sh | PreToolUse:Read | warn | Auto-convert .docx, .xlsx, .pptx to .md before reading | none |
Disk & Resource Management
| Hook | Event | Severity | Purpose | Bypass Env |
|---|---|---|---|---|
| disk-headroom-check.sh | PreToolUse:Bash | block/warn (tiered) | RULE 0.17: 4-tier ladder (≥20G silent, 10-20 warn, 5-10 warn+suggest, 2-5 block-heavy, <2 hard-block) | DISK_GUARD_BYPASS |
| disk-reclaim.sh | launchd 03:30 | advisory | Nightly cleanup: orphan worktrees + stale target/ dirs (168h+ old, clean, unpushed, no live PID) | none |
Numeric Claims & Evidence (RULE 0.18)
| Hook | Event | Severity | Purpose | Bypass Env |
|---|---|---|---|---|
| numeric-claims-guard.sh | PreToolUse:Edit|Write | enforce | Block time/cost/effort claims without [REAL:] / [FROM-JOURNAL:] / [ESTIMATE-HTC:] marker |
RULE_017_BYPASS |
| numeric-claims-record.sh | Post-Write | block | Auto-log numeric claims to memory/time-metrics/*.jsonl |
NUMERIC_CLAIMS_RECORD_BYPASS |
| chat-numeric-prewarn.sh | UserPromptSubmit | remind | Inject RULE 0.18 reminder when user prompt contains time/cost keywords | RULE_018_CHAT_BYPASS |
| chat-numeric-postflag.sh | Stop | warn | Flag any bare numerics in last assistant message without evidence marker | RULE_018_CHAT_BYPASS |
Agent Lifecycle & Status Truth (RULE 0.12, 0.16)
| Hook | Event | Severity | Purpose | Bypass Env |
|---|---|---|---|---|
| agent-fork-logger.sh | PreToolUse:Agent | advisory | Log agent fork to ledger (RULE 0.12) — non-blocking, silent on missing kei-ledger | none |
| agent-event-spawn.sh | PreToolUse:Agent | block | Record parent-child agent relationship in /tmp/kei-active-children.tsv | KEI_EVENTS_BYPASS |
| agent-event-done.sh | PostToolUse:Agent | block | Mark agent as done in active-children ledger | KEI_EVENTS_BYPASS |
| agent-fork-done.sh | PostToolUse:Agent | block | Transition ledger row from 'running' → 'done' or 'fail' (pairs with agent-fork-logger) | none |
| agent-outcome-backfill.sh | PostToolUse:Agent | block | Parse STATUS-TRUTH MARKER from agent transcript + backfill shipped/stubs/cargo-check/behaviour-verified (RULE 0.16) | OUTCOME_BACKFILL_BYPASS |
| agent-stub-scan.sh | PostToolUse:Agent | enforce | RULE 0.16: validate shipped=functional ⟹ stubs=0 consistency; 7-day WARN → then ENFORCE | STATUS_TRUTH_BYPASS |
| agent-heartbeat-tick.sh | PostToolUse:* | advisory | Heartbeat: auto-update progress.json in agent's .claude/agents/<id>/ dir every 30s |
KEI_PING_BYPASS |
| tool-use-event.sh | PostToolUse:* | block | Flatten tool response + attribute to parent agent via active-children ledger | KEI_EVENTS_BYPASS |
| extract-task-durations.sh | Pre/Post Agent | block | Record agent start/end times in memory/time-metrics/tasks.jsonl |
none |
| task-timer.sh | Pre/Post Agent + Stop | block | Master timer: compute wall-clock duration per task + session | none |
Code Quality & Architecture
| Hook | Event | Severity | Purpose | Bypass Env |
|---|---|---|---|---|
| citation-verify.sh | PreToolUse:Edit|Write | block | RULE 0.4: block academic citations without [VERIFIED: url] or [UNVERIFIED] marker |
none |
| auto-dev-guard.sh | PreToolUse:Edit | warn | Warn on frontend (.tsx/.ts/.svelte/.vue/.dart) or DB-layer changes without corresponding tests | none |
| auto-register-on-edit.sh | PostToolUse:Edit | block | When substrate file (skill/hook/block/capability/role) edited → auto-register in manifest registry | AUTO_REGISTER_BYPASS |
| auto-encyclopedia-refresh.sh | PostToolUse:Edit | warn | Refresh docs/encyclopedia/ after substrate file changes (pairs with auto-register-on-edit) | AUTO_ENCYCLOPEDIA_BYPASS |
| no-hand-edit-agents.sh | PreToolUse:Edit | block | Prevent hand-editing .claude/agents/<id>/ — edit manifest instead (RULE 0.12) |
none |
| post-write-check.sh | PostToolUse:Write | warn | Async check: warn on large files (>5MB) + hardcoded secrets | none |
| post-commit-audit.sh | PostToolUse:Bash (git commit) | remind | Remind about double audit after commit | none |
| decompose-rules-on-edit.sh | PreToolUse:Edit (~/.claude/rules/*.md) | warn | When rule file edited → re-run kei-decompose to update RULES.md registry | DECOMPOSE_RULES_BYPASS |
Observability & Session State
| Hook | Event | Severity | Purpose | Bypass Env |
|---|---|---|---|---|
| session-end-dump.sh | Stop | block | Call kei-memory ingest (populate traces/) + kei-sleep-sync.sh (push to memory-repo) |
none |
| skill-record.sh | PostToolUse:Agent | block | Record skill invocation for analytics (never blocks — exit 0 always) | SKILL_RECORD_BYPASS |
| tool-use-event.sh | PostToolUse:* | block | Event logging for agent attribution + wall-clock tracking | KEI_EVENTS_BYPASS |
| check-error-patterns.sh | PostToolUse:* | block | Detect error spikes (≥3 in last 20 calls) → append to audit-backlog.md | none |
| error-spike-detector.sh | PostToolUse:* | block | Rolling 20-call error window; on spike → log pattern + suggest escalation | none |
| milestone-commit-hook.sh | PostToolUse:Bash (git commit) | block | On feat:/refactor:/merge → run kei-memory analyze + append to audit-backlog.md |
none |
| alignment-check.sh | (internal) | block | Track 3-time recurrence: exp6, exp24-28, basecaller forgot alignment | none |
| graph-export-watcher.sh | PreToolUse:Edit | warn | When keimd graph file edited → watch for drift | GRAPH_EXPORT_BYPASS |
| site-wysiwyd-check.sh | PostToolUse:Edit | advisory | After frontend edit → WYSIWYG drift check against dev-server | none |
Sleep Layer & Cloud Agent Triggers (RULE 0.15)
| Hook | Event | Severity | Purpose | Bypass Env |
|---|---|---|---|---|
| sleep-report-tg.sh | (nightly Phase B remote) | block | Cloud agent reads reports/sleep-*.md + sends Telegram summary |
SLEEP_REPORT_TG_BYPASS |
| phase-b-rem.sh | (nightly Phase B REM consolidation) | block | Run kei-conflict-scan + kei-refactor-engine for NREM deep-sleep (v0.13) |
none |
| affect-live-scan.sh | Stop | remind | Pairs with session-end-dump — writes affect file for pattern analysis | AFFECT_LIVE_BYPASS |
Assembly & Manifest Management
| Hook | Event | Severity | Purpose | Bypass Env |
|---|---|---|---|---|
| assemble-agents.sh | PostToolUse:Edit (_manifests/*.toml) | block | When agent manifest edited → rebuild that agent crate | none |
| assemble-validate.sh | PostToolUse:Edit (_manifests/) | block | Validate all manifests on edit; failure → block commit | none |
| no-hand-edit-agents.sh | PreToolUse:Edit (.claude/agents/) | block | Prevent hand-editing agent directories | none |
Safety & Enforcement
| Hook | Event | Severity | Purpose | Bypass Env |
|---|---|---|---|---|
| stop-verify.sh | Stop | advisory | Check for uncommitted changes + running Modal compute before session ends | none |
| orchestrator-dirty-check.sh | UserPromptSubmit | advisory | Warn if orchestrator has uncommitted agent output from prior waves | none |
| orchestrator-branch-check.sh | PreToolUse:Agent | remind | Remind that orchestrator should be on feat/* branch (not main) before spawning agent | ORCHESTRATOR_META |
| block-dangerous.sh | (internal) | block | Block dangerous patterns (defined inline) | none |
| safety-guard.sh | (internal) | block | Generic safety pattern matcher | none |
Specialized Domain Hooks
| Hook | Event | Severity | Purpose | Bypass Env |
|---|---|---|---|---|
| no-downgrade.sh | PreToolUse:Edit|Write | enforce | RULE -1: when problem found in Edit/Write, require 3+ solution paths (not defeatism) | none |
| recurrence-suggest.sh | UserPromptSubmit | remind | RULE 0.10: detect same mistake ≥2× in session → suggest /escalate-recurrence skill |
none |
| agent-capability-check.sh | (internal) | block | Check agent capability before spawn | none |
| agent-capability-verify.sh | (internal) | block | Verify agent claimed capability matches manifest | none |
Part 2: Blocks Reference
All blocks live under _blocks/ directory. Format: | Block Name | Category | Purpose |
Categories:
- api — HTTP/API design, versioning, conventions
- auth — authentication, authorization, sessions
- ci — continuous integration + release
- db — databases, migrations, SQL
- deploy — cloud/VPS deployment targets
- docs — documentation conventions
- domain — domain-specific rules (ML, secrets, paid APIs)
- evidence — grading framework
- memory — session memory protocol
- mode — reasoning modes (first-principles, maximalist, skeptic, etc.)
- obs — observability (metrics, logs, traces)
- path — file system paths
- pipeline — multi-phase project templates
- rule — development discipline rules
- scraper — web scraping tiers + patterns
- security — hardening, patching, audit logging
- stack — tech stack reference patterns
- test — testing strategies
API & Integration (8 blocks)
| Block | Purpose |
|---|---|
| api-anthropic.md | Anthropic API integration (models, tokens, rate limits) |
| api-apify.md | Apify web scraping API (actors, storage, datastores) |
| api-elevenlabs.md | ElevenLabs TTS API (voices, models, billing) |
| api-fal-ai.md | fal.ai image generation API (models, async webhooks) |
| api-graphql.md | GraphQL design conventions (schema, queries, subscriptions) |
| api-openapi-first.md | OpenAPI/Swagger as SSoT for API contracts |
| api-rest-conventions.md | REST verbs, status codes, resources, idempotency, ETags (RFC 9110, 9457) |
| api-versioning-pagination-ratelimit.md | API versioning strategy, cursor/offset pagination, rate-limit headers |
Authentication & Authorization (4 blocks)
| Block | Purpose |
|---|---|
| auth-authorization.md | RBAC, ABAC, scopes, permission delegation |
| auth-oauth2-oidc.md | OAuth 2.0 / OpenID Connect flows (authz code, PKCE, ID tokens) |
| auth-passkeys.md | WebAuthn / FIDO2 passkey registration + assertion |
| auth-sessions.md | Session management (secure cookies, CSRF tokens, refresh tokens) |
CI/CD & Release (3 blocks)
| Block | Purpose |
|---|---|
| ci-forgejo-actions.md | Forgejo Actions (internal runner, workflow.yml, secrets) |
| ci-github-actions.md | GitHub Actions workflows (matrix, artifacts, deployment) |
| ci-release-automation.md | Semantic versioning, changelog, auto-release tags |
| ci-security-gate.md | Pre-commit scanning (secrets, CVE, licenses) |
Database (5 blocks)
| Block | Purpose |
|---|---|
| db-drizzle.md | Drizzle ORM (schema, relations, migrations in TypeScript) |
| db-migration-hygiene.md | Reversible migrations, zero-downtime deployments, test safety |
| db-postgres.md | PostgreSQL (setup, performance tuning, connection pooling) |
| db-sqlite.md | SQLite (embedded, dev fixtures, backup strategy) |
| db-sqlx.md | sqlx Rust macro (compile-time checked SQL, migrations) |
Deployment (7 blocks)
| Block | Purpose |
|---|---|
| deploy-aws-ec2.md | AWS EC2 instances, security groups, Elastic IPs |
| deploy-cloudflare.md | Cloudflare Workers, KV, R2, Pages (edge compute + CDN) |
| deploy-docker.md | Docker image best practices, multi-stage builds, scanning |
| deploy-hetzner-cloud.md | Hetzner Cloud VPS (volume, networking, backup) |
| deploy-local-only.md | Local/private deployment (Tailscale, no public IP) |
| deploy-modal.md | Modal.com GPU cloud (Functions, Volumes, checkpointing, KILL GUARD) |
| deploy-vps-generic.md | Generic VPS pattern (Systemd, Caddy, SSH hardening) |
Documentation (5 blocks)
| Block | Purpose |
|---|---|
| docs-architecture-diagrams.md | Mermaid, C4, ADR diagrams for architecture |
| docs-claude-md.md | CLAUDE.md project-specific instructions + umbrella rules |
| docs-decisions-adr.md | Architecture Decision Records (format, storage, reversals) |
| docs-readme-template.md | Minimal README structure (goal, quickstart, docs link) |
| docs-runbook.md | Operational runbooks for prod incidents, backup/restore, scaling |
Domain-Specific Rules (3 blocks)
| Block | Purpose |
|---|---|
| domain-has-secrets.md | Projects with credentials / keys / auth (setup, RULE 0.8) |
| domain-ml-training.md | ML experiment discipline (pre-reg, math-first, observability) |
| domain-paid-apis.md | Cost guard for Modal, AWS, fal.ai, Apify billing |
Evidence & Grading (1 block)
| Block | Purpose |
|---|---|
| evidence-grading.md | E1-E6 evidence grades (E1=fact, E6=speculation) |
Memory & Session (1 block)
| Block | Purpose |
|---|---|
| memory-protocol.md | 3-layer memory architecture (CLAUDE.md → memory/{project}.md → MEMORY.md index) |
Reasoning Modes (6 blocks)
| Block | Purpose |
|---|---|
| mode-devils-advocate.md | Challenge assumptions; find counter-examples |
| mode-first-principles.md | Derive from axioms, question inheritance |
| mode-matrix.md | Multi-dimensional tradeoff analysis (2D/3D matrices) |
| mode-maximalist.md | Add all features; find essential ones via ablation |
| mode-minimalist.md | Start with one thing; add only if it changes behavior |
| mode-skeptic.md | Assume negative; require evidence |
Observability (3 blocks)
| Block | Purpose |
|---|---|
| obs-metrics.md | Prometheus/StatsD metrics, cardinality, alerting |
| obs-structured-logs.md | JSON logs, correlation IDs, log levels |
| obs-traces.md | Distributed tracing (OpenTelemetry, span attributes, sampling) |
Paths & Configuration (3 blocks)
| Block | Purpose |
|---|---|
| path-user-hooks.md | User-level hook paths (~/.claude/hooks/) |
| path-user-memory.md | User-level memory paths (~/.claude/memory/) |
| path-user-rules.md | User-level rules paths (~/.claude/rules/) |
Pipeline Templates (1 block)
| Block | Purpose |
|---|---|
| pipeline-5phase-template.md | 5-phase multi-agent orchestration (Setup, Foundations A-B, Implementation, Testing, Deploy) |
Rules & Discipline (6 blocks)
| Block | Purpose |
|---|---|
| rule-double-audit.md | Phase 1 (find) → Phase 2 (verify) → Phase 3 (report) → Phase 4 (fix) |
| rule-error-budget.md | 3-level escalation: attempt 2 fail → review; attempt 3 fail → research; stuck → escalate |
| rule-math-first.md | Derive prediction before numerics; ask "what is unnecessary?" |
| rule-pre-dev-gate.md | Analogues check, stack compatibility, duplication check before coding |
| rule-pure-click-contract.md | Skill response = pure clicks (AskUserQuestion) — never free-text input |
| rule-test-first.md | Critical paths: tests before code (TDD); rest: tests with code |
Scraping (3 blocks)
| Block | Purpose |
|---|---|
| scraper-free-tier.md | YouTube API v3, Telegram Telethon, GitHub API, Twitter twscrape |
| scraper-paid-tier.md | Apify, Bright Data (fallback, cost-guarded) |
| scraper-unified-output.md | UnifiedProfile / UnifiedContent normalizer across all sources |
Security (5 blocks)
| Block | Purpose |
|---|---|
| security-audit-logging.md | Audit trail logging (who, what, when, where, result) |
| security-firewall-ufw.sh | UFW firewall rules (inbound/outbound, rate-limit) |
| security-patching.md | OS + dependency patching cadence (monthly, emergency) |
| security-ssh-hardening.md | SSH config (key-only, no password, limited users, audit logging) |
| security-tls-caddy.md | Caddy reverse proxy (Let's Encrypt ACME, auto-renewal, HTTPS redirect) |
Tech Stacks (14 blocks)
| Block | Purpose |
|---|---|
| stack-astro.md | Astro.build SSR framework (components, islands, integrations) |
| stack-embedded-stm32.md | STM32 microcontroller (HAL, firmware, JTAG debug) |
| stack-fastapi-postgres.md | FastAPI + PostgreSQL (asyncio, SQLAlchemy async, dependency injection) |
| stack-flutter.md | Flutter mobile + web (Riverpod state, Clean Architecture, testing) |
| stack-go-server.md | Go HTTP server (chi router, context, middleware, graceful shutdown) |
| stack-nextjs.md | Next.js 14+ app router (server components, API routes, middleware) |
| stack-python-ml.md | Python ML (PyTorch, scikit-learn, wandb logging, reproducibility) |
| stack-react-vite.md | React + Vite (SPA, hooks, component patterns) |
| stack-rust-axum.md | Rust Axum web framework (extractors, middleware, error handling) |
| stack-rust-cli.md | Rust CLI (clap, error handling, testing, benchmarking) |
| stack-sveltekit.md | SvelteKit (reactive components, server load functions, API routes) |
| stack-swift-ios.md | Swift iOS (SwiftUI, state management, networking) |
| stack-swift-spm.md | Swift Package Manager (library, executable, tests, dependencies) |
| stack-tailwind.md | Tailwind CSS (utility-first, JIT, dark mode, component plugins) |
Testing (4 blocks)
| Block | Purpose |
|---|---|
| test-e2e.md | End-to-end testing (Playwright, browser automation, visual regression) |
| test-fuzz.md | Fuzzing / property-based testing (cargo-fuzz, proptest) |
| test-load.md | Load testing (k6, locust, capacity planning) |
| test-property.md | Property-based testing (invariants, shrinking, counterexamples) |
Baseline (1 block)
| Block | Purpose |
|---|---|
| baseline.md | Inherit from ~/.claude/CLAUDE.md — NO DOWNGRADE, NO HALLUCINATION, PLAN MODE FIRST, CONSTRUCTOR PATTERN, THINK BEFORE CODE, SURGICAL CHANGES, GOAL-DRIVEN |
Summary Stats
Hooks: 55 total
- block (exit 2): ~18 hooks (hard deny)
- enforce (exit 1): ~6 hooks (error state)
- warn (exit 0 + stderr): ~15 hooks (advisory + proceed)
- remind / advisory: ~16 hooks (passive)
Blocks: 85 total
- API & Integration: 8
- Auth: 4
- CI/CD: 4
- Database: 5
- Deployment: 7
- Documentation: 5
- Domain: 3
- Evidence: 1
- Memory: 1
- Modes: 6
- Observability: 3
- Paths: 3
- Pipelines: 1
- Rules: 6
- Scraping: 3
- Security: 5
- Stacks: 14
- Testing: 4
- Baseline: 1
Usage Examples
How to add a new hook
- Write
hooks/my-hook.shwith shebang#!/bin/shor#!/bin/bash - Include event name in first 3 comment lines:
# my-hook.sh — PreToolUse:Edit advisory hook - Define bypass env at top:
if [ "${MY_HOOK_BYPASS:-0}" = "1" ]; then exit 0; fi - Exit with appropriate code (0, 1, or 2)
- Register in
.claude/settings.jsonunderhooks.PreToolUse/hooks.PostToolUse/ etc.
How to use a block
- Reference the block in your project CLAUDE.md:
See [[../../../_blocks/api-rest-conventions]]. - The block is a living template — copy relevant sections, adapt to your project.
- Blocks are shared across KeiSeiKit projects; do NOT fork them.
- Update a block if you discover a better practice → file a PR to main.
Maintained by: KeiSeiKit orchestrator
Last updated: 2026-05-02
Source: _blocks/ and hooks/ directories