Contributing to ROWM
Version: 1.0.0
Status: Open for Contributions
Authors: Ahmad Ali Parr, Jessica SNAPKITTYWEST
Welcome
ROWM is an open-source project seeking contributors in:
- Formal verification (Agda, Ada/SPARK, Lean 4 integration)
- Language support (new polyglot parsers)
- Performance optimization (VM speed, compilation)
- Security auditing (threat model review, penetration testing)
- Documentation (guides, examples, API docs)
- Testing (unit tests, integration tests, property-based tests)
Core Values
- Logic Over Assumptions β Every claim is backed by Prolog facts
- Evidence Over Assertions β No feature ships without passing tests
- Reproducibility Over Convenience β Build and test results must be deterministic
- Transparency Over Secrecy β Threat model and known limitations are public
- Verification Over Belief β Formal proofs preferred over documentation
Getting Started
Prerequisites
- Rust 1.78+ (install via rustup.rs)
- GNU M4 (for morphing engine)
- SWI-Prolog 8.x+ (for logic engine)
- Git
Build
git clone https://github.com/SNAPKITTYWEST/rowm-polymorphic-notebook.git
cd rowm-polymorphic-notebook
cargo build --release --workspace
Run Tests
# Rust tests
cargo test --all --lib
# Prolog tests
swipl -f logic/facts/*.pl -f logic/rules/*.pl -f logic/queries/test_queries.pl -t run_tests
# Release readiness check
swipl -f logic/facts/*.pl -f logic/rules/*.pl -t "release_ready(R), format('Result: ~w~n', [R])."
Development Workflow
1. Pick an Issue
Check GitHub Issues for:
- Bugs with
#auditlabel (security/correctness) - Features with
#featurelabel - Docs with
#documentationlabel
2. Create a Branch
git checkout -b fix/issue-name # for bug fixes
git checkout -b feature/issue-name # for new features
git checkout -b docs/issue-name # for documentation
3. Implement & Test
- Write code following project style (see below)
- Add tests for all new functionality
- Run full test suite:
cargo test --all --lib - Verify Prolog logic:
swipl ...queries
4. Commit with Evidence
Include concrete evidence in commit message:
fix: Authorization gate now properly rejects tier_2 agents
Fixes #42: dispatch_gated/5 now checks agent_trust_level before returning true.
Boundary condition: Timestamp < ExpiresAt (not <=).
Evidence:
- Test case: test_tier2_agent_dispatch_denied passes
- Regression: test_expired_capability_acceptance now correctly fails
- Prolog validation: readiness_check('no_revoked_capabilities', true) passes
Co-Authored-By: Claude <noreply@anthropic.com>
5. Create Pull Request
git push origin feature/issue-name
gh pr create --fill
Include in PR description:
- What this fixes (or adds)
- How to test it
- Relevant documentation changes
- Any known limitations
6. Review & Merge
- Address code review feedback
- Re-run tests after changes
- Maintain focus on single issue (don't add unrelated fixes)
- Once approved: repo maintainers merge
Code Style
Rust
- Use
cargo fmtbefore committing:cargo fmt --all - Use
cargo clippyfor linting:cargo clippy --all --lib - No unsafe code without explicit
// SAFETY: ...comment explaining why - Prefer
Result<T>over panicking for errors - Max line length: 100 characters (soft limit)
Example:
// Good: explicit error handling
pub fn load_proof(path: &str) -> Result<ProofTerm> {
let bytes = std::fs::read(path)?;
serde_json::from_slice(&bytes).map_err(|e| anyhow!("Invalid proof: {}", e))
}
// Avoid: panicking
pub fn load_proof_bad(path: &str) -> ProofTerm {
serde_json::from_str(&std::fs::read_to_string(path).unwrap()).unwrap()
}
Prolog
- One fact per line (no multi-line facts)
- Comments above rules explaining intent
- Use descriptive predicate names (not
p/2, useauthorization/2) - No anonymous variables (
_) in public predicates
Example:
% Good: clear, documented
% dispatch_gated/5: Sealed authorization entry point
% All external dispatch must pass through this predicate.
dispatch_gated(Agent, Cap, Runtime, Perm, true) :-
agent_active(Agent, true),
agent_trust_level(Agent, Tier),
Tier \= tier_2,
capability_issued(Cap, _, Agent, Runtime, Perms, _, Expires),
\+ capability_revoked(Cap, _),
get_time(Now),
Now < Expires,
member(Perm, Perms),
runtime_active(Runtime, true).
% Avoid: cryptic
p(A, C, R, P, T) :- a(A), tnl(A, TL), TL \= t2, ci(C, _, A, R, PS, _, E),
\+ cr(C, _), gt(N), N < E, m(P, PS), ra(R, T).
Documentation (Markdown)
- Use ATX headers (
#,##, not underlines) - Wrap at 80 characters for readability
- Include code examples with language tags
- Link to related documentation and GitHub issues
Testing
Unit Tests
Write tests in #[cfg(test)] modules:
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_dispatch_gated_rejects_revoked_capability() {
// Arrange
let agent = "forge";
let cap = "capa_revoked";
let runtime = "rust";
let permission = "execute";
// Act
let result = dispatch_gated(agent, cap, runtime, permission, ?);
// Assert
assert_eq!(result, false);
}
}
Integration Tests
Add files to crates/*/tests/:
// tests/integration_test.rs
#[test]
fn test_end_to_end_cell_execution() {
// Full execution: parse β authorize β compile β execute β verify β receipt
}
Prolog Tests
Add to logic/queries/test_queries.pl:
test_dispatch_gated_denies_tier2 :-
\+ dispatch_gated('phantom', 'capa_001', rust, execute, true),
write('β Tier 2 agent correctly denied\n').
Property-Based Tests
Use proptest for randomized testing:
proptest! {
#[test]
fn prop_invariant_preserved(seed in 0u64..1000) {
let mut vm = create_test_vm(seed);
vm.execute().expect("execution must succeed");
assert!(check_all_invariants(&vm));
}
}
Merge Criteria
Before a PR can merge, all of the following must pass:
- Build:
cargo build --release --workspacesucceeds - Tests:
cargo test --all --libpasses (100%) - Linting:
cargo clippyhas no warnings - Format:
cargo fmtproduces no changes - Prolog:
swipl ... release_ready(true)passes - Documentation: Relevant docs updated
- Evidence: Commit message includes test evidence
- No Security Regressions: No removal of authorization checks
- No Unstaged Features: No proto/planned code merged as complete
- Reviewed: At least 1 approving review from maintainer
Adding a New Language to Polyglot Frontend
Step 1: Implement Parser Trait
// crates/polyglot-frontend/src/parsers/mylang.rs
pub struct MyLangParser;
impl Parser for MyLangParser {
fn parse(&self, source: &str) -> Result<Ast> {
// Use tree-sitter or custom parser
let tree = tree_sitter_mylang::parse(source)?;
convert_tree_to_ast(tree)
}
fn language(&self) -> Language {
Language::Mylang
}
}
Step 2: Add Language Enum
// crates/polyglot-frontend/src/language.rs
pub enum Language {
// ... existing languages ...
Mylang,
}
pub impl Language {
pub fn tier(&self) -> LanguageTier {
match self {
Language::Mylang => LanguageTier::Tier4, // or appropriate tier
// ...
}
}
}
Step 3: Register in Registry
// In registry.rs or similar
let mut registry = LanguageRegistry::new();
registry.register(Language::Mylang, Box::new(MyLangParser));
Step 4: Add Tests
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_mylang_parse_simple() {
let source = "x := 10;";
let ast = MyLangParser.parse(source).unwrap();
assert_eq!(ast.root.statements.len(), 1);
}
}
Step 5: Update Documentation
- Add to
docs/API_REFERENCE.md(polyglot-frontend section) - Add to README.md language support table
- Update CONTRIBUTING.md if integration is complex
Adding a New Proof Integration
Step 1: Design Adapter
// crates/proof-validator/src/adapters/myprover.rs
pub struct MyProverAdapter;
impl ProofVerifier for MyProverAdapter {
fn verify(&self, obligation: &ProofObligation, proof: &ProofTerm) -> Result<ProofStatus> {
// Invoke external tool (Agda, Lean, etc.)
// Return status: Proved | Disproved | Manual | Error
}
}
Step 2: Integrate with Validator
// In proof-validator.rs
pub struct ProofValidator {
verifiers: HashMap<String, Box<dyn ProofVerifier>>,
}
impl ProofValidator {
pub fn add_verifier(&mut self, name: &str, verifier: Box<dyn ProofVerifier>) {
self.verifiers.insert(name.to_string(), verifier);
}
}
Step 3: Test End-to-End
#[test]
fn test_proof_verification_with_myprover() {
let obligation = create_test_obligation();
let proof = invoke_myprover(&obligation)?;
assert_eq!(proof.status, ProofStatus::Proved);
}
Security & Audit Contributions
Reporting Security Issues
Do NOT open public issues for security vulnerabilities.
Email security concerns to: [security-contact-TBD]
Include:
- Description of vulnerability
- Proof-of-concept (if applicable)
- Steps to reproduce
- Suggested mitigation
Vulnerability disclosure timeline:
- Report received
- Assessment (48 hours)
- Fix development (1-2 weeks typical)
- Fix release & public disclosure
Audit Contributions
If conducting security audit, provide:
- Threat description and CWE reference
- Reproduction steps
- Severity rating (CVSS or descriptive)
- Suggested remediation
- Proof-of-concept code (if applicable)
Documentation Contributions
Fixing Docs
- Fix typos, unclear sections, broken examples
- Update outdated information
- Add clarifying examples
- Link related documentation
Adding New Docs
- Get consensus via GitHub issue first (avoid writing docs that won't be merged)
- Include with corresponding code changes
- Follow markdown style (see docs/ for examples)
- Keep examples runnable and tested
Community Guidelines
- Be Respectful β All contributors and maintainers are volunteers
- Assume Good Intent β Technical disagreements are not personal
- Focus on Code β Critique code, not contributors
- Share Knowledge β Help newer contributors learn
- No Tolerance for Harassment β We enforce a Code of Conduct
Questions & Support
- General questions: GitHub Discussions
- Implementation questions: GitHub Issues
- Security questions: Private email (see above)
- Design feedback: Pull request comments
Recognition
Contributors are recognized in:
- Git commit author line (Co-Authored-By)
- GitHub contributors graph
- Release notes (for significant contributions)
- Project README (for sustained contributors)
Thank you for contributing to ROWM!
"EVIDENCE OR SILENCE." β Make your contributions count.