
Viv
- 2 repo stars
- Updated August 4, 2026
- ihmeuw/vivarium-suite
Custom agent workflows for vivarium development: code reviewer and simulation regression debugger orchestrators with specialist sub-agents.
About
viv is a Claude Code skill in the Code Review & Quality category. Custom agent workflows for vivarium development: code reviewer and simulation regression debugger orchestrators with specialist sub-agents.
- viv
- Code Review & Quality
- AI-coding skill
Viv by the numbers
- Data as of Aug 5, 2026 (Skillselion catalog sync)
/plugin marketplace add ihmeuw/vivarium-suite/plugin install viv@vivarium-ai-toolsAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| repo stars | ★ 2 |
|---|---|
| Last updated | August 4, 2026 |
| Repository | ihmeuw/vivarium-suite ↗ |
What it does
Custom agent workflows for vivarium development: code reviewer and simulation regression debugger orchestrators with specialist sub-agents.
README.md
================= Vivarium AI Tools
Vivarium AI Tools is a Claude Code plugin providing custom agent
workflows for vivarium development. The plugin lives under
tools/ai-tools/ in the vivarium-suite monorepo, and is
published through a single-plugin marketplace whose catalog
(.claude-plugin/marketplace.json) lives at the monorepo root, so
Claude Code users can install it via
/plugin marketplace add ihmeuw/vivarium-suite.
It includes:
Code Reviewer
/viv:code-reviewer <PR or description>— parallel multi-lens review that fans out to specialist sub-agents focused on:- Maintainability
- DRY
- Structural design choices
- Testing coverage and quality
- Documentation
plus its own functional-correctness pass.
After the review, findings the user won't address in the current PR can be
handed to the ticket-triage skill (see Skills below), to compile and file non-duplicate JIRA tickets.
Regression Debugger
/viv:model-regression-debugger <symptom and context>— traces data pipeline changes across repos to find the cause of simulation regressions.
Git Rescue
/viv:git-rescue [optional description]. Diagnoses and untangles messy git situations — stuck interactive rebases, stacked-branch conflicts after a squash-merge of the parent, divergent history, accidental merge commits, dropped commits. Always creates a backup ref before rewriting history and gates every destructive step (including the finalgit push --force-with-lease) on explicit user confirmation. User-invoked only — there is no auto-trigger.
Type Hinter
/viv:type-hinter <target>(a package, sub-folder, or.pyfiles under onelibs/<pkg>/). Runs as the lead of an agent team: resolves the inter-file dependency graph, spawns one teammate per file, verifies withmake mypy, and addspy.typedonly if the package ends clean. Requires agent teams (CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1, v2.1.32+; no fallback). It writes, then hands the diff to/viv:commit-splitter.
Framework Development
/viv:framework-development <ticket or feature description>— an end-to-end design → implement → verify → PR loop on a single well-scoped framework feature. The main session owns the design and the interface stubs, then runs a black-box TDD build. It owns the contract: it writes source stubs (the API) plus body-less test stubs that enumerate the acceptance criteria, commits them, and creates two git worktrees from that baseline. It then fans out_feature_implementerand_test_writerin parallel — the tester fleshes out the test stubs, the implementer fills the source bodies treating those stubs as read-only criteria — each confined to its own worktree, whose lineages never merge, so neither ever sees the other's filled-in code (the implementer gets the criteria but not the assertions). It then integrates the two lineages and fans out a_validatorfor the test/lint/type suite and runs the shared_review-coreskill for review, iterating while preserving the black box. It always creates the feature branch up front and gates PR creation on explicit user approval.
Skills
plugin-setup— walks the user through post-install configuration that the plugin install itself doesn't perform.continuous-integration— catalogues the vivarium-suite CI setup.team-conventions— SimSci Engineering conventions for everyday change flow.pytest— reference for the vivarium pytest setup:make test-*entry points, theslow/cluster/weeklymarkers fromvivarium_testing_utils, and where baked-in coverage output lands.framework-clis— reference for the vivarium-ecosystem console scripts (simulate,psimulate,vipin, per-repomake_artifacts,update_gbd_round) available in a standard model-repo env.environments— discovery-first guidance for picking up the right Python environment in a vivarium repo.vivarium-research— connector for the Vivarium Research documentation (https://vivarium-research.readthedocs.io). Discovers the docs nav tree on demand and searches modelling-strategy content via the Read the Docs v2 API.design-doc— SimSci Engineering convention for drafting a design document on the IHME hubbrainstorming— structured design exploration that produces a Jira plan comment, a new Jira ticket, or a Confluence design doc; ships a browser-based Mermaid diagramming companioncommit-splitter— dole out a bulk uncommitted diff into reviewable commits, and PR-sized branches when scope warrants.ticket-triage— turn code-review findings that are out of scope for the current PR into Jira ticket recommendations.repo-maintenance— audit the plugin's AI plaintext (skills, agents, commands, README, rootCLAUDE.md) for drift against upstream sources via per-unit_claim_auditorsub-agents; fixes are gated on user approval.change-propagation— propagate boilerplate across several targets (monorepo libs and/or external repos) in parallel, one_propagate_targetworker per target, then converge them into one draft PR per repo — every durable write gated on one explicit approval.workflow-assessment— post-hoc audit of an agentic workflow run against its own definition: fans out the_trace_extractorsub-agent over the run's session transcripts and grades coverage, ordering/gates, parallelism, handoffs, tool use, and result propagation, with transcript-cited findings. Claude Code-only, read-only throughout.
Loaded automatically when the context is relevant to the skill's description.
Layout
The marketplace catalog lives at the monorepo root; the plugin itself lives under
tools/ai-tools/:
<repo-root>/.claude-plugin/marketplace.json: marketplace catalog. Its single plugin entry uses"source": "./tools/ai-tools"to point at the plugin directory. Claude Code requires the marketplace catalog at the repo root for/plugin marketplace add ihmeuw/vivarium-suiteto find it.tools/ai-tools/.claude-plugin/plugin.json: plugin manifest.tools/ai-tools/agents/: specialist sub-agents spawned by the slash commands.tools/ai-tools/commands/: Claude Code slash commands.tools/ai-tools/skills/: Claude Code skills (model-loaded reference material for setup and usage flows)tools/ai-tools/CHANGELOG.rst: history of plugin changes.
Top-level project metadata (license, code of conduct, contributing guide) lives at the monorepo root and applies to this tool as well.
Installing in Claude Code
From GitHub:
.. code-block:: shell
/plugin marketplace add ihmeuw/vivarium-suite /plugin install viv@vivarium-ai-tools
For local development against a checked-out monorepo, point marketplace add
at the repo root (the directory containing .claude-plugin/), not at
tools/ai-tools/:
.. code-block:: shell
/plugin marketplace add /path/to/vivarium-suite /plugin install viv@vivarium-ai-tools
Once installed, the entry points are the slash commands
/viv:code-reviewer, /viv:model-regression-debugger, and
/viv:framework-development. These run the sub-agent fan-out at
main-session level and produce a multi-lens review, a regression
investigation, or an end-to-end feature build.
Delegation mechanism
The parallel fan-out runs at main-session level. That is what the
commands/*.md slash commands do: their allowed-tools: Agent(...)
field grants the main session permission to spawn the listed
_review_* (or _diff_analyzer / _hypothesis_tester)
sub-agents in parallel, and the slash command body is itself the
orchestration prompt.
The multi-lens review fan-out is defined once, in the internal _review-core
skill (skills/_review-core/SKILL.md, hidden from the / menu via
user-invocable: false), and invoked inline by /viv:code-reviewer
after it gathers PR context. A skill invoked from a command runs inline in the
same main session — not as a sub-agent — so _review-core can spawn the
_review_* fan-out itself, keeping it one level deep. That is what lets the
review be reused by other main-session commands without duplicating the
fan-out.
Security model and recommended deny rules
The agents in this plugin have the following shell access on Claude Code:
- The 5
_review_*sub-agents have no Bash access at all. They are fed PR context by the slash command and analyze code withRead,Grep, andGlobonly. _claim_auditorlikewise has no Bash access — it verifies plaintext claims withRead/Grep/Glob, read-only MCP calls (hub, Jira, Slack, Jenkins, GitHub), andWebFetchonly._duplicate_finderhas no shell or file access at all — its only tools are the read-only Jira MCPsearchandget_issuecalls it uses to check candidate tickets against the backlog._trace_extractorhas no Bash access —Read,Grep,Globonly. It is the one agent that deliberately reads outside the working tree: Claude Code session transcripts under~/.claude/projects/(which can contain anything). It returns compact digests, not transcript content, and is spawned only by theworkflow-assessmentskill._diff_analyzer,_hypothesis_tester, and_split_proposerdeclareBashto rungitandghcommands. In practice, every operation they perform is a read-only git command (git diff,git log,git show,git status), which Claude Code auto-approves via its built-in read-only command allowlist._split_proposeris additionally constrained by its own prompt to never run a state-changing git command._test_writerand_feature_implementerare the plugin's first write-capable sub-agents: they declareWrite/Editso they can author test files and fill in source stub bodies during the black-box TDD build. They are deliberately not grantedBash— they never run the suite,git, or shell commands, which confines their effect to file edits. Each runs inside its own git worktree (the/viv:framework-developmentcommand does thegit worktreemanagement), so neither tree contains the other's output; the "stay in your worktree" instruction in each brief discourages reaching across via an absolute path, since the worktree is not a hard read sandbox. Both are spawned only by the/viv:framework-developmentslash command._validatordeclaresBashso it can run the package'smake test-*/make lint/make mypytargets and report a PASS/FAIL verdict. It is read-only with respect to source and tests — it never edits files — but running a test suite executes arbitrary project code, so this is a broader grant than the read-only git agents above. It is spawned only by the/viv:framework-developmentslash command._propagate_target(spawned by thechange-propagationskill) also writes and runs the test suite: for a monorepo target it adapts files into alibs/<pkg>/subtree and runs that package'smake checkinside an isolated git worktree (its verification sandbox). Its prompt constrains it to write only within its assigned target and to never push, branch, commit, or open a PR — every durable write is the lead skill's, after explicit approval. For an external target it uses only read-only GitHub MCP calls and writes nothing.- The
/viv:code-reviewer,/viv:model-regression-debugger, and/viv:framework-developmentslash command bodies (running in the main session) gather PR/repo context through the GitHub MCP server (a plugin dependency; see theplugin-setupskill), falling back to read-only git/ghcommands when the MCP is unavailable;/viv:framework-developmentadditionally writes source and test files and runs make targets as it builds the feature.
For destructive or out-of-scope commands, Claude Code's default
permission system prompts you before execution, so a prompt-injected
agent cannot silently run rm, curl, or similar without your
approval.
If you run with defaultMode: bypassPermissions or auto, or
otherwise want an explicit deny floor that cannot be bypassed by an
errant prompt-allow, add this snippet to ~/.claude/settings.json:
.. code-block:: json
{ "permissions": { "deny": [ "Bash(git push *)", "Bash(git reset --hard *)", "Bash(git rebase *)", "Bash(git clean -fd *)", "Bash(gh repo delete *)", "Bash(gh auth logout *)", "Bash(gh pr close *)" ] } }
Deny rules take precedence over allow rules and over hook decisions, so these will block the listed commands in every permission mode.
Recommended sandbox configuration
For agentic use we recommend running Claude Code with its Bash sandbox
enabled — OS-level isolation (bubblewrap on Linux/WSL2, Seatbelt on macOS)
that confines writes to the working tree and denies reads of credential
files. The catch: a strict sandbox blocks the normal workflow unless you
grant the write paths and egress the toolchain needs. A working baseline
for ~/.claude/settings.json:
.. code-block:: json
{
"sandbox": {
"enabled": true,
"filesystem": {
"allowWrite": ["/miniconda3", "/.conda", "/.cache"],
"denyRead": ["/.ssh", "/.aws", "/.config/gh/hosts.yml"]
},
"network": {
"allowedDomains": ["github.com", "api.github.com", "pypi.org",
"artifactory.ihme.washington.edu"]
}
}
}
allowWrite covers conda/pip; denyRead closes the
credential-exfil path; network.allowedDomains is the egress allowlist
for sandboxed Bash. That denyRead of gh's token is why the gh
CLI can't run sandboxed — hence the GitHub MCP dependency, whose calls run
outside the sandbox. Even git push runs sandboxed once github.com
is allowlisted and git's credential helper points at a sandbox-readable
token file (see plugin-setup), so no un-sandboxing is needed for
normal git/GitHub work.