diff --git a/dokimi/CHANGELOG.md b/dokimi/CHANGELOG.md
index a276d106..0364e90f 100644
--- a/dokimi/CHANGELOG.md
+++ b/dokimi/CHANGELOG.md
@@ -23,3 +23,50 @@ Pending changes are fragments in [`changelog.d/`](changelog.d/), collected
here when a version is released.
+
+
+## [0.1.0] — 2026-10-19
+
+First release on PyPI. Requires Python 3.11 to 3.14.
+
+### Added
+
+- `dokimi --version`; runs and scorecards record `dokimi_version`.
+- `tools preference`: how much one change to a tool moves a model's choice between two equal tools; `--max-cost-usd` caps its spend.
+- `repo compare`: treatment arms against a baseline arm, paired by task.
+- `context trace`: prompt size of every model call in a Claude Code trace.
+- `novelty --max-usd` spend cap; `novelty routing --catalog` tests against the real sibling skills.
+- Guidance-only repo manifests: `repo scan`, `reach` and `validate` without tasks.
+- `repo run --build-timeout` and `repo tasks check --build-timeout` (default 3 h).
+- Arms artifacts store the exact text the judge read; `eval cross-judge --judges` re-scores on it.
+- Novelty `bundle` records name what was measured (`artifact_name`, `artifact_ref`, `measured_digest`).
+- Documentation site at https://intel.github.io/dokimi/.
+
+### Changed
+
+- Default models: answers and generation `openai/gpt-6.1-sol`, judge `anthropic/claude-sonnet-5-5`, on every command. Scores differ from earlier defaults.
+- `--judge-provider` alone picks that provider's default judge model; `google`, `google-vertex` and `openrouter` require `--judge-model`; `openai-codex` is no longer offered.
+- Question sets are written as `questions.v2` (`question` instead of `text`); v1 sets still load.
+- A golden set under `--questions-root` is answered as-is: no question generation, no persona discovery.
+- Every judge path refuses a record with no question text before the first judge call (exit 2).
+- `eval panel-score` checks numeric claims the way the single judge does. Panel scores differ from earlier runs.
+- `harmful_atoms` reports `measured: false` when the conflict check did not cover every atom pair.
+- `command:`, Harbor, BenchFlow and explorer timeouts kill the whole process tree.
+- Bundled registries and the spec schema ship inside the package.
+- RAGAS is an optional extra: `eval ragas` and `answers generate --ragas` need `pip install 'dokimi[ragas]'`, and exit 1 before any model call without it.
+- `beautifulsoup4` and `anthropic` are no longer direct dependencies.
+
+### Removed
+
+- Python 3.10.
+- The top-level `cli` module is no longer installed; use `dokimi`, `python -m dokimi` or `dokimi.cli`.
+
+### Fixed
+
+- `eval panel-score` judged every answer with an empty question and no context. Panel scores differ from earlier runs.
+- Judge and panel replies with non-finite or out-of-range scores are rejected and not cached.
+- The trust gate's retrieval hit rate read a field nothing wrote, so it reported 100% for runs with no documents.
+- `tasks run` could score a failed cell as passed (relative `--output-dir`, or a stale run dir that could not be cleared).
+- Question id `0` was read as missing.
+- The agentic arm ran a tool on `{}` when its arguments did not parse; failed calls are now recorded.
+- Novelty no longer counts truncated or failed replies, non-atom rows or non-boolean verdicts as results.
diff --git a/dokimi/README.md b/dokimi/README.md
index 0a116469..2b0e2ec4 100644
--- a/dokimi/README.md
+++ b/dokimi/README.md
@@ -70,13 +70,19 @@ The project is pre-1.0; interfaces and artifact schemas may still change.
- Optional extras: `ragas` (`eval ragas`, `answers generate --ragas`), `ocr`
(Docling ingestion) and `mcp` (real MCP servers).
+```bash
+pip install dokimi # the released package and the `dokimi` command
+```
+
+From a source checkout (to contribute, or to run the bundled tasks):
+
```bash
pip install -e ".[dev]" # installs the `dokimi` command plus test tooling
# or, without installing the package:
pip install -r requirements.txt -r requirements-test.txt
```
-The examples below use `python cli.py …`; after `pip install -e .` the
+The examples below use `python cli.py …` from a checkout; the installed
`dokimi …` command is equivalent. For what a run costs in API calls,
see the [cost estimate](https://github.com/intel/dokimi/blob/main/dokimi/docs/quickstart.md#cost-estimate).
diff --git a/dokimi/changelog.d/20261014_000000_versioning.md b/dokimi/changelog.d/20261014_000000_versioning.md
deleted file mode 100644
index 77e7048f..00000000
--- a/dokimi/changelog.d/20261014_000000_versioning.md
+++ /dev/null
@@ -1,29 +0,0 @@
-### Added
-
-- **Versioned releases, starting at 0.1.0** — `dokimi --version` prints the
- version, `dokimi.__version__` exposes it, and the `dokimi run` manifest and the subject
- scorecard `run_manifest` record it as `dokimi_version`, so either of those two results
- can be tied to the release that produced it (other artifacts do not record it yet).
- The version is single-sourced from `project.version` in `pyproject.toml`.
-- **Changelog** — this file, built at release time from per-PR fragments in
- `changelog.d/` (`scriv create`).
-
-### Changed
-
-- **Bundled registries and the spec schema live in the package** —
- `products.yaml`, `intents.yaml`, `config/products.yaml` and
- `benchmarks/spec.schema.json` moved to `dokimi/products.yaml`,
- `dokimi/intents.yaml`, `dokimi/config/products.yaml` and
- `dokimi/runner/spec.schema.json`, so an installed wheel carries them and
- works outside a source checkout. A `config/products.yaml` in the working
- directory still overrides the bundled one for `answers generate` and
- `questions generate`. `explore` without `--tasks-root` in an installed
- package now says the bundled tasks need a source checkout, instead of
- finding no tasks.
-
-### Removed
-
-- **The top-level `cli` module is no longer installed** — the wheel used to ship
- `cli.py` as a top-level module, so `import cli` and `python -m cli` worked after
- `pip install`. Use the `dokimi` command, `python -m dokimi` or
- `from dokimi.cli import main`; `python cli.py` still works in a source checkout.
diff --git a/dokimi/changelog.d/20261016_122720_napetrov_refactor-novelty-bundle.md b/dokimi/changelog.d/20261016_122720_napetrov_refactor-novelty-bundle.md
deleted file mode 100644
index e900af32..00000000
--- a/dokimi/changelog.d/20261016_122720_napetrov_refactor-novelty-bundle.md
+++ /dev/null
@@ -1,26 +0,0 @@
-### Added
-
-- **The novelty `bundle` record names what it measured** — the `analyze` artifact's
- `bundle` block (`novelty.v1`) gains `artifact_name`, `artifact_ref` and `measured_digest`
- (the digest of exactly the files measured; every novelty `ref_digest` is this value), and
- the `probes.json` bundle block gains `artifact_ref` and `files`. Older records still
- validate.
-
-### Changed
-
-- **A saved answer key survives a new symlink or image** — `novelty probe` no longer
- reports a key as stale when a symlink or a non-text file was added to the skill after
- extraction; an edited measured file or a new file the run would measure still does.
-- **Hand-edited or partial `bundle` records read differently** — an `atoms.json` whose
- `bundle` block lacks `policy_excluded_words` or `unreadable_files` now gets them from its
- `excluded` rows, and a word count that is not a number (`"n/a"`, `[1]`, `Infinity`) reads as
- 0 (an unusable stored file count is recounted from the `excluded` rows), so the `artifact_coverage` gate value of such a record can differ from before (no
- writer produces them). Records the tool writes gate and report exactly as before.
-- **The pre-run note of a bundle run** says "words over the budgets"; it no longer says
- "or filtered by role", since role-filtered words were never in that count.
-
-### Fixed
-
-- **`novelty probe` errors name the file you passed** — a stale-key message quotes the
- `--atoms` path instead of a hard-coded `atoms.json`, and a missing or malformed entry
- point exits with `cannot load ...` instead of a traceback.
diff --git a/dokimi/changelog.d/20261016_122905_napetrov_feat-tool-preference-cost-cap.md b/dokimi/changelog.d/20261016_122905_napetrov_feat-tool-preference-cost-cap.md
deleted file mode 100644
index 1b2b696b..00000000
--- a/dokimi/changelog.d/20261016_122905_napetrov_feat-tool-preference-cost-cap.md
+++ /dev/null
@@ -1,3 +0,0 @@
-### Added
-
-- **Tool-preference cost cap (`--max-cost-usd`)** — stop starting new model calls once the sum of `cost_usd` from completed calls reaches the cap. The run exits 2 when the cap, or a call with no price, leaves calls unstarted (an unpriced call that leaves none only warns); the partial artifact records `max_cost_usd`, `skipped` calls, and the count of skipped items (`n_skipped`). Calls already in flight finish, so the spend can overshoot by up to `--concurrency − 1` calls. A call that fails but was billed (and carries usage) counts toward the cap. The calls that ran are a prefix in item order, so only the last group reached may be partial.
diff --git a/dokimi/changelog.d/20261016_130000_nikolay.a.petrov_harnesses_on_runner.md b/dokimi/changelog.d/20261016_130000_nikolay.a.petrov_harnesses_on_runner.md
deleted file mode 100644
index 10d4b549..00000000
--- a/dokimi/changelog.d/20261016_130000_nikolay.a.petrov_harnesses_on_runner.md
+++ /dev/null
@@ -1,24 +0,0 @@
-### Changed
-
-- **`command:`, Harbor, BenchFlow and explorer processes are contained** —
- these now start through the process runner, so a timeout kills the whole process
- tree (an agent's tool calls, `harbor`'s children), not only the command, and
- anything the command leaves running when it exits is killed too. The command's
- stdin is closed, and its output is read as UTF-8 whatever the locale. A timed-out
- `bench` gets SIGTERM and 15 s to stop before SIGKILL, also on Ctrl-C (where
- `bench` used to be left running); a second Ctrl-C does not restart that grace.
- A timed-out `harbor` gets SIGTERM and 60 s, so it removes its trial container and
- image instead of leaving them behind (harbor 0.20.0 still leaves them for a task
- with `allow_internet = false`).
- A `command:` harness's timeout of 0 or less is an immediate timeout (rc 124,
- reward 0) and `CommandExplorer(timeout_sec=None)` runs without a limit, as
- before.
-- **`repo run` stops its container gently and bounds docker calls** — a timed-out
- `docker run` CLI gets SIGTERM and 10 s before SIGKILL, then `docker kill` stops
- the container by name once the CLI is gone; `docker build` fails after 3 h and
- `docker image inspect` after 60 s instead of hanging the batch.
-- **Library API** — `repos.container.kill_group` is removed (the runner kills the
- group), `run_process` takes a `runner` argument, and
- `BenchflowHarness.preflight()` is an instance method. `bench.log` keeps the first and last 512 KiB of each of `bench`'s
- streams. A wrapper that relied on a background process outliving its cell must
- now wait for it.
diff --git a/dokimi/changelog.d/20261016_174000_napetrov_outcome-contracts.md b/dokimi/changelog.d/20261016_174000_napetrov_outcome-contracts.md
deleted file mode 100644
index 4a580226..00000000
--- a/dokimi/changelog.d/20261016_174000_napetrov_outcome-contracts.md
+++ /dev/null
@@ -1,29 +0,0 @@
-### Added
-
-- **User outcome contracts** — `pytest --outcomes` checks each promise in
- `tests/outcomes/*.json` (the doc that states it, the code that keeps it, and
- evidence ids) against the tests that ran. A test claims an id with
- `@pytest.mark.outcome("")`. An id no test claims is an error, a claimed
- test that fails fails the verdict, and an id whose claimed tests were all
- skipped is inconclusive (exit 3). The verdict is written to `outcomes-result.json`
- (`--outcomes-report=` moves it). CI runs the tests with `--outcomes` and
- uploads the file with the other test artifacts. The first contract covers
- pinned question sets.
-
-### Changed
-
-- **`--questions-root` pins the question set** — when `_golden.json`
- exists in the root, `benchmark run` and `evaluate` answer exactly that set and
- skip question generation, where they used to merge it into generated
- questions. Counts and `question_set_hash` of such runs change. A cached
- `questions/.json` in the output directory still wins until
- `--force-regen`; a cached set that differs from the golden set now logs a
- warning with both hashes.
-- **`benchmark preflight --questions-root` validates the golden set** — a
- missing root, a missing or empty golden file, or an unreadable or malformed
- one exits 1 and the check prints the golden file path and item count.
-- **Pinned runs skip persona discovery** — with a golden set under
- `--questions-root`, `evaluate` and `benchmark run` do not discover personas
- (`benchmark run` also skips them for `--questions-from`, even with
- `--force-regen`), and `evaluate` no longer prints a `Personas:` path for
- such a run.
diff --git a/dokimi/changelog.d/20261016_190000_napetrov_empty-question-rule.md b/dokimi/changelog.d/20261016_190000_napetrov_empty-question-rule.md
deleted file mode 100644
index fe7b3210..00000000
--- a/dokimi/changelog.d/20261016_190000_napetrov_empty-question-rule.md
+++ /dev/null
@@ -1,20 +0,0 @@
-### Changed
-
-- **One rule for a record without a question** — every judge path (`eval score`,
- `eval panel-score`, the RAGAS meta-evaluation of `eval ragas` and
- `answers generate --ragas`, `arms` judging, `eval pairwise`, `eval checklist`,
- `eval cross-judge`, and the degradation pairs of `eval judge-validity` /
- `eval judge-wording`) now checks the records it would send to a judge before
- the first judge call, and before the `--judge-temperature` sampling probe, and
- refuses the run when one has a missing or blank question text, naming the
- record. A record the path would skip anyway is not refused: an answer-error
- record with no answer, a record with only empty answers, one without expected
- points (`eval checklist`), one without a baseline answer or with only arms left
- out by `--arms` (`eval pairwise`), one whose answers are all under the
- degradation length floor, and one without a question id (the degradation
- pairs). `arms run --judge` checks every question before any answer is paid
- for. Before, `eval score` recorded a per-question error only when the key was
- missing, the degradation pairs skipped the record silently, RAGAS reported a
- warning, and the other paths sent an empty question to the judge. The CLI
- prints `Error: …` and exits 2, the code these commands use for other input
- errors (1 stays the verdict of `eval judge-validity` and the `--strict` gates).
diff --git a/dokimi/changelog.d/20261016_190100_napetrov_judge_materials.md b/dokimi/changelog.d/20261016_190100_napetrov_judge_materials.md
deleted file mode 100644
index 72f9e0f4..00000000
--- a/dokimi/changelog.d/20261016_190100_napetrov_judge_materials.md
+++ /dev/null
@@ -1,19 +0,0 @@
-### Added
-
-- **Judge's treatment material stored in arms artifacts** — `dokimi arms run` now keeps
- the exact text the judge reads (or would read) for each arm and question, with or
- without `--judge`, indexed by SHA256 digest. Later readers of the artifact (e.g.,
- `dokimi eval cross-judge --judges` re-scoring the same answers) see the stored material
- instead of a 200-char snippet fallback, so the re-scored judge reads what the original
- judge saw. Artifact sizes grow by one copy per
- distinct text per arm (perf skill +0.3% for the text itself, docs runs grow by the
- answerer's 15,000-char context cut per question).
-
-### Changed
-
-- **`eval cross-judge --judges` accepts stored scores when the file keeps the material** —
- it used to exit 2 for any arm judged on treatment material. It now re-scores with the
- stored text and exits 2 only when a stored score cites different material than the arm
- record serves, or a question's material cannot be read; the error names the questions.
- `--no-stored` still compares the measures anyway, and `--pairwise` and `--checklist`
- still refuse stored scores because those judges see only answers.
diff --git a/dokimi/changelog.d/20261016_192848_napetrov_feat-questions-v2.md b/dokimi/changelog.d/20261016_192848_napetrov_feat-questions-v2.md
deleted file mode 100644
index 99857a9f..00000000
--- a/dokimi/changelog.d/20261016_192848_napetrov_feat-questions-v2.md
+++ /dev/null
@@ -1,29 +0,0 @@
-### Added
-
-- **Question sets are written as `questions.v2`** — every writer (`questions generate`,
- `questions refine`, `catalog trigger-set --format questions` and the `evaluate` /
- `benchmark` pipeline's `questions/.json`) stores the text under `question`
- instead of v1's `text`, stamps `"schema_version": "questions.v2"` and validates the set
- before writing it; a set that fails is kept at `.rejected` before any answer is
- paid for. Scripts that read `.text` from these files need `.question`
- (`dokimi/schemas/questions.v2.json` documents every field).
-
-### Changed
-
-- **Question sets are read tolerantly, and a read never rewrites an input** — `v1` sets
- (curated golden sets included) and older hand-written shapes (a bare list,
- `question_id` / `question_text`, a list `metadata`, records with no `id`, `null` in a
- field v1 leaves open) keep loading in the pipeline, `arms run`, `answers generate`,
- `report generate`, `questions refine`, `eval checklist` and `dataset export`. A set that
- needed more than the `text` → `question` rename logs one
- `read in legacy questions format (...)` warning; fix the file by hand to stop it.
- A `--questions-from` or `--custom-questions` file is no longer written over, even when
- it is the run's own `questions/.json` (the one exception is a Python-API
- `force_regen=True` merge that adds records to that file); the run writes its own v2 copy.
- `report generate` and `questions refine` print `Error: ...` and exit 1 on an unusable set
- instead of a traceback; `questions refine --fill-gaps` validates the cleaned set before
- any gap-fill model call, so an invalid set costs nothing.
-- **`question_set_hash` changes for sets whose records had no `id` key** — such records now
- take their `question_id`, or are numbered `q0000`, `q0001`, ... by position, so the hash
- of such a legacy set differs from earlier runs and their results are not paired with new
- ones. Sets valid as v1 or v2 keep their ids and hash.
diff --git a/dokimi/changelog.d/20261017_121500_antonwolfy_tool-preference-cost-cap.md b/dokimi/changelog.d/20261017_121500_antonwolfy_tool-preference-cost-cap.md
deleted file mode 100644
index b7990c8a..00000000
--- a/dokimi/changelog.d/20261017_121500_antonwolfy_tool-preference-cost-cap.md
+++ /dev/null
@@ -1,3 +0,0 @@
-### Fixed
-
-- **`tools preference --max-cost-usd` stops at a reply it cannot price** — a call whose `usage` is missing or not a dict, or whose `cost_usd` is not a finite number, now leaves the cap blind (no new call starts after it) instead of being left out of the spend. A library caller of `run_probe` could run every call under a cap that way, and a string `cost_usd` crashed the run before the artifact was written. The calls that run under the cap are now a prefix of the jobs in item order at any `--concurrency`, so only the last group reached can be partial; before, a worker slow to start could leave a hole in an earlier group. The docs and `--help` no longer say an unpriced call always exits 2: it does when calls were left unstarted, and otherwise warns.
diff --git a/dokimi/changelog.d/20261017_121600_antonwolfy_benchmark-persona-docs.md b/dokimi/changelog.d/20261017_121600_antonwolfy_benchmark-persona-docs.md
deleted file mode 100644
index 3d281472..00000000
--- a/dokimi/changelog.d/20261017_121600_antonwolfy_benchmark-persona-docs.md
+++ /dev/null
@@ -1,3 +0,0 @@
-### Documentation
-
-- **`--force-regen` help and the pipeline docs say when personas are discovered** — `benchmark run --force-regen` and `benchmark batch --force-regen` no longer promise to regenerate personas: a run with a golden set under `--questions-root`, or with `--questions-from`, discovers none, and `--force-regen` re-reads the golden set. `README.md` and `docs/methodology.md` now say the same.
diff --git a/dokimi/changelog.d/20261017_123000_antonwolfy_judge-provider-default.md b/dokimi/changelog.d/20261017_123000_antonwolfy_judge-provider-default.md
deleted file mode 100644
index b12c0eba..00000000
--- a/dokimi/changelog.d/20261017_123000_antonwolfy_judge-provider-default.md
+++ /dev/null
@@ -1,7 +0,0 @@
-### Fixed
-
-- **`--judge-provider` alone picks a judge model that runs there** — on `benchmark run`, `benchmark preflight`, `benchmark batch`, `evaluate`, `eval score`, `eval judge-validity`, `eval checklist`, `eval judge-wording`, `eval pairwise`, `arms run`, `arms matrix-run` and `subjects run`, a `--judge-provider` without `--judge-model` was paired with `claude-sonnet-5-5`, so `--judge-provider openai` sent `openai/claude-sonnet-5-5` and failed at the first judge call. The judge model is now the default judge for that provider: `claude-sonnet-5-5` on `anthropic` and `amazon-bedrock` (as before), `gpt-6.1-sol` on `openai`. On `google`, `google-vertex` and `openrouter` the command exits before any model call and asks for `--judge-model`. With the default answer model, `--judge-provider openai` alone makes the judge the answering model, which the commands that check judge independence warn about. `novelty` already chose its judge this way.
-
-### Added
-
-- **`parse_args` on the legacy `cli.py` shim** — `from cli import parse_args` gives the same parse as `dokimi.cli.parse_args`, with the `--judge-model` default resolved for `--judge-provider`. `build_parser().parse_args()` still leaves the placeholder, which reads as `claude-sonnet-5-5`.
diff --git a/dokimi/changelog.d/20261017_124500_antonwolfy_repo-build-timeout.md b/dokimi/changelog.d/20261017_124500_antonwolfy_repo-build-timeout.md
deleted file mode 100644
index 5af5ba4d..00000000
--- a/dokimi/changelog.d/20261017_124500_antonwolfy_repo-build-timeout.md
+++ /dev/null
@@ -1,3 +0,0 @@
-### Added
-
-- **`repo run --build-timeout` and `repo tasks check --build-timeout`** — the seconds the image build may run before it fails as a container error, 10800 (3 hours) by default as before. A toolchain image that legitimately takes longer could not be built at all: the image tag is the eval tree's digest, so a retry rebuilt from scratch and hit the same cap. `DockerRunner.build` takes the bound as `timeout_s`.
diff --git a/dokimi/changelog.d/20261018_120000_napetrov_ci-deptry.md b/dokimi/changelog.d/20261018_120000_napetrov_ci-deptry.md
deleted file mode 100644
index 441a9971..00000000
--- a/dokimi/changelog.d/20261018_120000_napetrov_ci-deptry.md
+++ /dev/null
@@ -1,9 +0,0 @@
-### Changed
-
-- **Install dependencies follow the imports** — `pip install dokimi` no longer
- installs `beautifulsoup4` (and its `soupsieve`), which nothing imports, and no
- longer lists `anthropic` itself: it still comes in through
- `langchain-anthropic`. `langchain-openai` and `langchain-core`, which
- `eval ragas` imports, are now declared (`>=1.0,<2`) instead of arriving only
- through `ragas`. Code that imported `bs4` from dokimi's environment installs it
- itself.
diff --git a/dokimi/changelog.d/20261018_120000_vchamarthi_partial-conflict-not-cleared.md b/dokimi/changelog.d/20261018_120000_vchamarthi_partial-conflict-not-cleared.md
deleted file mode 100644
index 9972a396..00000000
--- a/dokimi/changelog.d/20261018_120000_vchamarthi_partial-conflict-not-cleared.md
+++ /dev/null
@@ -1,11 +0,0 @@
-### Fixed
-
-- **`harmful_atoms` no longer clears a conflict check that did not read the pair space** —
- `novelty.v1` artifacts now record `conflict_coverage` (`pairs_compared`, `pairs_total`),
- and the gate reports `harmful_atoms` as `measured: false` instead of a pass at 0 when fewer
- than `min_conflict_coverage` (default 1.0) of the atom pairs were compared, when the atom
- set was capped, or when `conflict_coverage` is present but malformed. A conflict that was
- found is still reported. `analyze` now sends the whole capped atom set to the conflict
- check in one call (it used batches of 40, which compared about a third of the pairs at the
- default cap of 120), so full coverage is the normal case. Artifacts without the field keep
- the old reading.
diff --git a/dokimi/changelog.d/20261019_120000_antonwolfy_api-reference-package-pages.md b/dokimi/changelog.d/20261019_120000_antonwolfy_api-reference-package-pages.md
deleted file mode 100644
index c9354674..00000000
--- a/dokimi/changelog.d/20261019_120000_antonwolfy_api-reference-package-pages.md
+++ /dev/null
@@ -1,3 +0,0 @@
-### Documentation
-
-- **The API reference's package pages have content** — `dokimi`, `dokimi.ingest`, `dokimi.metrics` and `dokimi.runner` had no module docstring. On the site, the `dokimi.metrics` page listed its usage record with no word on what the package is, and the other three showed only a heading. Each now says what the package does, and the `dokimi` page, the API reference's landing page, maps every subpackage to its evaluation track with a link to its page.
diff --git a/dokimi/changelog.d/20261019_120000_vchamarthi_ragas-extra.md b/dokimi/changelog.d/20261019_120000_vchamarthi_ragas-extra.md
deleted file mode 100644
index df32f1ff..00000000
--- a/dokimi/changelog.d/20261019_120000_vchamarthi_ragas-extra.md
+++ /dev/null
@@ -1,7 +0,0 @@
-### Changed
-
-- **RAGAS is an optional extra**: `pip install dokimi` no longer installs
- `ragas`, `langchain-community`, `langchain-anthropic`, `langchain-openai` or
- `langchain-core`. `eval ragas` and `answers generate --ragas` need
- `pip install 'dokimi[ragas]'` (the `dev` extra includes it). Without the
- extra, both exit 1 with the install command before any model call.
diff --git a/dokimi/changelog.d/20261019_170000_antonwolfy_api-landing-dokimi-command.md b/dokimi/changelog.d/20261019_170000_antonwolfy_api-landing-dokimi-command.md
deleted file mode 100644
index a8b729d2..00000000
--- a/dokimi/changelog.d/20261019_170000_antonwolfy_api-landing-dokimi-command.md
+++ /dev/null
@@ -1,3 +0,0 @@
-### Documentation
-
-- **The API reference's landing page names the installed `dokimi` command** — it called `python cli.py` the supported entry point, and a wheel install has no `cli.py`. It now names `dokimi`, with `python cli.py` for a source checkout, as the CLI reference does.
diff --git a/dokimi/docs/quickstart.md b/dokimi/docs/quickstart.md
index b7006243..329dc824 100644
--- a/dokimi/docs/quickstart.md
+++ b/dokimi/docs/quickstart.md
@@ -49,7 +49,9 @@ export GITHUB_TOKEN="ghp_..."
### 2. Dependencies
```bash
-pip install -e ".[dev]" # package + dev tooling (recommended)
+pip install dokimi # released package
+# or, from a source checkout:
+pip install -e ".[dev]" # package + dev tooling
# or, dependencies only:
pip install -r requirements.txt
```
diff --git a/dokimi/docs/releasing.md b/dokimi/docs/releasing.md
index 678dc9f3..32b83f8d 100644
--- a/dokimi/docs/releasing.md
+++ b/dokimi/docs/releasing.md
@@ -96,8 +96,11 @@ conda-forge packages are built by a feedstock repository under
`conda-forge/`, not from this repository. After the first PyPI release:
1. Generate a recipe from the PyPI sdist (`grayskull pypi dokimi`), make it
- `noarch: python`, test with `dokimi --version` and `dokimi --help`, add the
- maintainers, and open a PR to
+ `noarch: python` with `python {{ python_min }}.*` in host and test and
+ `python >={{ python_min }}` in run, where `python_min` is `3.11` unless the
+ conda-forge global value is already at least that (see conda-forge's
+ [noarch guide](https://conda-forge.org/docs/how-to/basics/noarch/)), test with
+ `dokimi --version` and `dokimi --help`, add the maintainers, and open a PR to
[conda-forge/staged-recipes](https://github.com/conda-forge/staged-recipes).
The sdist is the source because it is the project directory alone (this
repository's `dokimi/`), with `LICENSE` at its root for `license_file`.
@@ -107,4 +110,4 @@ conda-forge packages are built by a feedstock repository under
Every runtime dependency in `pyproject.toml` is on conda-forge (checked for
0.1.0), including versions inside the current upper bounds. An optional extra
-(`ocr`, `mcp`, `embeddings`, `typed-scorer`) is not part of the conda package.
+(`ragas`, `ocr`, `mcp`, `embeddings`, `typed-scorer`) is not part of the conda package.