Getting Started

Set up Datarim in under 5 minutes

Using an AI agent?

Give it the repository URL and ask it to install Datarim; it follows INSTALL.md. Step 1 for the agent: run ./install.sh --project <path> with no answer flags and ask you nothing before that run. Without a terminal the installer stops with a STOP, prints six questions with their defaults and a one-time answers token, and tells the agent to relay the questions word for word, without recommending an answer. The agent reruns with your answers and that token.

# repository
https://github.com/Arcanada-one/datarim

# the guide, raw (a summarizing web fetch drops most of it)
https://raw.githubusercontent.com/Arcanada-one/datarim/main/INSTALL.md
This page follows the canonical install guide, INSTALL.md on GitHub. If the two ever differ, INSTALL.md is right.

1 Prerequisites

  • Python 3.10 or newer, and git.
  • At least one installed and signed-in agent client: Claude Code (claude), Codex CLI (codex) or Cursor CLI (cursor-agent or agent). Datarim does not create client accounts and does not read model-provider keys; each client signs in by itself.
  • The project directory. A git repository is recommended: that is what lets the installer hide its files through .git/info/exclude.
  • For Jev routing advice only: a Jev API key, issued by the Jev API provider, TypeSafe (api.typesafe.ai). You need one key per computer, shared by every client on it. Without a key Jev still runs its local safety floor; only the routing advice is missing.

2 Get the source

git clone https://github.com/Arcanada-one/datarim.git ~/src/datarim
cd ~/src/datarim
git checkout "$(git describe --tags --abbrev=0 --match 'v*')"   # latest release tag

Keep this checkout: update.sh and --uninstall run from it later, so put it somewhere lasting such as ~/src/datarim, never in /tmp, and never inside the project. Staying on main is also supported. The installed commit is recorded in <project>/.datarim-runtime/installation.json (source_sha). To pin a project to a release, check out that tag (git checkout vX.Y.Z) before installing or updating. Host Jev refuses to install from a checkout with uncommitted changes.

Human Outcome Reporting without Datarim

Choose this when you want clear agent reports in every project without installing the framework. The portable skill is versioned separately (0.2.2) and included in Datarim 4.2.1. Download the standalone ZIP and its signed checksums from the release, verify them as described in the release guide, then extract the archive:

human-outcome-reporting.zip · Download release assets

python3 install.py install --agents claude,codex,cursor --dry-run
python3 install.py install --agents claude,codex,cursor
python3 install.py check --agents claude,codex,cursor

From a checked-out release instead: python3 scripts/human_reporting_install.py install --agents claude,codex,cursor. Use Python 3.10 or newer on macOS or Linux. The skill directories are ~/.claude/skills, ~/.agents/skills for Codex, and ~/.cursor/skills. The installer adds the skill to each selected client and its native persistent policy: Claude output style, a managed Codex AGENTS.md block, and Cursor session-start context. Existing foreign rules and hooks are preserved; a conflicting owned path is refused. Restart the client and test a new session. For Cursor, start a new conversation; resuming an existing chat does not rerun the session-start hook. A project-specific Claude output style may take precedence. Cursor user configuration applies to this account; install separately for another host or remote account. Installation checks prove files and configuration, not that every future answer will comply.

For Datarim projects, install or update the framework below; its commands load the same reporting skill automatically. Host-wide reporting does not activate Datarim in other projects. python3 install.py uninstall --agents claude,codex,cursor removes only owned standalone artifacts.

Human Outcome Reporting · /dr-explain

3 Decide first

The installer asks five interactive questions; the release choice below is also part of setup. At a terminal it asks them one by one; Enter takes the default. Without a terminal (an agent, a script) a fresh install stops with STOP. Nothing was installed., exits with code 2 and writes nothing, --dry-run included. It lists the questions with their defaults, tells the agent to relay them word for word without recommending an answer, and prints a one-time --answers <token>: valid for 60 minutes, for this project only, used up by a successful install; each new refusal replaces it. The rerun needs every answer (Jev, --client, --permissions) and that token. An AI agent never picks the answers itself; accept the defaults only when the user says so.

# Question Default
1 Install Jev? none / project (this project only) / host (every project of this user on this machine) none
2 Which clients do you use: Claude Code, Codex, Cursor? Pass one --client per client (or a comma list); commands and, with --with-jev, hooks are written only for those. the ones installed on the machine
3 Should the jev* launchers (every install has them) start clients without permission prompts? Answered with --permissions ask or --permissions full: required on a fresh install, remembered on update; jev permissions changes it later. Starting a client directly is not affected. no (ask)
4 Create empty task files datarim/tasks.md and datarim/backlog.md now (--init)? yes
5 Expose every framework skill to the clients’ automatic discovery (--expose-skills)? It adds their descriptions to every session. no
6 Install the latest release tag, or main? latest release tag

Nested git repositories: if the project contains some and Datarim should work inside them, add one --context <relative/path> per repository. Find them with find "$PROJECT" -mindepth 2 -name .git -not -path '*/node_modules/*'.

4 Install

Set the project path once (absolute), then run the installer with only the project path and no answer flags. An agent asks the user nothing before this run.

PROJECT=/absolute/path/to/project
./install.sh --project "$PROJECT"   # asks the questions at a terminal; otherwise prints them, the flag for each answer and a one-time token

Without a terminal: ask the user the printed questions, wait for the answers, then rerun with the flags the answers give (below) and --answers with the printed token, within an hour. Add --dry-run to that rerun first to see the plan. Answer flags passed without a valid token are listed as ignored. Never pick the answers yourself: Jev’s safety floor works without any key, so a missing key is not a reason to answer “no Jev”.

Option A — Datarim only (default)

User answered “no Jev” → flag --without-jev, plus the --client list and the --permissions answer they chose.

Never pass it on the user’s behalf: a missing key is not a reason to skip Jev, its safety floor works without one.

Option B — Datarim with project-level Jev

User answered “Jev for this project” → flag --with-jev, plus the --client list and the --permissions answer they chose.

Jev hooks are registered in this project only, for the clients you select (.claude/settings.local.json, .codex/hooks.json, .cursor/hooks.json), and an empty key file is created at config/credentials/jev/api-key (mode 0600). Do not use this option on a machine that already has host Jev: both sets of hooks would run. Use option C instead.

Option C — host-wide Jev, and Datarim in this project

User answered “Jev for the whole machine” → flags --with-jev --host-jev, plus the --client list and the --permissions answer. Only in that case, install host Jev first:

# only if the user chose host Jev
python3 scripts/jev_host_install.py --client claude --client codex --client cursor \
  --datarim-project "$PROJECT" --dry-run
python3 scripts/jev_host_install.py --client claude --client codex --client cursor \
  --datarim-project "$PROJECT"

Host Jev is installed once per user and applies to every directory that user opens. It writes ~/.config/jev/, ~/.local/share/jev/, ~/.local/state/jev/, the launchers ~/.local/bin/{jev,jevclaude,jevcodex,jevcursor} (that directory must be on PATH), and merges its hooks into each chosen client’s user config, keeping every existing hook. --datarim-project replaces the host’s list of Datarim projects: when you add a project later, pass every project again. The key file is ~/.config/jev/credentials/api-key.

Option D — Jev without Datarim

python3 scripts/jev_host_install.py --client claude --client codex --client cursor --dry-run
python3 scripts/jev_host_install.py --client claude --client codex --client cursor

The same host installer, without --datarim-project, and no project install. Details: Use Jev on its own.

Other install options

--client <name> claude, codex, cursor or all; repeat it or give a comma list. Only these clients get command files and (with --with-jev) hooks. Required on a fresh install; kept across updates. A client left out on an update loses its command files and Jev hooks.
--claude-import / --no-claude-import Deprecated since 4.1: accepted with a notice and no effect. Claude Code reads AGENTS.md natively; no instruction symlink is created.
--permissions ask|full The permission-mode answer (question 3). Required on a fresh install and remembered on update. It sets the same switch as jev permissions, for the project or, with host Jev, for the host.
--answers <token> The one-time token a refusal prints. Needed on a fresh install without a terminal, together with the answers; valid for 60 minutes, for this project only, used up by a successful install. Each new refusal replaces it. Updates do not need it.
--init Creates datarim/tasks.md and datarim/backlog.md if missing. Existing files are kept.
--expose-skills Also writes every framework skill into .agents/skills/, .claude/skills/, .cursor/skills/. Their descriptions load into every session.
--context <relative/path> Lets an existing nested git repository use this installation. Repeat per repository; given again, it replaces the list; --no-context clears it.
--without-jev, --no-host-jev --without-jev is the “no Jev” answer a fresh install requires. On update they turn off a recorded --with-jev or --host-jev; --without-jev then withdraws the project’s Jev hooks and jev-config.json; the key file stays.
--dry-run Prints the plan as JSON; writes nothing. On a fresh install without a terminal it refuses like the install itself until it has the answers and the token.

Only when the user said “defaults”: --without-jev, --client with the clients installed on the machine, --init and --permissions ask.

Scripted installs (CI)

There is no switch that skips the answers token. A pipeline with fixed, reviewed answers takes two steps: the first run refuses and prints the token on its rerun line, the second passes that token with the same answers. Replace <flags> with the reviewed answer flags, identical in both runs:

out="$(./install.sh --project "$PROJECT" <flags> 2>&1)"
token="$(printf '%s\n' "$out" | sed -n 's/.*--answers \([0-9a-f][0-9a-f]*\) .*/\1/p' | tail -n 1)"
[ -n "$token" ] || { printf '%s\n' "$out" >&2; exit 1; }
./install.sh --project "$PROJECT" --answers "$token" <flags>

An AI agent installing Datarim for a person does not do this: it relays the questions the first run prints and uses the person’s answers.

The report after an install

After every install or update the installer prints its report lines inside a fenced block, led by “Copy the block below into your reply to the user unchanged (you may add your own text after it):”. An agent copies the whole block into its reply unchanged, without paraphrasing it; its own text may follow the block. The lines are:

  • the permission mode and the file that stores it: FULL_PERMISSIONS in the state directory (present = full, absent = ask; change it with jev permissions full|ask);
  • with Jev, the key file path, with the note that the Jev safety floor works without a key; paste the key with an editor, never with echo or printf;
  • never in .zshrc/.bashrc: JEV_* or DATARIM_* variables (e.g. JEV_PERMISSIONS) or the key; set them per shell or per launch;
  • when the project has AGENTS.md: AGENTS.md is not modified by the installer;
  • with Codex and Jev, how to accept Codex’s hooks; with Codex or Cursor, that .agents/skills/dr-* / .cursor/skills/dr-* are the /dr-* commands packaged for them, not extra framework skills.

The install is project-local: a pinned snapshot of the framework goes into .datarim-runtime/, the /dr-* commands go where each client finds them (Claude Code → .claude/commands/, Codex → .agents/skills/, Cursor → .cursor/skills/), and everything it writes is hidden from git status through .git/info/exclude. It does not touch your home directory, your shell startup files, AGENTS.md or .gitignore. Since 4.1, Claude Code reads AGENTS.md natively; the installer never creates CLAUDE.md. Per-client details: Runtimes.

5 Jev key, permission mode and settings

Jev is optional. It adds a deterministic safety floor — a hook that refuses destructive shell commands, with no key or network needed — and, with an API key, model-tier routing advice. The advice is a suggestion: it does not switch the running model and grants no permissions.

Where the Jev key goes

Open the key file for your install in an editor, paste the key on one line, save. The file already exists with mode 0600; keep it that way. A --with-jev install prints the exact path.

Install Key file
Project Jev (option B)<project>/config/credentials/jev/api-key
Host Jev (option C or D)~/.config/jev/credentials/api-key
$EDITOR ~/.config/jev/credentials/api-key   # host Jev; project Jev: config/credentials/jev/api-key
  • One key per computer, shared by all its clients; use a different key on each computer.
  • Never echo or printf the key into the file: the command lands in your shell history. Never put the key in a commit, a settings file or a chat.
  • export TYPESAFE_API_KEY=... does not work: the launchers and hooks remove that variable and read only the file.
  • With host Jev the project’s own key file stays empty and unread; that is correct.

Permission mode (Jev launchers only)

jev permissions          # show the current mode
jev permissions full     # jev* launchers start clients without permission prompts
jev permissions ask      # back to the client's own prompts (default)

full adds --dangerously-skip-permissions (Claude Code), --dangerously-bypass-approvals-and-sandbox (Codex) or --force --approve-mcps (Cursor) to launches through jev, jevclaude, jevcodex, jevcursor, unless you pass your own permission option. The installer’s --permissions ask|full answer sets the same switch. It is stored per project (project install) or per host (host Jev). The safety floor still runs in full mode. Starting claude, codex or cursor-agent directly is not affected. jev off / jev on stop and resume the API calls; the safety floor keeps running either way.

Configuration and secrets

Nothing here is committed: project paths are hidden by .git/info/exclude, host paths live in your home directory. The environment variables below are set per shell or per launch, never in .zshrc, .bashrc or another startup file: there JEV_PERMISSIONS=full, for example, would turn off permission prompts for every jev* launch. Persistent choices have their own switches: jev permissions, jev on / jev off and the settings file. The code that reads each setting is named in INSTALL.md.

Setting Where Required Default
Jev API key (project Jev) file <project>/config/credentials/jev/api-key, mode 0600 only for routing advice created empty
Jev API key (host Jev) file ~/.config/jev/credentials/api-key, mode 0600 only for routing advice created empty
Jev settings (project) <project>/.datarim-runtime/jev-config.json: endpoint, timeouts, retries, routing modes, hook switches, telemetry no copied from plugins/dr-jev-control/config/jev-control.json
Jev settings (host) ~/.config/jev/config.json, including datarim_projects (projects allowed to use Datarim) no same defaults; api.base_url must stay https://api.typesafe.ai/v1/systemone
On/off switch jev off / jev on: file DISABLED in .datarim-runtime/state/jev/ or ~/.local/state/jev/ no on
Permission mode jev permissions full|ask: file FULL_PERMISSIONS in the same state directory; env JEV_PERMISSIONS=full|ask overrides it for one launch no ask
Disable Jev advice for a shell env JEV_DISABLE=1 or DATARIM_JEV_DISABLE=1 (the safety floor still runs) no unset
Codex model per Jev tier env DATARIM_CODEX_MODEL_HAIKU, _SONNET, _OPUS no Codex account default, tier mapped to effort
Cursor model per Jev tier env DATARIM_CURSOR_MODEL_HAIKU, _SONNET, _OPUS no Cursor default model
Client executable env CLAUDE_BIN, CODEX_BIN, CURSOR_BIN no claude, codex, cursor-agent (or agent) on PATH
Codex auto re-trust env JEV_NO_AUTO_TRUST=1 stops jevcodex (host Jev) from re-granting Codex trust to Jev’s own hooks no unset
Execution-host map env DATARIM_EXEC_HOSTS_MAP, a YAML map of which machine may run tasks for a workspace no $HOME/.claude/local/config/execution-hosts.yml; an absent map means the check is skipped

Set by the entry points, never by hand: DATARIM_RUNTIME (by source .datarim-runtime/activate.sh, together with PATH), and DATARIM_ROOT, DATARIM_PROJECT_ROOT, DATARIM_JEV_CONFIG, DATARIM_JEV_HOME, DATARIM_JEV_STATE, TYPESAFE_API_KEY_FILE, JEV_STATE_DIR, JEV_HOST_STATE (by jev* and the hooks). Model-provider keys (ANTHROPIC_API_KEY, OPENAI_API_KEY and the like) are not read by the installer, Datarim’s commands or Jev; your clients keep their own sign-in.

6 Verify

cd "$PROJECT"
git status --short                       # expect: nothing from Datarim
source .datarim-runtime/activate.sh      # current shell only
jev doctor --agent=claude                # or --agent=codex / --agent=cursor

Expected jev doctor output (JSON), exit code 0:

  • "scope": "project" (or "host" with --host-jev), "datarim_enabled": true;
  • "findings": [] — a finding names what is missing (for example claude: executable missing, or cursor: Jev hook file missing (...)) and makes the exit code 1. Without --agent, doctor checks all three clients, so a client you do not use becomes a finding;
  • "hook_clients" — the clients whose Jev hooks this install registered;
  • "config_path" — the Jev settings file in use (.datarim-runtime/jev-config.json, or ~/.config/jev/config.json with host Jev); null without Jev;
  • "native_agents_live" — per client, "state": "live" with a delivery count and the last delivery time once the ledger holds a hook_delivery record from that client; not_measured (with a reason) until the client has run a hook. When more than one client is registered, it lists every registered client, not only the one in --agent; a client without deliveries shows “no deliveries yet”;
  • "key_ready": false until you add a key (true means the file is non-empty, not that the key is valid);
  • "api": "not_measured" — offline doctor makes no network call; this is neither a pass nor a failure;
  • "source_sha" — the commit you installed.

After adding a Jev key, jev doctor --api should exit 0 with "api": {"ok": true, "model": "...", ...}; a missing key gives "reason": "key missing" and exit code 1.

Checks that need no key

The safety floor, with Jev installed. Run in the project; the destructive command is only text inside the JSON payload, nothing is executed:

printf '{"tool_name":"Bash","tool_input":{"command":"rm -rf /"},"cwd":"%s","session_id":"check"}' "$PWD" \
  | python3 .datarim-runtime/scripts/jev_hook.py claude PreToolUse      # project Jev
# host Jev: pipe the same payload into  ~/.local/share/jev/bin/jev-hook claude PreToolUse

Expected: "permissionDecision": "deny" with the reason Jev deterministic safety floor: recursive delete of a protected path.

Question Check Expected
Do the clients call the hooks? Use a client for one short session in the project, then tail -n 3 .datarim-runtime/state/jev/ledger.jsonl hook_delivery records naming the client. Floor denials are not recorded. Host Jev keeps its ledgers under ~/.local/state/jev/projects/.
Is Jev installed and scoped correctly? jev doctor --agent=<client> the fields above; after that session native_agents_live shows the client as live
Are the task files well-formed? bash .datarim-runtime/scripts/datarim-doctor.sh --root="$PWD", or /dr-doctor in a client OK: datarim/ structure compliant

jev doctor answers for Jev (clients, hook registrations, key file, scope, Codex trust, hook deliveries); datarim-doctor.sh and /dr-doctor answer only for the structure of the datarim/ task files.

Codex runs hooks only after you trust them

With Jev and Codex, the first Codex session asks twice: to trust the working directory, then Hooks need review → Trust all and continue. Declining is silent: Codex still lists the hooks as active but never runs them. jev doctor --agent=codex reports codex_hook_trust as trusted, untrusted or not_measured, from the grants Codex stores in ~/.codex/config.toml.

Host Jev: for the hooks in ~/.codex/hooks.json. If another tool rewrote that file, jev trust re-grants trust to Jev’s own hooks only; jevcodex does this automatically unless JEV_NO_AUTO_TRUST=1. Project Jev: for the hooks in <project>/.codex/hooks.json; jev trust, run inside the project, re-grants trust to exactly those hooks, and jevcodex does not do it automatically. An install that changes the hook command (for example the interpreter path) makes Codex report the hooks as changed; jev trust or the Codex prompt approves them again.

7 Update

cd ~/src/datarim
git fetch --tags origin
git checkout "$(git describe --tags --abbrev=0 --match 'v*' origin/main)"   # or: git checkout main && git pull
./update.sh --project "$PROJECT"   # the choices you installed with are remembered

update.sh runs the same installer as one transaction: it checks every file first, refuses to overwrite anything you edited, and rolls back on failure.

Your install choices are remembered. --with-jev, --host-jev, --context, --client, --expose-skills are recorded in .datarim-runtime/installation.json, so a plain update.sh --project keeps them, and the permission mode stays as it is. Pass an option only to change it: --without-jev withdraws the project’s Jev hooks and jev-config.json (the key file stays), --no-host-jev returns to project hooks, --no-context withdraws nested repositories, --client sets a new client list. Installs made before 4.0 have no recorded client list and keep all three.

Kept across an update: datarim/, config/credentials/, .datarim-runtime/state/ (ledger, on/off and permission switches), and .datarim-runtime/jev-config.json while Jev stays on. Anything else inside .datarim-runtime/ is replaced, including the plugin links under .datarim-runtime/local/: run /dr-plugin sync after the update. The previous runtime is kept in .datarim-runtime-previous/, older ones in .datarim-runtime-backups/. Host Jev: rerun scripts/jev_host_install.py with the same --client and --datarim-project options from the updated checkout; Codex keeps its trust, because the hook command names a stable entry point.

Coming from Datarim 2.x
2.x installed globally, with links into the clients’ home directories. Those flags no longer exist. Remove only the links under ~/.claude/{agents,skills,commands,templates,scripts,tests,dev-tools} (and the Codex and Cursor equivalents) that resolve into your Datarim checkout, then install per project as above. A project installed before 3.0 had a block appended to its AGENTS.md and rules appended to .gitignore; the next install or update removes both and leaves the rest of those files alone.

8 Uninstall

~/src/datarim/install.sh --project "$PROJECT" --uninstall --dry-run
~/src/datarim/install.sh --project "$PROJECT" --uninstall

This restores the files the install changed to their pre-install content, removes the command files and hook entries it added, and moves the runtime to .datarim-uninstalled/. Task state (datarim/), keys (config/credentials/) and runtime backups stay, still hidden from git; delete them yourself when you no longer need them. A second uninstall refuses while .datarim-uninstalled/ exists. Files you edited after install stop the uninstall until you reconcile them.

Host Jev has no uninstaller. jev off stops all Jev API calls on the host. To remove it, delete the Jev entries (commands naming ~/.local/share/jev/bin/jev-hook) from the client configs, then ~/.local/bin/{jev,jevclaude,jevcodex,jevcursor}, ~/.local/share/jev/, ~/.config/jev/ (holds the key) and ~/.local/state/jev/ (holds install backups).

Something went wrong? The troubleshooting table in INSTALL.md maps each installer message to its cause and fix.

9 Your First Task

Go to the project where Datarim is installed and start your agent (in Codex and Cursor, ask it to run the dr-init skill):

cd /path/to/your/project
claude

# Inside Claude Code:
/dr-init Add dark mode toggle to settings page

Datarim analyzes your request, determines complexity (L1-L4), and creates task tracking in datarim/.

Since v2.7.0: Step 2.5b adds a soft advisory when your description overlaps in topic with an item already pending in the backlog, so you do not spawn a second ID for the same work. Non-blocking — you decide duplicate / refine-scope / orthogonal before continuing.

10 Follow the Pipeline

Not every task needs all 8 stages. Datarim routes by complexity:

L1
Simple fix
init → do → archive
L2
Standard feature
init → prd (with lite research) → plan → do → qa → archive
L3
Complex feature
init → prd (with full research) → plan → design → do → qa → compliance → archive
L4
Major project
All 8 stages + consilium + strategist review

11 Essential Commands

/dr-help List all commands
/dr-init Start a new task
/dr-prd Requirements + context research
/dr-plan Detailed implementation plan
/dr-do Implement planned changes (TDD)
/dr-qa Run quality checks
/dr-verify Run an on-demand tri-layer verification
/dr-archive Reflect, archive, update backlog
/dr-write Create content
/dr-publish Publish to platforms
/dr-status Current task progress

12 Project Structure

After /dr-init, your project gets:

your-project/
├── .datarim-runtime/        # the framework at this revision (kept out of git)
├── datarim/                 # workflow state (kept out of git)
│   ├── tasks.md             # active tasks
│   ├── backlog.md           # pending items
│   ├── activeContext.md     # current focus
│   ├── tasks/               # task documents
│   └── ...                  # prd/, creative/, reflection/, qa/, reports/, history/
└── documentation/
    └── archive/             # completed tasks (commit this)
        ├── web/
        ├── infrastructure/
        └── ...

datarim/ is your local workflow; the install hides it, together with .datarim-runtime/, through .git/info/exclude without editing the shared .gitignore. documentation/archive/ is project history — commit to git.

Init-task file and Q&A log (v2.9.0): /dr-init stores your original prompt in datarim/tasks/{ID}-init-task.md verbatim. Every later clarification — the agent's question and your answer — is auto-appended to the file's Append-log as a structured «Q&A by /dr-<stage>» block. If you do not answer, the agent decides autonomously by best practices and records a rationale of at least 50 characters; the review stage verifies every autonomous decision against the implementation.

13 Plugins (v1.23.0+)

Extend Datarim with opt-in plugins via /dr-plugin. Each plugin is a directory with plugin.yaml + {skills,agents,commands,templates}/ subdirs. Enabling creates symlinks under .datarim-runtime/local/<cat>/<plugin-id>/ inside the project.

/dr-plugin list                              # active set
/dr-plugin enable /path/to/my-plugin     # enable a local plugin
/dr-plugin disable my-plugin              # disable
/dr-plugin sync                              # reconcile runtime ↔ manifest
/dr-plugin doctor [--fix]                    # 10 health checks

Active-set manifest: datarim/enabled-plugins.md. Pre-mutation snapshot/rollback on every enable. Full reference — command page →

Bundled plugins: dr-orchestrate, dr-jev-control, tdd-enforcement, dr-fleet-evolution and (v3.1.0+) controller-continuation — the /dr-continue-checkpoint worker entry for projects that run their own external controller, Linux only. It is not a core command: the core stays at 29 commands.

14 Network Exposure Baseline (v1.24.0+)

Secure-by-default contract for network bind targets: docker-compose ports, redis.conf bind, postgresql.conf listen_addresses, systemd .socket. Public-by-default = breach-by-default; the new network-exposure-baseline.md skill formalises the tier model with TTL-bounded waivers.

Tier 0
unix socket / no port published — allowed without justification.
Tier 1
loopback (127.0.0.1, ::1) — allowed; standard for dev compose.
Tier 2
Tailscale CGNAT 100.64.0.0/10 — allowed (mesh-only by definition).
Tier 3
0.0.0.0, [::], public IPs — require inline x-exposure-justification + x-exposure-expires (≤90 days).

Local pre-commit check:

dev-tools/network-exposure-check.sh \
  --compose docker-compose.yml \
  --redis-conf redis.conf \
  --postgres-conf postgresql.conf
# exit 0 — clean; exit 1 — violation

Reusable CI workflow in .github/workflows/ci.yml:

jobs:
  network-exposure:
    uses: Arcanada-one/datarim/.github/workflows/network-exposure-lint.yml@<40-hex-commit>
    with:
      compose_paths: docker-compose.yml docker-compose.prod.yml
      datarim_ref: '<same-40-hex-commit>'

Pipeline commands (/dr-prd, /dr-plan, /dr-do, /dr-archive) auto-load the skill on network-surface changes. Tiered gate: P0 / security / infrastructure / framework-hardening tasks → hard_block; otherwise → advisory_warn with operator override.

15 Autonomous Agent Operating Rules (v2.6.0+)

When operator requirements are incomplete, complex, or ambiguous, the agent must not stall and escalate unnecessarily. Eight canonical rules (FB-1..FB-8) define autonomous behaviour under Supreme Directive Laws 1-5. The mandate lives in the consumer's ecosystem AGENTS.md (canonical text + audit tagging); Datarim ships only the machine-readable contract block.

FB-1
Research available options.
FB-2
Compare against best practices, security, maintainability.
FB-3
Council by professional roles (architect / dev / DevOps / security / QA / PO).
FB-4
Pick an option and write the reason to the audit log.
FB-5
Execute safely-doable parts without operator involvement.
FB-6
Make decisions reversible under uncertainty.
FB-7
Allow adjustment, rollback, or re-do after testing.
FB-8
Escalate only genuinely blocking questions.

Machine-readable policy block:

dev-tools/rules/fb-rules.yaml
# rules: 8 × {rule_id, enforcement_layer, tier, default_action,
#               reversibility_required, audit_required, conflicts_with_law}
# hard_gated_actions: [prod_deploy, secret_rotation, irreversible_db_op,
#                      public_communication, finance_action, legal_action,
#                      force_push_main, git_history_delete, multi_user_visible_action,
#                      content_consilium_publish]

Hierarchy: Supreme Directive (Laws 1-5) > Autonomous Agent Operating Rules > AAL Mandate > project-specific mandates. hard_gated_actions NEVER auto-execute regardless of FB-5. Loader: dev-tools/fb-policy-loader.sh § load_fb_policy() / load_fb_hard_gates() (core; the dr-orchestrate plugin calls it through a thin shim).

D Documentation: Diátaxis Taxonomy

Every Datarim-managed repo and product site must organise its documentation per Diátaxis: four orthogonal categories — tutorials/ (learning), how-to/ (problem-solving), reference/ (lookup), explanation/ (understanding).

documentation/
├── tutorials/        # learning-oriented
├── how-to/           # problem-solving (testing, deployment, gotchas)
├── reference/        # information-oriented (architecture, api, cli)
└── explanation/      # understanding-oriented (design, concepts)

Closed set: faq, glossary, troubleshooting, examples, overview, samples — mappable, never separate top-level types. Stack-agnostic — SSG/CMS choice per-project. /dr-init create project scaffolds this layout under documentation/; /dr-optimize gives a soft drift warning, and a hard CI gate is deferred.