carrel
CLAUDE.md2 starsChanged 6 days agoMITView on GitHub
Research environment toolkit for academics. A Python core library (carrel CLI), a Claude Code plugin (skills, agents, hooks, commands), and a portable skill pack (skills/carrel/) packaged as a cross-host plugin (plugins/carrel/) for GitHub Copilot, Codex and Kimi Code. The core library NEVER asks questions or makes judgment calls. Skills handle that. If a required parameter is missing, the library returns an actionable error. Host-split (decision 2026-07-10): the typed CLI (src/carrel, provisioned by install.sh via uv tool install) is the Claude…
- Pipes a download into a shell
In this repository15 other files it gives its agents.
- templates/CLAUDE.mdCLAUDE.md
- automationSkill
- carrelSkill
- collaborator-onboardingSkill
- convertSkill
- env-doctorSkill
- environment-setupSkill
- knowledge-wikiSkill
- model-teammatesSkill
- research-partnerSkill
- self-improveSkill
- session-reflectionSkill
- transcribeSkill
- vault-opsSkill
- web-captureSkill
The file
We split this CLAUDE.md into the rules it gives an agent
4 rules. About 0 are common, 3 are distinctive, and 1 is very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈3
Distinctive · estimate
This author's own choices. Worth a look.
1
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 96
No markdownify fallback for PDFs.
- Distinctive: line 101
No markdownify fallback for audio.
- Distinctive: line 115
Filesystem: Write only inside vault. Read from anywhere.
- Very specific: line 156
Detection: check wiki/SCHEMA.md existence (not just wiki/).
≈ “Common” is an estimate: at least 1 in 5 of the 26,980 CLAUDE.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.
Files
Carrel
Research environment toolkit for academics. A Python core library (carrel CLI), a Claude Code plugin (skills, agents, hooks, commands), and a portable skill pack (skills/carrel/) packaged as a cross-host plugin (plugins/carrel/) for GitHub Copilot, Codex and Kimi Code.
Quick Commands
# Core library
uv run pytest # Full test suite
uv run carrel env doctor # Hardware + tools audit
uv run carrel env validate --vault . # Validate environment.json + drift markers
uv run carrel env fix --safe --vault . # Apply safe environment.json repairs
uv run carrel vault init /tmp/test # Scaffold a vault
uv run carrel paper convert paper.pdf # Convert PDF (liteparse default)
uv run carrel transcript create rec.m4a # Transcribe audio (coli default)
uv run carrel capture url https://example.com # Web capture (defuddle)
uv run carrel google export <google-docs-url> # Google Docs export (gws)
uv run carrel vault cheatsheet --vault . --force # Regenerate _meta/cheat_sheet.md
uv run carrel vault dashboard --vault . --force # Regenerate _meta/my-environment.md
uv run carrel vault automation-prompt --vault . --force # Regenerate _meta/automation-prompt.md
uv run carrel vault check-sync --vault . # Check CLAUDE.md profile markers for drift
uv run carrel vault add-markers --vault . # Append profile markers to CLAUDE.md
uv run carrel setup-state show --vault . # Inspect setup phase (v0.5.3+)
uv run carrel setup-state advance --phase N # Move to next phase atomically
uv run carrel setup-state complete --vault . # Mark setup complete (idempotent)
uv run carrel trust check automation:propose --vault . # Check if action allowed at current trust level
uv run carrel trust list --vault . # See what current trust unlocks
uv run carrel paper convert foo.pdf --explain # Print routing decision + rationale without executing
uv run carrel vault feedback export --redact-list redact.txt --vault . # Anonymized feedback digest (v0.9.0)
uv run carrel vault mirror --write --from-stdin --vault . # Idempotent dated mirror file (v0.9.0)
uv run carrel vault reflect-log --append --from-stdin --vault . # Atomic append to dated reflect-log (v0.9.0)
uv run carrel vault share generate --mode quick --for alice --sensitivity medium --vault . # Collaborator handbook (v0.9.0)
uv run carrel batch convert <folder> [--unattended] --vault . # Sequential PDF batch (v0.9.0)
uv run carrel batch transcribe <folder> [--unattended] --vault . # Sequential audio/YouTube batch (v0.9.0)
uv run carrel automate configure --enabled --trust-level consultative --schedule daily --review-cadence quarterly --vault . # Typed-flag automation config, no prompts (v0.9.0)
uv run carrel migrate apply [--plugin-root <path>] --vault . # Walk migrations registry, update plugin-state.json (v0.9.0)
uv run pytest --cov # Coverage run (pytest-cov in dev group; config in pyproject [tool.coverage.*])
scripts/sync-skill-repo.sh [--push] # Publish skills/carrel → linxule/carrel-skill via git subtree (dry-run default)
python scripts/sync-agent-plugin.py [--check] # Regenerate plugins/carrel/ from skills/carrel (--check fails on drift)
python scripts/build-skill-zip.py # Build dist/carrel.zip for Claude app skill uploadArchitecture
Skills (markdown) → human judgment, loaded by any AI
Core library (Python) → deterministic operations, no AI
Transports (thin) → plugin, CLI, MCP, agent SDK appsThe core library NEVER asks questions or makes judgment calls. Skills handle that. If a required parameter is missing, the library returns an actionable error.
Host-split (decision 2026-07-10): the typed CLI (src/carrel, provisioned by install.sh via uv tool install) is the Claude Code plugin's sole runtime — hooks, slash commands, and the 13 workflow skills call carrel .... The portable skill pack (skills/carrel/: SKILL.md + stdlib-only scripts/carrel.py runtime) is the standalone engine for every other host (Codex, GitHub Copilot, Kimi Code, Gemini CLI, OpenCode, Cursor, Claude app zip) — sandbox-native because it travels as files + python3. The pack is a strict subset; tests/test_runtime_parity.py is the drift alarm (same-input comparisons on shared surfaces + an enumerated allowlist of intended vault init divergences: setup-state.json typed-only, agent-context.md portable-only). Distribution: scripts/sync-skill-repo.sh --push subtree-publishes skills/carrel/ to linxule/carrel-skill for npx skills / .agents/skills/ installs. Never edit carrel-skill directly — it's a publish target, not a second source of truth; skills/carrel/ here is canonical. The same pack is also packaged as a cross-host plugin at plugins/carrel/ (Agent Plugins 1.0 plugin.json for Copilot + Codex, kimi.plugin.json for Kimi Code; catalogs at .github/plugin/marketplace.json and .agents/plugins/marketplace.json; repo-root kimi.plugin.json points Kimi at the packaged skill only). plugins/carrel/skills/carrel/ is generated — edit skills/carrel/, then run python scripts/sync-agent-plugin.py; tests/test_packaging_contract.py fails on drift and pins each host's manifest rules. For Claude app uploads, scripts/build-skill-zip.py builds carrel.zip (root folder must be carrel/ — Claude rejects mismatched folder names); .github/workflows/skill-zip.yml republishes it to the skill-latest release on every skills/carrel/ change on main.
Directory Structure
carrel/
├── src/carrel/ # Python core library
│ ├── cli/ # typer CLI (paper, transcript, vault, env, capture, google, setup-state, trust, automate, batch, migrate)
│ ├── convert/ # PDF/doc conversion (router, adapters, filer, pipeline)
│ ├── transcribe/ # Audio/video transcription (router, adapters, filer)
│ ├── google/ # Google Workspace export (gws CLI integration)
│ ├── vault/ # Vault scaffold, organize, templates, markers, dashboard, automation_prompt
│ ├── env/ # Audit, profile, install, validation, healing, platform
│ ├── policy/ # Sensitivity routing (16-row matrix) + trust enforcement
│ ├── feedback/ # Anonymized feedback digest exporter (v0.9.0)
│ ├── migrate/ # Migration runner — registry walk + plugin-state.json writer (v0.9.0)
│ ├── share/ # Collaborator handbook synthesizer + sensitivity redaction (v0.9.0)
│ ├── models.py # Pydantic models (options, results, enums, AutomationConfig, ResearcherProfile, SetupState)
│ ├── safe_path.py # Vault containment helper
│ ├── youtube_url.py # Unified YouTube URL parser
│ ├── source_hash.py # Unified source-hash helper for idempotency
│ └── errors.py # CarrelError with actionable hints
├── tests/ # pytest suite
├── templates/ # Vault templates (loaded by vault/templates.py)
├── skills/ # plugin skills (including the portable carrel skill pack)
├── agents/ # Plugin agents (setup-interviewer, research-partner)
├── hooks/ # 4 plugin hooks: SessionStart (check-environment.js), SessionEnd (session-reflect.js), UserPromptSubmit (inject-context.js, v0.9.0), PreToolUse Bash matcher (sensitivity-gate.js, v0.9.0)
├── commands/ # 15 plugin slash commands (/carrel-*); 7 are thin wrappers per CONVENTIONS.md
│ └── CONVENTIONS.md # ${ARGS} (skill-constructed) vs $ARGUMENTS (raw) convention (v0.9.0)
├── planning/ # Specs, reviews, prompts, reports (multi-model review workflow)
├── plugins/carrel/ # Generated cross-host plugin (Copilot, Codex, Kimi) — never edit; run scripts/sync-agent-plugin.py
├── scripts/ # sync-skill-repo.sh (publish carrel-skill), sync-agent-plugin.py (regenerate plugins/carrel), build-skill-zip.py (Claude app ZIP)
├── bootstrap.sh # Deprecated shim — hands off to install.sh
├── install.sh # macOS/Linux one-line installer (curl | bash)
├── install.ps1 # Windows installer (first-class as of v0.7.0)
└── pyproject.toml # pydantic + typer + rich + httpx + markitdown + youtube-transcript-api (defuddle, liteparse, coli are bun tools)Tool Routing
PDF conversion
liteparse (local default) > mineru (cloud, explicit --tool mineru) > markitdown (non-PDF only)
No markdownify fallback for PDFs. Missing liteparse → clear error with install command.
Audio transcription
coli (local default) > groq (cloud, explicit --tool groq)
No markdownify fallback for audio. Missing coli → clear error.
YouTube
youtube_captions (network-lite default, fetches existing public captions with timestamps) > gemini (cloud, explicit --tool gemini or cloud_consent)
Captions are a network-lite fetch, not a cloud upload — no vault data egresses, so they route on LOW/MEDIUM without cloud_consent. HIGH sensitivity blocks caption fetches by default but honors an explicit --tool youtube_captions override with a warning (the researcher asserts the URL is not sensitive). gemini is a true cloud tool (uploads audio/video) and stays blocked on HIGH regardless of consent. Policy lives in src/carrel/policy/sensitivity.py (NETWORK_TOOLS). Decision 2026-07-10.
Web pages
defuddle (local default, smart content extraction) > markitdown (fallback if defuddle not installed)
Key Design Rules
- Cloud consent:
--tool <cloud-tool>IS consent. No separate--cloudflag. Profilecloud_consentcontrols auto-routing only. - Idempotency: SHA-256 source hash in output frontmatter. Re-run = skip.
--forceto overwrite. - Filesystem: Write only inside vault. Read from anywhere.
- Subprocesses:
asyncio.create_subprocess_exec(nevershell=True). Configurable timeouts. - No AI imports: Core library is deterministic. AI lives in the transport/skill layer.
- Router validation: Routers validate tool+input combinations, not just enum membership.
--tool geminion a local file or--tool colion a YouTube URL is rejected with an actionable error. The router is the validation boundary — transports trust it.
Scheduled Automation
Carrel can run unattended through Claude scheduled tasks (the Scheduled page; Cowork is now part of the regular Claude app) or a credential-dependent claude -p scheduler. The automation skill defines the contract; /carrel-automate configures the profile, and carrel vault automation-prompt generates the prompt separately. In Claude, use the Scheduled page or /schedule in a conversation. A task that needs a local vault requires the connected folder and Claude Desktop availability when local access is needed.
- Trust levels: Advisory (suggest only) → Consultative (propose, researcher approves) → Delegated (act on new items, experimental) → Partnership (reorganize, experimental)
- AutomationConfig in
models.py: per-capability booleans, trust level, model, schedule, review cadence - Session-start hook: surfaces morning briefs, active plans, pending decisions/approvals (gated on
_meta/briefs/existence) - Generated prompt:
_meta/automation-prompt.md— per-researcher, uses vault detection (no absolute path) - Two-track sync:
environment.json+ vaultCLAUDE.mdmust both reflect automation preferences
Commands: /carrel-batch (sequential file processing), /carrel-automate (configure), /carrel-mirror (research self-portrait)
Collaboration (v0.5.1)
/carrel-share generates a vault-specific handbook for an incoming collaborator (RA, co-author, lab member) by synthesizing friction log, capability log, reflections, configured tools, sensitivity rules, and active threads. Distinct from /carrel-setup (new researcher's own vault) and from Claude Code's /team-onboarding (generic Claude Code usage tips). Output: _meta/handbook/[YYYY-MM-DD]-for-[name].md.
Skill: collaborator-onboarding. Profile fields that drive it: collaborators: bool, team_context: str | None. Asked in setup interview; surfaced in Phase 9 handoff when collaborators == true.
Model Teammates (v0.8.1)
/carrel-teammates brings Codex (ChatGPT), Gemini, and Kimi into Claude Code via community plugins (openai/codex-plugin-cc, thepushkarp/cc-gemini-plugin, linxule/kimi-plugin-cc). Profile field model_teammates: dict[str, ModelTeammateStatus]. Skill: skills/model-teammates/SKILL.md. Spec: planning/specs/013-model-teammates.md.
Vocabulary: teammates ≠ Claude-side agents/ (setup-interviewer, research-partner) ≠ human collaborators (co-authors/RAs via /carrel-share).
Knowledge Wiki
Optional synthesis layer: agent-maintained entity/concept pages that compound knowledge across sources. Adapted from Karpathy's LLM Wiki + Hermes Agent.
- Trust-gated:
wiki:proposedrafts an exact batch,wiki:apply-approvedapplies that batch at Consultative trust, and autonomouswiki:writerequires Delegated trust. - Folder mapping:
papers/,transcripts/,inbox/= source layer.wiki/= synthesis layer. No separateraw/. - Operations: ingest, query (trust-gated filing), lint. See
skills/knowledge-wiki/SKILL.md. - Dialogue: researcher callouts (
> [!researcher]) on wiki pages — agent reads, never overwrites. Wiki = field's voice;notes/= researcher's voice; gap = contribution. - Ephemeral agent: log.md includes reasoning per decision (cross-instance handoff). Lazy orientation (full context only for writes).
- Provenance and quality: optional confidence/contested/contradiction signals, source-body digests, and paragraph source markers on 3+ source pages.
- Automation:
wiki_maintenancein AutomationConfig. At delegated trust, briefs include quality/drift counts, per-file revert instructions, and one synthesis insight. - Model fields:
wiki_enabled,wiki_preference,wiki_proposal_deferred_untilon ResearcherProfile. Read by Claude, not code-enforced. - Detection: check
wiki/SCHEMA.mdexistence (not justwiki/). Upstream incapability-registry.md.
Feedback Loops
Interview preferences flow into two systems that must stay in sync:
- environment.json → CLI router (structured, mechanical). The CLI reads
cloud_consent,sensitivity, etc. - Vault CLAUDE.md → Claude's judgment (narrative, contextual). Claude reads this every session.
- setup-state.json (
.carrel/setup-state.json, added v0.5.2) → trackslast_completed_phaseso/carrel-setupcan pause and resume. Written bycarrel vault init(initial: phase 4); managed via thecarrel setup-stateCLI (added v0.5.3 —advance --phase N,complete,show,reset);completed_atset at phase 9. Hook surfaces a resume prompt if paused. TheSetupStatePydantic model enforcesphase ∈ [4,9], semverversion, ISOcompleted_at, and the mutual-implication invariantphase == 9 ⟺ completed_at is set.
The setup SKILL (Step 5) instructs Claude to write a personalized CLAUDE.md from the interview. When preferences change, update BOTH files. The session-start hook surfaces preferences so Claude has immediate context.
Architecture Normalization (v0.9.0)
Spec 014 (CC-only re-scope) normalizes the three-layer rule for 7 high-value command paths. Deterministic file I/O moved to carrel <subcmd>; orchestration moved into skills; slash commands shrunk to thin !carrel <subcmd> ${ARGS} wrappers.
- Deterministic CLI surfaces:
vault {feedback export, mirror, reflect-log, share generate, automation-prompt},batch {convert, transcribe},migrate apply, andautomate configure. Skills retain interviews, synthesis, approval, and scheduling guidance. - 7 wrapper shrinks (564 → 35 body lines):
/carrel-{feedback,migrate,mirror,reflect,share,batch,automate}. Convention:${ARGS}(skill-constructed) vs$ARGUMENTS(raw user input) documented incommands/CONVENTIONS.md. - Skill enrichments absorbed the freed orchestration prose:
automation(configuration interview + explicit prompt lifecycle + Claude Scheduled/claude -pscheduling + unattended contract),convert+transcribe(pre-batch routing),collaborator-onboarding(mode + sensitivity tiers),self-improve(migrate orchestration),research-partner(mirror 5-dimension synthesis), newsession-reflectionskill (reflect + feedback read/write symmetry). - 3 CC plugin feature adds: marketplace metadata (keywords, category, license, repository);
UserPromptSubmithook (hooks/inject-context.js) for per-turn vault context;PreToolUseBash matcher (hooks/sensitivity-gate.js) for sensitivity ask-gate before cloud subprocesses (bypass via# bypass-gatecomment).
Spec: planning/specs/014-cc-plugin-v090.md. Cross-CLI port (Codex + Kimi) parked as future work; investigation artifacts preserved.
Version & Migration
Plugin version is tracked in .carrel/plugin-state.json in each vault. The /carrel-migrate command compares this against the plugin's current version, assesses the environment, and suggests improvements.
Migration files live in migrations/ with a registry.json index. Each migration is a markdown file describing what's new, automatic steps, and manual steps. Add new migrations when releasing breaking changes or significant features.
When bumping the plugin version in .claude-plugin/plugin.json, also update .claude-plugin/marketplace.json, pyproject.toml + src/carrel/__init__.py, and the cross-host manifests (plugins/carrel/plugin.json, .github/plugin/marketplace.json, kimi.plugin.json, plugins/carrel/kimi.plugin.json) to match — tests/test_version_consistency.py checks all of them, and add a migration file if the update affects the user's vault or config. The check-version.js hook module reads plugin_version from plugin-state.json and is wired into the session-start hook.
Gotchas
markitdown(Microsoft's library) is the non-PDF converter — NOT the old MCP tool namesdefuddleis the web capture tool — much better than markitdown for URLs- Install constants are centralized in
env/install.py— don't duplicate - coli install uses
bun add -g @marswave/coli(not npm) - gws (Google Workspace CLI) requires Google Cloud project + OAuth — high friction setup, see
references/gws-setup-guide.md - Cheat sheet regeneration:
carrel vault cheatsheet --vault <path> --force(added v0.5.2; the legacygenerate-cheatsheet.jswas removed). Renderer beefed up in v0.5.3 with configured-tools matrix, common workflows, and next steps sections. - youtube-transcript-api >= 1.0 uses
.fetch()not.get(), returns objects not dicts - Wiki preference fields (
wiki_preference,wiki_proposal_deferred_until) are on the Pydantic model but read by Claude via skill instructions, not enforced by hooks — consistent with all carrel preferences - Cross-platform (v0.7.0): all Tier 1 tools work on macOS, Linux, Windows. Install paths are platform-keyed in
env/install.py; audit detects the platform inaudit.py; decision-tree and cheatsheet render OS-aware. - Setup-state changes go through
carrel setup-state(added v0.5.3) — never edit.carrel/setup-state.jsonby hand. The CLI is the validation boundary. - Sensitivity gate (v0.7.0): the full 16-row (sensitivity × cloud_consent × requested_tool) matrix is implemented in
src/carrel/policy/sensitivity.py:select_tool. HIGH blocks cloud regardless of consent (gws included — Google API calls send data). MEDIUM requires explicit--tool <cloud>to route to cloud. LOW defaults local-first;cloud_consent=Trueauto-routes when local unavailable.consent.py:resolve_cloud_consentis now a thin backward-compat wrapper aroundpolicy.sensitivity. Use--explainoncarrel paper convert/transcript create/google exportto see the routing decision + rationale without executing. - Vault writes go through
safe_path.safe_vault_join(v0.5.4) — resolves the path and rejects anything escaping the vault root. Used by all filers + scaffold + google export. - Trust enforcement (v0.6.0): writes that require Consultative+ trust now go through
carrel trust check <action>— seespec 008-trust-enforcement.mdandcarrel trust list --vault .for the action matrix. The check is the single boundary; never bypass it. One documented exception (decision 2026-07-10):carrel automate configurepermits an Advisory→Consultative bootstrap without an approval artifact on disk — the skill's interview-approval flow is the contract, and the runtime validates and persists that single transition in one write. It is by design, not a hole: a fresh Advisory profile may transition only to Consultative, never directly to Delegated/Partnership. Seeautomate.pybootstrap comment,skills/automation/SKILL.md, andskills/carrel/references/contracts/trust-levels.md. - Environment drift (v0.7.0, spec 006):
carrel env validate --vault .is the full validator andcarrel env fix --safe --vault .applies deterministic repairs to.carrel/environment.jsononly. Hook runsenv validateonce per 24h and surfaces/carrel-fixwhen drift needs review. - Profile sync (v0.7.0):
_meta/my-environment.mdand_meta/automation-prompt.mdare now deterministic (regenerate viacarrel vault dashboard|automation-prompt --force). VaultCLAUDE.mduses HTML-comment markers (<!-- carrel:field -->value<!-- /carrel:field -->);carrel vault check-syncstill exists for marker-only inspection. - Wrapper convention (v0.9.0): 7 slash commands are now thin
!carrel <subcmd> ${ARGS}shells (no body prose).${ARGS}= skill-constructed typed-flag arg list;$ARGUMENTS= raw user input. Documented incommands/CONVENTIONS.md. The other 8 commands keep their existing shape; shrink later if they accumulate orchestration prose.tests/test_command_wrappers.pyenforces the structural template for the 7 wrappers. - Hook debugging (v0.9.0):
inject-context.js(UserPromptSubmit) andsensitivity-gate.js(PreToolUse Bash matcher) silent-fail on any error path so they don't disrupt user turns. SetCARREL_HOOK_DEBUG=1to enable[carrel:<hook-name>] <reason>stderr logging when diagnosing why a hook isn't firing. The sensitivity gate also rejects (passes through silently) when the command contains shell control characters (;,&,|,<,>,`,$) — use# bypass-gatein those cases. - Mirror filename (v0.9.0):
carrel vault mirror --writewrites to_meta/mirror/<YYYY-MM>.md(monthly, idempotent same-month). Reflect-log writes to_meta/reflections/reflection-<YYYY-MM-DD>.md; feedback-digest writes to flat_meta/feedback-digest-<YYYY-MM-DD>.md. These three paths form a read/write loop (feedback-export reads reflections, mirror reads reflections + friction-log + capability-log) —session-reflectionskill owns reflect + feedback;research-partnerskill owns mirror synthesis. - Gemini transcription model (2026-07-10): default
gemini-3.5-flash(GA), overridable viaCARREL_GEMINI_MODEL. The Interactions response parse walks ALL output items (thought-items-first responses are handled) — don't revert tooutput[0][...]indexing. - Corrupt-profile recovery (2026-07-10):
vault initon UNPARSEABLE JSON backs the file up to.carrel/environment.json.corrupt-<timestamp>and proceeds fresh (loud warning); parseable-but-invalid profiles hard-fail with anenv validate→env fix --safehint. Consent repairs are asymmetric by design: auto-repairs may only NARROW consent ("false"→false auto-fixed;"true"defers to the human). - Feedback digest headings (2026-07-10): vault-relative paths with the structural sweep prefix (
_meta/<sweep-dir>/) never redacted and every user-named segment + basename always redacted — no codename leaks via paths, no structural garbling. Identical in both runtimes; parity-asserted. - carrel-skill repo is publish-only: regenerated by
scripts/sync-skill-repo.sh --push(dry-run default, refuses dirty trees). Editskills/carrel/here, never the standalone repo.
Capability Absorption
Carrel grows by absorbing capabilities from the ecosystem (skills repos, MCP servers, CLI tools) and by learning from what researchers actually need. The self-improve skill owns this process — see skills/self-improve/SKILL.md for the full evaluation criteria, absorption process, and tracking mechanism.
One-plugin policy: researchers install Carrel, everything works. No companion dependencies. We absorb and curate, not delegate.
Registry: skills/self-improve/references/capability-registry.md tracks what's been absorbed, from where, and when to review upstream.
Relationship to ItDepends
Carrel is the on-ramp to ItDepends (abductive research agent). Same Python + pydantic + typer + rich stack. Carrel modules may become ItDepends components (profile → Mneme, vault papers → Scholia).
Spec & Review Process
Each spec gets adversarial reviews before implementation. Default reviewer set: Codex (deep adversarial pass) + Kimi (independent second-pair-of-eyes) + a feasibility/architect pass. Some specs go through multiple rounds. Spec "Open Questions" must be locked (decision + rationale) before delegated implementation.
Full work log — every spec, review, report, research artifact with one-line summary — lives in planning/README.md. Don't duplicate it here.
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
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.

