Getting Started
Set up Datarim in under 5 minutes
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
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-agentoragent). 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,cursorFrom 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.
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_PERMISSIONSin the state directory (present =full, absent =ask; change it withjev 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
echoorprintf; 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
echoorprintfthe 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 exampleclaude: executable missing, orcursor: Jev hook file missing (...)) and makes the exit code1. 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.jsonwith host Jev);nullwithout Jev;"native_agents_live"— per client,"state": "live"with a delivery count and the last delivery time once the ledger holds ahook_deliveryrecord 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": falseuntil 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.
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.
~/.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:
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.
127.0.0.1, ::1) — allowed; standard for dev compose.100.64.0.0/10 — allowed (mesh-only by definition).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.
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.