Thank you for your interest in contributing to Igor v0. This document provides guidelines for contributing to the project.
Igor is an experimental runtime for autonomous mobile agents. Development follows core principles:
Survival-Oriented Runtime: Agents must be able to checkpoint state, migrate between nodes, and survive infrastructure failure without external intervention.
Decentralized Infrastructure: No centralized coordinator or platform. Nodes are peer-to-peer participants that provide execution services autonomously.
Deterministic Execution: Agent behavior must be reproducible given the same state. Explicit state management over implicit assumptions.
Security-First Sandboxing: Agents execute in WASM sandboxes with strict memory limits and capability restrictions. Safety through isolation.
Minimal Scope: Igor v0 focuses on proving autonomous agent survival is feasible. Features outside this scope are deferred or rejected.
Fail Loudly: Invariant violations cause immediate errors. Correctness over graceful degradation.
See docs/philosophy/OVERVIEW.md for project overview and design philosophy.
Igor uses bootstrap-driven toolchain management for deterministic builds.
Single-command setup:
make bootstrapThis runs scripts/bootstrap.sh which:
- Verifies Go 1.25.4 is installed
- Installs golangci-lint v1.63.4 (from tools.go)
- Installs goimports (from tools.go)
- Downloads all module dependencies
- Installs Git pre-commit hooks
- Verifies build succeeds
- Runs quality checks
Why bootstrap-driven:
Igor's philosophy of "deterministic behavior preferred" extends to the development toolchain. The bootstrap script is the single source of truth for:
- Tool versions (read from tools.go and go.mod)
- Installation procedures
- Environment verification
This ensures:
- CI and local environments are identical
- No version drift between contributors
- Reproducible across machines
- Predictable linter and formatter behavior
Toolchain versions:
- Go 1.25.4 (required)
- golangci-lint v1.63.4 (locked in go.mod via tools.go)
- goimports (latest, locked in go.mod via tools.go)
- TinyGo 0.40.1+ (optional, for agent development)
See docs/governance/TOOLCHAIN.md for upgrade procedures.
Required:
- Go 1.25+ (install)
- TinyGo (install)
- golangci-lint (install)
- goimports:
go install golang.org/x/tools/cmd/goimports@latest
git clone https://github.com/simonovic86/igor.git
cd igor
make buildmake testmake check # Runs fmt-check, vet, lintSee docs/governance/DEVELOPMENT.md for detailed development guide.
-
Install Git hooks (first time only):
./scripts/install-hooks.sh
-
Run all quality checks:
make check # Runs fmt-check, vet, lint, test make precommit # Alias for check
-
Build successfully:
make build
-
Update documentation if adding features or changing behavior
The pre-commit hook automatically runs make check on every commit. Fix all issues before committing.
Small, Focused Changes:
- One logical change per PR
- Avoid mixing refactoring with feature addition
- Split large changes into sequential PRs
Tests Required:
- Add tests for new functionality
- Ensure existing tests pass
- Aim for test coverage of critical paths
Documentation Updates:
- Update relevant docs/ files if behavior changes
- Update DEVELOPMENT.md if workflow changes
- Update constitutional specs only with maintainer approval (see docs/governance/SPEC_GOVERNANCE.md)
Clear Description:
- Explain what the PR does and why
- Reference related issues if applicable
- Describe testing performed
Use conventional commits format:
<type>(<scope>): <subject>
<optional body>
<optional footer>
feat- New featurefix- Bug fixdocs- Documentation changeschore- Tooling, dependencies, configurationrefactor- Code restructuring without behavior changetest- Test additions or correctionsperf- Performance improvements
Examples:
runtime- WASM execution engineagent- Agent lifecyclemigration- Migration protocolstorage- Checkpoint storagep2p- Networking layerdev- Developer tooling
feat(migration): add multi-hop routing support
Implements relay-based migration for agents crossing
network boundaries.
Closes #42
---
fix(agent): correct budget calculation during tick timeout
Previously, timed-out ticks still deducted budget. Now budget
deduction only occurs for successful tick execution.
Fixes #38
---
docs(architecture): clarify checkpoint binary format
Added byte-level layout diagram for checkpoint structure
including budget metadata encoding.
---
chore(deps): update libp2p to v0.48.0
Includes security fixes and performance improvements.
- Use imperative mood ("add" not "added")
- Keep subject line under 72 characters
- Capitalize subject line
- No period at end of subject
- Separate subject from body with blank line
- Wrap body at 72 characters
- Explain what and why, not how
Reviews prioritize:
- Correctness - Does the code work as intended?
- Safety - Are invariants maintained?
- Maintainability - Can future contributors understand this?
- Clarity - Is the intent obvious?
Performance optimization is secondary to correctness.
- Reviewers provide feedback on code, design, and documentation
- Author addresses feedback through discussion or changes
- Approval indicates code meets quality standards
- Merge after approval from code owners
- Respond to all review comments (even if just acknowledging)
- Push updates to the same branch
- Mark conversations as resolved when addressed
- Request re-review after substantial changes
When updating README, repository description, or GitHub metadata:
Maintain discoverability through technical accuracy:
- Use keywords from docs/governance/KEYWORDS.md
- Avoid marketing hype or exaggerated claims
- Preserve experimental status clarity
- Keep technical credibility as priority over SEO
Preserve canonical tagline:
- "Runtime for survivable autonomous agents"
- Do not introduce variations without approval
See docs/governance/KEYWORDS.md for complete keyword governance.
- Use
gofmt(enforced by CI) - Use
goimportsfor import organization - Run
make fmtbefore committing
- Use clear, descriptive names
- Avoid abbreviations unless standard (ctx, err, pkg)
- Exported names must be clear without package context
- Always check errors
- Use
fmt.Errorfwith%wfor wrapping - Provide context in error messages
- Log errors with structured logging
- Document all exported functions and types
- Explain non-obvious logic
- Avoid redundant comments
- Use godoc conventions
- GitHub Issues - Bug reports, feature proposals, questions
- Pull Requests - Code review and technical discussion
- Discussions - General project direction (if enabled)
- Search existing issues first
- Provide context and specific details
- Include relevant logs or error messages
- Be respectful and patient
Include:
- Steps to reproduce
- Expected behavior
- Actual behavior
- Environment (OS, Go version, etc.)
- Relevant logs or error output
Use issue template if available.
- Bug fixes
- Documentation improvements
- Test coverage additions
- Example agents
- Performance analysis
- Security audits
- New features
- Breaking changes
- Architecture modifications
- Major refactoring
Open an issue to discuss before investing significant effort.
Per the design philosophy (see docs/philosophy/OVERVIEW.md), the following are explicitly out of scope:
- Agent marketplaces
- Reputation systems
- Staking or token economics
- AI / LLM functionality
- Multi-agent coordination frameworks
- Advanced security systems
- Distributed consensus
Proposals in these areas will be declined.
- Read docs/governance/DEVELOPMENT.md for setup help
- Read docs/runtime/ARCHITECTURE.md for system understanding
- Check existing issues for similar questions
- Open a new issue if stuck
Contributors are recognized through:
- Git commit authorship
- Pull request history
- CONTRIBUTORS file (if established)
- Release notes mentions
By contributing, you agree that your contributions will be licensed under the Apache License 2.0, the same license that covers the project. See LICENSE for details.