An example tree
The harness works in a research tree: one directory that holds your repositories and your notes. This page describes one such tree, the tree of the harness's author, as an example of how a user organises work around the harness. The overview figure of the Introduction shows its six directories: a library, a store of knowledge, the packages, the experiments, the projects and the papers. Your tree can have other directories and other names.
In the example, the tree is ~/Research. The verbs of the harness command that look for repositories of the tree read its path from $RESEARCH_ROOT, else they use ~/Research.
Each section below says three things about one directory:
- Holds: what the directory holds.
- Served by: the components of the harness that work on it. Each name links its section in Components. A component that serves more than one directory is in each of their sections. The components are agents, skills, rules, commands, git hooks, scripts and verbs of the
harnesscommand. - Named by: the key of the profile, the verb, or the tree instructions that give the directory's name.
Library
Holds: a catalogue of the papers and books of other authors. Each paper has a directory with its file and a short Markdown description.
Served by:
literature-scoutsearches the literature for a question. When a paper is already in the library, it says so and proposes no download.wiki-lint.jlchecks the paths and the line citations in the Markdown of the library.pre-commit-wikirunswiki-lint.jlbefore each commit in the library.harness wiki-lint-hook --applyinstalls it.
Named by: no profile key. The verb harness wiki-lint-hook and the script wiki-lint.jl find the library by its name, Library, below the research tree. In the example, the tree instructions name the directory's own instruction file.
Knowledge
Holds: a vault of Markdown notes that record what is established: facts, methods and measurements, with links between the notes.
Served by:
wiki-lint.jlgives the vault every check: links, paths, line citations and the structure of the notes.pre-commit-wikirunswiki-lint.jlbefore each commit in the vault.changelog-scribewrites a dated entry in the vault'sCHANGELOG.md, only for a change to what is established.math-verifykeeps the script of a mathematical check, and a note of the vault links that script.wait-whatasks the agent to explain its work again in the words that the vault uses.
Named by: no profile key. The verb harness wiki-lint-hook and the script wiki-lint.jl find the vault by its name, Knowledge, below the research tree. In the example, the tree instructions name it among the directories where a change goes to main directly, with no pull request.
Packages
Holds: the software packages, one git repository each, with their tests, their documentation and a CHANGELOG.md. In the example, they are Julia packages.
Served by:
- The agents of a planned change:
julia-builderbuilds one part of a plan, andjulia-criticjudges it. The skillbuild-partruns the two in a loop. For a smaller part, the skillbuild-reviewedrunspart-builderandpart-criticonce. A part of a package ends in a pull request. workerreads the directory's own instruction file before its first edit here.changelog-scribewrites an entry of aCHANGELOG.md, under a version heading.- The agents of a pull request:
julia-branch-verifierchecks a branch before the pull request opens,julia-pr-reviewerreviews it, andjulia-pr-shepherdtakes it to green CI. The commandsreview-prandmerge-prlook for the repository in this directory first. - The agents of a diagnosis:
julia-test-runner,julia-load-doctor,ci-triageandgit-hook-triage. - The skills of package work:
julia-structure,julia-package-audit,julia-surgical-fixandjulia-release. - The rules that load when the agent reads a matching file:
julia-code,julia-tests,julia-docs,changelogandknown-issues. - The shared git hooks
pre-commitandpre-push, and the workflows such asworkflows/CI.yml. The verbsharness githooks,harness push-allandharness ci-protectionwork on every git repository of this directory.harness workflowsworks on each of them that has aProject.toml.
Named by: the profile key repository_roots, which holds the path of this directory. The keys docs_exceptions and docs_additions name single repositories in it. The four verbs above find the directory by its name, Packages, below the research tree.
Experiments
Holds: the numerical experiments, one git repository each: code whose results you can make again, with its tests and a CHANGELOG.md.
Served by:
- The same agents of a planned change and of a pull request as in Packages:
julia-builder,julia-critic,part-builder,part-critic,julia-branch-verifier,julia-pr-reviewerandjulia-pr-shepherd, with the skillsbuild-partandbuild-reviewedand the commandsreview-prandmerge-pr. workerreads the directory's own instruction file before its first edit here.changelog-scribewrites an entry of aCHANGELOG.md, under a version heading.git-hook-triagefinds why a git hook blocked a commit or a push, or seems to hang.- The agents and the skill of a measurement:
julia-perf-analystmeasures time and allocations before and after a change, andjulia-performanceholds the method.julia-test-runnerruns the tests. - The rules
julia-code,julia-testsandchangelog. - The git hooks
pre-commitandpre-push, and the same four verbs as in Packages.
Named by: the profile key repository_roots, which holds the path of this directory beside the packages. The four verbs find the directory by its name, Experiments, below the research tree.
Projects
Holds: derivations and analysis: notes, calculations and scripts, with a research log of what was tried and what it showed.
Served by:
math-verifychecks one mathematical statement in Julia, with a case that must make the check fail, and keeps the check as a script.changelog-scribewrites an entry of the research log.julia-builderbuilds a part of a plan here too, but the part ends in a commit tomain, not in a pull request.workerreads the directory's own instruction file before its first edit here.
Named by: no profile key and no verb. In the example, the tree instructions name the directory's own instruction file.
Papers
Holds: the manuscripts, as LaTeX sources, each with the scripts that check its claims.
Served by:
latex-revisionruns a revision pass with marked changes, for example after a referee report.latex-verifierchecks the mathematics of a manuscript claim by claim, and writes a Julia script for each claim.math-verifychecks one statement, and the manuscript cites its script.literature-scoutfinds the references that a manuscript needs.changelog-scribewrites a dated pass, not a release, because a manuscript has no versions.julia-builderbuilds a part of a plan here too, but the part ends in a commit tomain, not in a pull request.workerreads the directory's own instruction file before its first edit here.
Named by: no profile key and no verb. In the example, the tree instructions name the directory's own instruction file.
The profile values of the tree
A tree such as this one sets two values of the profile. examples/profile.toml has them with an example home directory:
repository_roots = ["/home/example/Research/Packages", "/home/example/Research/Experiments"]
tree_agents = "/home/example/Research/Environment/Agents"repository_rootsholds the directories that hold the repositories of the tree.harness leakssearches the harness for the name of each directory below them, so that no source of the harness names one of your repositories.tree_agentsholds the directory of your tree instructions.harness installinstalls them into~/.claude/beside the sources of the harness. In the example, this directory is in the tree but is not one of the six directories of the figure.
Adapting the profile describes every key.
Another layout
Your tree can have other directories. Adapt the two values to it:
- Put each directory that holds your repositories into
repository_roots, with its absolute path. Its name can be any name. - Put the path of your tree instructions into
tree_agents. The directory can be anywhere. - Write your own directories, and the instruction file of each, into your tree instructions.
Some verbs do not take their directories from the profile. They find them by a fixed name below the research tree, $RESEARCH_ROOT or ~/Research:
harness githooks,harness workflows,harness push-allandharness ci-protectionlook inPackagesandExperiments.harness wiki-lint-hooklooks for the prose repositories,KnowledgeandLibraryamong them. The scriptwiki-lint.jlreads the same names.
A verb that finds no directory with its name skips it and changes nothing there. To use these verbs, keep the two names for the directories of your repositories, or set $RESEARCH_ROOT to a tree that has them.