An @enchanter-ai product.
Thanks for your interest in contributing. This document captures the conventions every sibling in the enchanter-ai ecosystem follows. Read CLAUDE.md before opening your first PR — it's the binding behavioral contract for the plugin.
- Zero external runtime deps. Hooks: bash + jq only. Scripts: Python 3.8+ stdlib only. If you need a new dep, open an issue first — the bar for adding one is high. Exception candidate under evaluation: tree-sitter Wasm for TypeScript parsing, tracked for Phase 2.
- Named algorithms. Every engine has an ID (
M1–M7) and an academic-style name:[Method] [Domain] [Action]or[Inventor] [Structure]. Derivations live indocs/science/README.md. Active engines at launch: M1 Cousot Interval Propagation, M2 Falleri Structural Diff, M5 Bounded Subprocess Dry-Run, M6 Bayesian Preference Accumulation, M7 Zheng Pairwise Rubric Judgment. - Managed agent tiers. Opus orchestrates / judges disagreement. Sonnet executes loops and default judging. Haiku validates shape and budget-fallback. Never route a Haiku task to Opus.
- Emu-style marketplace. Each sub-plugin ships
.claude-plugin/plugin.json+{agents,commands,hooks,skills,state}/+README.md. - Diagrams from source-of-truth.
docs/architecture/*.mmd+index.htmlare regenerated bydocs/architecture/generate.py. Do not hand-edit. The full architecture narrative is atdocs/architecture/lich-architecture.md. - Non-duplication across siblings. Hydra owns security CWE taxonomy (R3) — Lich consumes
hydra/plugins/vuln-detector/state/audit.jsonlfindings as attention weights, never re-scans. Crow owns change classification (V1, V2) — Lich consumes, never peer-classifies. - Honest numbers. M6 posteriors expose
(α, β), not point estimates. M7 reports Cohen's Kappa per axis. M5 distinguishesconfirmed-bug/timeout-without-confirmation/sandbox-error/input-synthesis-failed— never collapsed into a single binary.
git clone https://github.com/enchanter-ai/lich
cd lich
bash install.sh # pre-flight checks, clone to ~/.claude/plugins/
cd docs/assets && npm install # renderer toolchain (mmdc + puppeteer + mathjax)
cd ../../ && bash tests/run-all.sh # smoke tests- Run the generator.
python docs/architecture/generate.py— regenerates the four.mmddiagrams +index.html. Commit the result. - Run the tests.
bash tests/run-all.sh— every sub-plugin'stests/dir must return zero. - Verify the conduct modules are current.
shared/vis/conduct/*.mdare the universal behavioral contract. Compare against upstream (enchanter-ai/wixie); if they've drifted, rebase before proceeding. - Check the brand standard. Every engine named with an
M[1-9]ID. Every agent tiered. No sibling-identifier leaks (Myers-Diff, Jaccard-Cosine, Aho-Corasick, Markov Drift, etc. — these belong to siblings, not Lich). No hand-edited diagrams. - Verify non-duplication. If your PR adds security-taint detection, Hydra R3 is the owner — send the PR there. If it adds change classification, Crow V1/V2 owns that.
- Verify M5 sandbox caps. Any PR that touches
plugins/lich-sandbox/must retain or strengthen the resource caps (RLIMIT_CPU,RLIMIT_AS,RLIMIT_NOFILE,RLIMIT_FSIZE,signal.alarm). Relaxation requires a documented security review.
Conventional Commits. Scope by sub-plugin slug:
feat(lich-core): add interval widening threshold for language-specific bounds
fix(lich-sandbox): enforce RLIMIT_NOFILE before subprocess.run
feat(lich-preference): add quarterly re-prompt for disabled rules
docs(shared): update conduct/precedent.md with a new failure code
refactor(docs): move diagram config into mermaid.config.json
Scopes: sub-plugin slug (lich-core, lich-sandbox, lich-preference, lich-rubric, lich-python, lich-typescript, lich-verdict, full), shared, docs, tests, or repo for top-level.
Open at https://github.com/enchanter-ai/lich/issues. Include: plugin version (from .claude-plugin/marketplace.json#metadata.version), Claude Code version, platform (POSIX or Windows — relevant for M5), repro steps, expected vs. actual.
Be kind. Debate ideas, not people. The @enchanter-ai ecosystem is built on mutual trust that each sibling respects the others' contracts and event-bus boundaries — don't smuggle Hydra's job into Lich, don't smuggle Crow's classification into Lich. The siblings compose because each stays in its lane.