We welcome contributions from humans and AI systems alike. This document describes how to contribute effectively.
- Read
CLAUDE.md— the comprehensive project guide - Read
ROADMAP.md— find work that needs doing - Read the relevant
docs/files for the area you're working in - Check open issues — someone may already be working on what you're planning
- Implement primitives (see layer specs in
docs/layers/) - Implement store backends (Postgres, SQLite, DynamoDB, etc.)
- Implement language packages (Rust, Python, .NET, etc.)
- Fix bugs
- Improve test coverage
- Performance improvements (with benchmarks proving the improvement)
- Improve existing docs
- Add examples
- Translate docs
- Write tutorials
- Propose new primitives (RFC process)
- Propose interface changes (RFC process)
- Review and discuss open RFCs
- Find or create an issue — Every PR should reference an issue or roadmap item
- Fork and branch — Branch from
main, name your branch descriptively - Implement — Follow coding standards for your language (
docs/coding-standards/) - Test — Meet coverage thresholds (see
CLAUDE.md) - Self-audit — Before submitting, review your own code thoroughly:
- Run through the code multiple times
- Check for logic errors, race conditions, missing error handling
- Verify hash chain integrity is maintained
- Verify all events have causal links
- Check test coverage meets thresholds
- Ensure docs are updated for any interface changes
- Look for security issues
- Keep auditing until you find no more issues
- Submit PR — Use the PR template. Describe what and why.
- Review — Expect feedback. Address all comments. This is infrastructure — correctness matters.
Changing a public interface affects everyone building on EventGraph. These changes require discussion before implementation.
- Open a GitHub Issue using the RFC template
- Describe: what you want to change, why, and the impact on existing code
- Wait for community discussion (minimum 7 days for significant changes)
- If approved, implement and submit a PR
- Include migration guidance for existing users
- Check
docs/layers/— does your primitive fit an existing layer? - Open a GitHub Issue using the Primitive template
- Describe: the primitive's purpose, which layer it belongs to, what gap it fills, its event types, state schema, and default behaviour
- If approved, implement following the primitive implementation guide in
CLAUDE.md
- Public interfaces must be documented
- Every primitive must have tests
- No silent failures — errors must be visible
- Hash chain integrity is non-negotiable
- Causal links on every event are non-negotiable
See docs/coding-standards/ for your language. If standards don't exist for your language yet, propose them as part of your first PR.
| Package | Minimum Coverage |
|---|---|
| Core (event, store, bus, primitive, tick) | 90% |
| Protocol (EGIP, envelopes, trust) | 85% |
| Primitive implementations | 80% |
| Utilities and helpers | 70% |
PRs that decrease coverage below these thresholds will not be merged.
Use conventional commits:
feat: add InMemoryStore conformance tests
fix: correct hash chain verification for empty graphs
docs: update primitive implementation guide
refactor: extract common store logic into shared interface
test: add edge cases for causal traversal
Keep the first line under 72 characters. Add a body if the change needs explanation.
If you're contributing via Claude Code, Cursor, Copilot, or any AI tool:
- Read
CLAUDE.md— it's written for you - Your contributions are held to the same standards as human contributions
- Self-audit thoroughly before submitting
- Include
Co-Authored-Byin your commit messages - Don't guess at architecture decisions — read the docs or ask in an issue
See CODE_OF_CONDUCT.md. Be decent. Build things that help people.
Open a GitHub Issue. Tag it with question.