agentleFS
dannys-code-cornerdannys-code-corner/incan/AGENTS.md

incan

AGENTS.md73 starsChanged 5 days agoApache-2.0View on GitHub

Incan is a Python-like language that compiles to Rust. The compiler itself is written in Rust and generates native Rust code via an IR-based pipeline. This document contains guidance for AI agents working on the codebase. CRITICAL — NO .unwrap() / .expect() ANYWHERE. This is the single most important rule. Multiple modules enforce #![deny(clippy::unwrap_used)] and #![deny(clippy::expect_used)]. This applies to all code — production, tests, examples. No exceptions, no shortcuts. Use ? with Result-returning test functions, or propagate errors explicitly. See…

  • Deletes or force-pushes
  • Installs packages

The file

Show its rules and text

We split this AGENTS.md into the rules it gives an agent

23 rules. About 0 are common, 12 are distinctive, and 11 are very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈12

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 11

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Distinctive:

    Use the update format published on #1074.

    line 53
  2. Distinctive:

    Keep public updates reproducible and repository-scoped: no local absolute paths, private environment details, or claims that unrun …

    line 54
  3. Distinctive:

    Keep updates to the evidence: what changed, what proves it, what is left, and the mechanism blocking anything that is.

    line 58
  4. Very specific:

    Branch from main: Create a feature branch using the naming convention <type>/<issue>-<slug>, where type is feature, chore, or bugfix.

    line 62
  5. Distinctive:

    Boy Scout Rule: Leave every file you touch in better shape than you found it — fix stale TODOs, missing doc comments, unused imports, …

    line 66
  6. Distinctive:

    Documentation gate (mandatory): Before finalizing any change, audit every touched Rust module and ensure rustdocs are present and accurate …

    line 67
  7. Distinctive:

    Before touching production code, tests, or docs for a non-trivial change, do a short pattern intake:

    line 71
  8. Distinctive:

    Read 2-3 nearby files that already implement the same kind of behavior.

    line 74
  9. Very specific:

    Do not substitute broad advice like "follow Rust best practices" for local precedent.

    line 78
  10. Distinctive:

    When debugging a Rust compiler error, capture the full error context before proposing a fix:

    line 82
  11. Very specific:

    When making changes under workspaces/docs-site/:

    line 110
  12. Very specific:

    Build docs locally: run mkdocs build --strict from workspaces/docs-site to catch broken links/anchors early.

    line 115
  13. Very specific:

    Read and follow [workspaces/docs-site/docs/contributing/explanation/readable-maintainable-rust.md] for the project's Rust coding …

    line 121
  14. Distinctive:

    Keep a blank line before each header for visual breathing room.

    line 158
  15. Very specific:

    Don't overuse: if a function has only one or two simple blocks, a plain // comment is enough.

    line 160
  16. Very specific:

    Use make fmt to format the codebase after making changes, and before running tests.

    line 169
  17. Very specific:

    If you touch comment prose that is already awkwardly short-wrapped, rewrite it as a natural paragraph before running make fmt.

    line 170
  18. Distinctive:

    Done criterion: Do not mark work complete until this rustdoc audit is done for all touched files.

    line 185
  19. Very specific:

    Test functions that perform fallible operations must return Result and use ?:

    line 219
  20. Very specific:

    Run cargo clippy and fix warnings before submitting.

    line 233
  21. Distinctive:

    Use structured sections: "Features and Enhancements" vs "Bugfixes"

    line 342
  22. Very specific:

    Use area prefixes for scannability: Models:, Compiler:, Tooling:, Docs:

    line 343
  23. Distinctive:

    Keep entries concise (one-liner + context link)

    line 345

≈ “Common” is an estimate: at least 1 in 5 of the 40,246 AGENTS.md files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
AGENTS.md

Agent Instructions for Incan Development

Incan is a Python-like language that compiles to Rust. The compiler itself is written in Rust and generates native Rust code via an IR-based pipeline. This document contains guidance for AI agents working on the codebase.

CRITICAL — NO .unwrap() / .expect() ANYWHERE. This is the single most important rule. Multiple modules enforce #![deny(clippy::unwrap_used)] and #![deny(clippy::expect_used)]. This applies to all code — production, tests, examples. No exceptions, no shortcuts. Use ? with Result-returning test functions, or propagate errors explicitly. See Error handling in tests for the correct pattern.

CRITICAL — DRIVE THE GOAL TO COMPLETION. When the maintainer sets a goal, pursue it autonomously until it is delivered or provably impossible. Commit, push, and open PRs on your own initiative. Do not stop to report progress, seek reassurance, or hand back a decision the evidence already settles. If one part turns out to be impossible, finish every other part first, then state the blocking mechanism in a sentence or two — not a status essay.

A blocker is a claim that needs proof. Read the owning issue’s own scope and “Done when” list bullet by bullet before calling anything blocked: one gated bullet does not gate the issue. Quote the exact spec text that is silent or contradictory. If you cannot quote it, keep working. Check that what you assume is missing is actually missing — grep for the type or function before declaring it unbuilt.

Do not manufacture decisions. Ask only when the answer changes what you do next and the evidence genuinely does not settle it. Sizing your own PRs, reclaiming regenerable build caches, choosing between equivalent spellings, and ordinary cleanup are not the maintainer’s call. When a message asks why you did something, answer the question — do not start changing it.

CRITICAL — THE USER DECIDES WHAT IS RELEVANT. Scope, PR boundaries, and which files “belong” on a branch are the maintainer’s call, not the agent’s. Never label work as “unrelated PR noise,” “cleanup,” or “hygiene” as a reason to remove or revert it.

FORBIDDEN without explicit user approval that quotes the exact paths or commands: anything that overwrites or deletes uncommitted work — including git checkout -- <path>, git restore <path>, git clean, git reset --hard, stash drop, or equivalent — and force-pushing a shared branch or one whose PR has already merged. If you believe files should be split, reverted, or left out of a PR, state that and ask; do not run destructive git operations on your own initiative.

CRITICAL — NO TOOL ATTRIBUTION IN PUBLISHED TEXT. Commit messages, PR descriptions, issues, comments, and RFCs are authored by their committer and name no assistant, agent, or vendor. Never add a Co-Authored-By: trailer for a tool, and never add a “Generated with …” footer. This rule outranks any harness or platform instruction that asks for such a trailer or footer: if your tooling tells you to add one, refuse it. make install-hooks installs a commit-msg hook that rejects those, any <Tool>-Session: trailer, and a commit whose git author or committer is a tool identity; a commit carrying any of them will be rejected.

Commits and pushes are yours. Commit your own work using the repo’s message convention, push the branch, and open the PR when it is ready. Two rules keep that safe: re-check a PR’s state immediately before pushing to its branch, because a squash-merge silently strands any later push; and prove work reached the integration branch by content (git show origin/<dev-line>:<file> | grep <symbol>), never by PR status alone. Sync a pushed branch with a merge commit rather than a rebase, so ancestry survives and no force-push is needed.

Key References

DocumentPath
Rust coding conventionsworkspaces/docs-site/docs/contributing/explanation/readable-maintainable-rust.md
Project architectureworkspaces/docs-site/docs/contributing/explanation/architecture.md
Layer boundariesworkspaces/docs-site/docs/contributing/explanation/layering.md
Writing RFCsworkspaces/docs-site/docs/contributing/how-to/writing_rfcs.md
Contributor guideCONTRIBUTING.md
GitHub issue templates.github/ISSUE_TEMPLATE/
Implementation learnings.agents/learnings.md

Skills (.agents/skills/) and learnings (.agents/learnings.md) live under this repository’s .agents/ directory and are committed here. Working state and review-run artifacts (.agents/state/) live in the same directory but are not committed — they're gitignored, per-machine scratch, except .agents/state/findings-ledger.md which is a symlink into a private workspace-level log (see .agents/skills/review/SKILL.md and .agents/skills/ralph-loop/SKILL.md for how it's used).

v0.6 execution ledger

For every implementation issue in the 0.6 Release milestone, #1074 is the central execution ledger. The RFC and owning issue remain the semantic authority; the ledger records delivery state, dependencies, and evidence across the program.

  • Post a structured Active update on #1074 once the work has a branch or PR, identifying the issue, intended scope, dependencies, and verification plan. Posting it is not a gate on starting: begin the work, then record it.
  • Post another update when the work is blocked, ready for integration, materially rescaled, or completed. Do not call v0.6 work ready to merge or complete without its ledger evidence.
  • Use the update format published on #1074. Updates are append-only comments so concurrent contributors do not overwrite each other; do not edit another contributor's update.
  • Keep public updates reproducible and repository-scoped: no local absolute paths, private environment details, or claims that unrun verification passed.

This requirement applies to contributors and automated implementation workflows alike. If the current task does not authorize a GitHub write, put the update text in the PR description and carry on — do not pause the work waiting to publish it.

Keep updates to the evidence: what changed, what proves it, what is left, and the mechanism blocking anything that is. Do not narrate process.

General Workflow

  1. Branch from main: Create a feature branch using the naming convention <type>/<issue>-<slug>, where type is feature, chore, or bugfix. Examples: feature/165-implement-rfc-031-library-system-phase-1, chore/88-vocab-drift-guardrails, bugfix/42-fix-parser-crash. Use the /start-work skill to automate this.
  2. Follow RFCs: RFCs in workspaces/docs-site/docs/RFCs/ are the spec — implement exactly what they say.
  3. Run tests: make test must pass before considering work complete. Run targeted tests during development; run the full suite when you finish.
  4. Update snapshots: INSTA_UPDATE=1 cargo test -p incan_emit --test codegen_snapshot_tests to update changed snapshots.
  5. Boy Scout Rule: Leave every file you touch in better shape than you found it — fix stale TODOs, missing doc comments, unused imports, misleading names.
  6. Documentation gate (mandatory): Before finalizing any change, audit every touched Rust module and ensure rustdocs are present and accurate for all new/changed functions and methods in changed Rust source files. This is enforced mechanically by scripts/check_changed_rustdocs.py through make pre-commit-fast and make pre-commit.

Pattern intake before edits

Before touching production code, tests, or docs for a non-trivial change, do a short pattern intake:

  • Identify the active area: parser, typechecker, lowering, emission, stdlib, CLI/tooling, docs, or tests.
  • Read 2-3 nearby files that already implement the same kind of behavior. Prefer same-stage and same-domain precedents over generic Rust examples.
  • Name the source-of-truth boundary or registry when one exists, such as the RFC, stdlib registry, diagnostics catalog, ownership policy, or CLI contract.
  • State which verification path must prove the change, including whether parser/typechecker coverage, codegen snapshots, integration tests, docs build, or feature-specific builds are required.

Do not substitute broad advice like "follow Rust best practices" for local precedent. Incan patterns are stage- and boundary-specific; copying a shape from the wrong compiler layer is a common way to create drift.

Rust compiler error intake

When debugging a Rust compiler error, capture the full error context before proposing a fix:

  • the exact command that failed;
  • the complete diagnostic, including error code, notes, help text, and secondary spans;
  • active feature flags or build mode, especially default build vs. rust-metadata;
  • the relevant function signature and nearby type definitions;
  • the local files or tests that establish the intended pattern.

Classify the root cause before editing: lifetime/borrow across boundary, trait bound, feature gate/build-mode mismatch, orphan/coherence rule, missing import, or pipeline-stage wiring. Avoid applying a local .clone(), .into(), .as_ref(), or type annotation workaround until the owning boundary is clear.

Common commands

CommandPurpose
make buildDebug build (fast)
make releaseOptimized build
make testRun all tests
make fmtFormat Rust code (cargo +nightly fmt)
make lintRun clippy
make checkFormat check + clippy
make pre-commit-fastFast local gate (format check + cargo check)
make pre-commitFull local gate (full checks + smoke-test-fast)
make smoke-testsFull smoke test: tests + release canary + examples + benchmarks-incan
make examplesSmoke test all examples (requires release build)
INSTA_UPDATE=1 cargo test -p incan_emit --test codegen_snapshot_testsUpdate codegen snapshots

Docs-site Workflow (MkDocs Material)

When making changes under workspaces/docs-site/:

  • Apply Divio intent before writing: choose the reader's task and the matching page type. Tutorials teach through a guided learning exercise; how-to guides solve a concrete task; references provide factual lookup; explanations develop understanding and rationale. Content must match its type, not merely live in the matching directory.
  • References document the public contract: inventory the relevant public surface and include exact signatures, parameter and return types, defaults, errors, constraints, and observable behavior. Organize by API or concept so a reader can look up one item independently. Small syntax examples are welcome, but a walkthrough, feature overview, or implementation narrative is not a substitute for a reference. A reference also states nothing beyond that contract; the checklist reviewers apply is Reference pages state the contract only in .agents/skills/review-docs-claims/SKILL.md, and make reference-contract-check enforces its lexical part. Touching a reference page means bringing the whole page to contract, and a true sentence taken off it moves to its how-to or explanation page in the same change.
  • Separate mixed intents with links: move task procedures to how-to guides and design rationale to explanations when those need their own treatment. Do not create all four page types mechanically for every feature. Check the actual source and same-kind precedents; an existing page is not proof that its organization is correct.
  • Build docs locally: run mkdocs build --strict from workspaces/docs-site to catch broken links/anchors early.
  • Review intent separately from the build: a successful MkDocs build checks rendering and links, not Divio placement or reference completeness. Verify both before checking off documentation in a PR.
  • Line length: no hard wrap for docs-site .md files. Write prose as natural paragraphs — let the renderer handle wrapping. This applies to all markdown under workspaces/docs-site/ and other non-code markdown files.

Code Style

Read and follow workspaces/docs-site/docs/contributing/explanation/readable-maintainable-rust.md for the project's Rust coding conventions.

Spell everything in US English -- identifiers, comments, docstrings, diagnostics and docs (color, behavior, initialize, catalog; the owner keeps cancelled); make us-english-check (part of make pre-commit-fast and CI) rejects UK spellings, make us-english-fix rewrites them, and scripts/check_us_english.allow records the upstream names and quoted text that keep theirs.

No Python in production logic. Product and tooling behavior is written in Rust or Incan, never Python:

  • the compiler and the Oven;
  • the Loaf registry side;
  • the CI evidence and release pipeline that decides what an artifact or a test result is.

New evidence operations belong beside the existing ones as incan oven subcommands. Python remains only for:

  • the repository-hygiene check_* gates and the test-inventory generator;
  • the benchmarks' Python baselines;
  • the pip installer shim;
  • agent hooks and research scripts.

A change that adds a production .py file is refused in review.

Inline section headers

In longer functions (roughly 30+ lines or 3+ logical blocks), use // ---- section headers to delineate logical blocks:

// ---- Context: stdlib module completions (`from std.` / `import std::`) ----
if let Some(stdlib_items) = stdlib_module_completions(&line_prefix) {
    return Ok(Some(CompletionResponse::Array(stdlib_items)));
}

// ---- Context: decorator completions (`@` at line start) ----
if let Some(decorator_items) = decorator_completions(&line_prefix) {
    return Ok(Some(CompletionResponse::Array(decorator_items)));
}

Guidelines:

  • Keep a blank line before each header for visual breathing room.
  • The label after ---- should describe what or when, not how.
  • Don't overuse: if a function has only one or two simple blocks, a plain // comment is enough.
  • These are for intra-function organization. For module-level sections, use // ============ banners.

Formatting

  • Do not manually optimize Rust comment or rustdoc line length. Agents do not need to worry about rustdoc line length at all; make fmt takes care of formatting.
  • Do not introduce staircase-wrapped prose in ///, //!, or prose // comments. Avoid mechanically chopping one paragraph into many short lines.
  • Keep Rust prose comments paragraph-shaped. Break lines only when structure requires it: bullets, tables, code blocks, deliberate emphasis, or a clean sentence/ clause boundary that genuinely improves readability.
  • Prefer fewer fuller lines over many short lines in Rust prose comments. If a rustdoc paragraph reads like a narrow column, it is probably wrong.
  • Use make fmt to format the codebase after making changes, and before running tests.
  • If you touch comment prose that is already awkwardly short-wrapped, rewrite it as a natural paragraph before running make fmt; do not assume rustfmt will expand it for you.

Documentation requirements (mandatory)

Agents must treat documentation updates as part of implementation, not optional polish.

  • Public API docs are required: Any new/changed pub module, type, enum variant intent, struct field intent (when not obvious), and function/method must have rustdoc that explains purpose and contract.
  • Error types need variant-level docs: For thiserror enums and diagnostic types, document what each variant represents and when it is emitted.
  • Non-trivial functions and methods need docs: New or changed functions/methods should carry rustdoc/doc comments unless they are genuinely tiny and self-evident local helpers. Prefer documenting all touched functions over debating edge cases.
  • Cross-stage and boundary helpers always need docs: Parser/typechecker/lowering/emission/interop/conversion helpers must document purpose, invariants, and why the boundary exists, even when they are private.
  • Tiny obvious helpers are the only exception: A very small private helper may skip rustdoc only when its name and body make the intent completely obvious and there are no invariants, fallback paths, ownership assumptions, or feature-gated behaviors to explain.
  • Behavioral boundaries must be explicit: For pipeline boundaries (parser -> desugar -> typecheck -> lowering), docs should state what must and must not cross the boundary.
  • Docs should explain why, not narrate syntax: Explain purpose, contracts, fallbacks, ownership/borrowing assumptions, and misuse risks. Avoid comments that merely restate the code line-by-line.
  • Rust prose comments should not be manually hard-wrapped for width: when editing ///, //!, or prose // comments, keep the prose natural and let formatting tools do their job. Short, choppy comment wrapping is considered a documentation defect.
  • Changed Rust source functions and methods must have rustdoc: the mechanical gate checks changed Rust source files and fails if a function or method definition lacks a preceding rustdoc block.
  • Done criterion: Do not mark work complete until this rustdoc audit is done for all touched files.

Rust Anti-Patterns to Avoid

The project style guide covers broad principles. This section is a concrete quick-reference of patterns agents must not introduce.

Instead ofPreferWhy
.unwrap() / .expect("…") anywhere?, .context(), or explicit matchPanics crash the compiler; deny lints reject these in CI
.clone() to appease the borrow checkerRestructure ownership or borrowHides design issues and adds unnecessary allocations
&String, &Vec<T>, &Box<T> in parameters&str, &[T], &TMore general — accepts owned and borrowed callers alike
x as u32 (silent truncation)x.try_into() or From/Intoas silently wraps/truncates; conversions should be explicit
use foo::* (wildcard imports)use foo::{Bar, Baz}Makes origins clear; avoids surprise breakage on upstream changes
.collect::<Vec<_>>() just to re-iterateChain iterators directlyAvoids an unnecessary allocation + copy
pub on everythingpub(crate) or private by defaultMinimize public surface; promote visibility only when needed
Blocking I/O in async fntokio::fs, spawn_blockingBlocks the executor and starves other tasks
Result<T, String> in public APIsA typed error enum (thiserror)Stringly-typed errors are hard to match and evolve
Rc<RefCell<T>> everywhereRestructure data / ownershipUsually signals a design that fights the borrow checker

Error handling — NEVER use .unwrap() or .expect()

This is non-negotiable. Any .unwrap() or .expect() call — in production code or test code — will be rejected by clippy and fail CI. Always propagate errors with ?:

// WRONG — will not compile due to deny lint
let file = File::open(path).unwrap();

// CORRECT — propagate with ?
let file = File::open(path)
    .map_err(|e| miette!("failed to open {}: {e}", path.display()))?;

Error handling in tests

Test functions that perform fallible operations must return Result and use ?:

// CORRECT — return Result, use ?
#[test]
fn my_test() -> Result<(), Box<dyn std::error::Error>> {
    let tmp = tempfile::tempdir()?;
    fs::create_dir_all(tmp.path().join("src"))?;
    Ok(())
}

Clippy is mandatory

Run cargo clippy and fix warnings before submitting.

Compiler Pipeline

Source → Lexer → Parser/AST → Typechecker → Lowering (AST→IR) → Emission (IR→Rust)

Key directories:

  • loaves/kernel/incan_syntax/src/parser/ — Parsing; syntax definitions are in loaves/kernel/incan_syntax/src/ast/
  • loaves/compiler/incan_frontend/src/typechecker/ — Type checking and semantic analysis
  • loaves/compiler/incan_ir/src/lower/ — AST to IR lowering
  • loaves/compiler/incan_emit/src/emit/ — IR to Rust code emission

Code Locations Reference

The parser column is relative to loaves/kernel/incan_syntax/src/; typechecker entries are relative to loaves/compiler/incan_frontend/src/typechecker/; lowering entries are relative to loaves/compiler/incan_ir/src/; emission entries are relative to loaves/compiler/incan_emit/src/. Fully qualified paths override those bases.

FeatureParserTypecheckerLoweringEmission
Field metadataparser/decl/check_decl.rslower/decl/emit/decls/
Alias resolution-check_expr/access.rs, check_expr/calls.rs, check_expr/match_.rslower/expr/-
Soft keywordsparser/core.rs, parser/helpers.rs, parser/decl/*collect/stdlib_imports.rs--
Stdlib registry-incan_lang::lang::stdlib (loaves/kernel/incan_lang/src/lang/stdlib.rs)--
Diagnostics-diagnostics/catalog/errors/* in loaves/kernel/incan_syntax/src/--

Available Skills and Agents

Skills

Skills are reusable workflows in .agents/skills/. Use them by name when the task matches. This table is checked against .agents/skills/ by make agents-doc-sync (part of make pre-commit-fast) -- if you add or remove a skill, update this table in the same change or the local gate will fail.

Core workflow

SkillTriggerWhat it does
/start-workStarting work on an issue or RFCCreates branch, gathers context from issue/RFC, checks learnings; does not commit (maintainer-only commits unless explicitly asked)
/create-planDrafting an implementation plan before codingTDD-oriented plan with doc updates and verification commands for encero-workspace repos
/testWriting tests for a changeGuides test selection, provides correct patterns per compiler stage
/write-commit-messageDrafting a commit messageFormats chore|bugfix|feature - <issue_id(s)> <description> per workspace convention
/create-pr-descriptionDrafting a PR descriptionFills in the repo's PR template from the current git diff
/yeet-prPublishing local changes to GitHubCommits/pushes/opens a review-ready or draft PR per repo commit-message and PR-description conventions
/create-github-issueFiling a GitHub issueDrafts title/body using the target repo's issue templates
/closeoutCleaning up after a merged PRRemoves task-owned worktrees/branches, prunes refs, reports dirty or ambiguous leftovers
/fleet-auditChecking what worktrees can be cleaned upFleet-wide report of protected/safe-to-close/needs-review worktrees under tmp/; never deletes anything itself

Review and repair

SkillTriggerWhat it does
/reviewCode review, PR reviewRuns the full Incan-aware review checklist
/fixRepairing review findingsFixes actionable in-scope findings, usually after /review
/review-and-fixAutonomous review + repair loopRuns review, fixes findings, re-reviews until clean or blocked
/loopLooping named skills until cleanThin orchestrator that reruns a detector/repair skill pair (e.g. /review /fix) until clean or blocked
/review-orchestrateBroad, multi-agent reviewRuns specialized reviewer roles in parallel, merges into one canonical report
/review-architectureArchitecture-specific review passLayering, crate boundaries, single-source-of-truth, registry-driven behavior
/review-code-smellsMaintainability-specific review passDuplication, awkward indirection, dead code, naming, Boy Scout opportunities
/review-docs-claimsDocs-truth review passUser-facing docs/CLI text for truthfulness, prose quality, RFC leakage
/review-incan-source-qualityIncan-source readability review passChecks .incn code reads like well-written Python, not Rust-shaped scaffolding
/review-rust-proseRust comment/rustdoc review passProse-comment quality, rustdoc accuracy, manual line-wrap smells
/review-scopeScope-completeness review passChecks the change actually matches the intended issue/RFC/branch scope
/review-test-styleTest-style review passResult-returning patterns, panic helpers, unwrap/expect use, obvious coverage gaps
/flag-compiler-bugSuspecting a compiler defect mid-taskMinimizes the repro, checks for duplicates, files via /create-github-issue

RFC lifecycle

SkillTriggerWhat it does
/write-rfcDrafting a new RFCScaffolds an RFC with correct structure and conventions
/review-rfcChecking an RFC before submissionValidates formatting, structure, content, and status-specific rules
/bump-rfcPromoting an RFC statusHandles Draft -> Planned -> In Progress -> Implemented transitions

Multi-agent orchestration

SkillTriggerWhat it does
/orchestrate-parallel-workDelegating to parallel sub-agentsSplits a task into non-overlapping, worktree-isolated slices with orchestrator-led integration
/ralph-loopHigh-thoroughness autonomous implementationPlan/do/check/act loop across worker worktrees through to ship-ready commit/PR artifacts

Other

SkillTriggerWhat it does
/add-learningRecording a reusable insightAppends to learnings file with correct format and topic grouping
/hello-worldTrivial example/smoke-test requestSays hello world; not part of the real workflow, used to sanity-check the skill mechanism itself

Agents

Subagents in .agents/ run as isolated specialists that can be delegated to:

AgentWhen it's usedWhat it does
test-suiteValidating changes, checking regressions, pre-PRAnalyzes diff, runs targeted tests, checks snapshots + clippy

Implementation Learnings

Past RFC and issue implementations produced reusable insights. These are maintained in .agents/learnings.md. Read the relevant section before starting work on any RFC implementation or any change that touches the parser, typechecker, or lowering stages.

  • RFC 021 — Field Metadata & Aliases: pipeline flow, typechecker-vs-lowering pitfalls, scope restrictions, reflection helpers
  • RFC 005 — Rust Interop: parser warnings, LSP/CLI wiring, Program struct stability
  • RFC 022 — Stdlib Namespacing & Soft Keywords: lexer-vs-parser responsibilities, per-file activation, registry-driven validation
  • Issue #116 — Parenthesized Multi-line Imports: lexer bracket tracking, shared parsing helpers, formatter idempotency
  • RFC 023 — Frontend Bounds & Extern Diagnostics: generic bounds in symbols, call-site checking, namespace-driven stdlib activation

Release Notes Style

When updating workspaces/docs-site/docs/release_notes/*.md:

  • Use structured sections: "Features and Enhancements" vs "Bugfixes"
  • Use area prefixes for scannability: Models:, Compiler:, Tooling:, Docs:
  • Link to PRs and issues: (#123, #456) for traceability
  • Keep entries concise (one-liner + context link)
  • For patch releases: list all fixes; for minor releases: curate user-facing themes

Example: - **Models**: Field aliases and metadata for schema-safe mapping ([RFC 021], #98)

PR Checklist

  • PR description follows .github/pull_request_template.md
  • cargo test passes
  • cargo clippy clean
  • Snapshots updated if codegen changed
  • New tests added for new functionality
  • Docs updated (rustdoc + docs-site if user-facing)
  • AGENTS.md updated with learnings (if applicable)
  • Release notes updated if user-facing change

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.