settings: the four per-feature files .wikitool-remotes/-telemetry/-upload/-tasks.json move into the three tiers and disappear; new command config migrate; 10.0.0-beta.1 (#208)
CI / verify (push) Failing after 7m41s
CI / pwsh (push) Successful in 2m32s
Release / release (push) Successful in 37s
Release / wiki-mirror (push) Skipped

Files changed:
- .gitignore
- AGENTS.md
- CHANGES.md
- INSTALL.md
- VERSION
- docs/explanation/knowledge-and-commitment.md
- docs/explanation/telemetry-and-evaluation.md
- docs/explanation/why-gates-are-code.md
- docs/how-to/run-the-weekly-review.md
- docs/how-to/set-up-the-mcp-server.md
- docs/how-to/trace-and-score-sessions.md
- docs/how-to/troubleshoot.md
- docs/reference/commands/README.md
- docs/reference/commands/configuration.md
- docs/reference/commands/finding-and-checking.md
- docs/reference/commands/git.md
- docs/reference/commands/instance-health.md
- docs/reference/commands/pages.md
- docs/reference/commands/raw-material-and-uploads.md
- docs/reference/configuration.md
- docs/reference/exit-codes.md
- instructions/dev/doc-pull-through.md
- instructions/dev/tracker-testing.md
- instructions/gates.md
- instructions/ingest-queue.md
- instructions/mcp-read-server.md
- instructions/migrate-corpus.md
- instructions/migrations/10.0.0-settings-tiers.md
- instructions/setup-instance.md
- raw/CONTRACT.md
- reports/CONTRACT.md
- tools/CONTRACT.md
- tools/README.md
- tools/bugreport.py
- tools/chemenu/cli_contract.py
- tools/chemenu/commands/_util.py
- tools/chemenu/commands/config_cmd.py
- tools/chemenu/commands/docs_verify.py
- tools/chemenu/commands/doctor.py
- tools/chemenu/commands/export_cmd.py
- tools/chemenu/commands/git_publish.py
- tools/chemenu/commands/new_page.py
- tools/chemenu/commands/review_cmd.py
- tools/chemenu/commands/task_cmd.py
- tools/chemenu/commands/upload_cmd.py
- tools/chemenu/config.py
- tools/chemenu/config_shapes.py
- tools/chemenu/legacy_settings.py
- tools/chemenu/mcp/__main__.py
- tools/chemenu/mcp/server.py
- tools/chemenu/reference_doc.py
- tools/chemenu/review.py
- tools/chemenu/settings.py
- tools/chemenu/tasks/__init__.py
- tools/chemenu/tasks/caldav.py
- tools/chemenu/tasks/config.py
- tools/chemenu/tasks/superproductivity.py
- tools/chemenu/telemetry/policy.py
- tools/chemenu/tests/conftest.py
- tools/chemenu/tests/record_sp_fixtures.py
- tools/chemenu/tests/test_bugreport.py
- tools/chemenu/tests/test_caldav.py
- tools/chemenu/tests/test_config_shapes.py
- tools/chemenu/tests/test_doctor.py
- tools/chemenu/tests/test_git_publish.py
- tools/chemenu/tests/test_legacy_settings.py
- tools/chemenu/tests/test_mcp_server.py
- tools/chemenu/tests/test_new_page.py
- tools/chemenu/tests/test_review.py
- tools/chemenu/tests/test_settings.py
- tools/chemenu/tests/test_sp_recorded.py
- tools/chemenu/tests/test_superproductivity.py
- tools/chemenu/tests/test_task_cmd.py
- tools/chemenu/tests/test_tasks_config.py
- tools/chemenu/tests/test_telemetry_policy.py
- tools/chemenu/tests/test_tracker_live.py
- tools/chemenu/tests/test_upload.py
- tools/chemenu/tests/tracker_live.py
- tools/chemenu/upload.py

Co-Authored-By: Claude Code <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SnAJ7Z3CpVD3PRbN73QtU2
This commit is contained in:
torbenandClaude Code committed 2026-10-11 06:54:35 +02:00
1 parent e085a8b6c1
commit db8f90c229
79 files changed
+2784 -1793

No files matched your search

+1 -1
View File
@@ -40,7 +40,7 @@ touched; a row that does not apply needs no action.
| The reasoning behind a gate, boundary, or design decision | The `docs/explanation/` page that carries it, if one exists (AGENTS.md § File naming lists all seven reached from AGENTS.md itself, plus an eighth reached only from CLAUDE.md). **A decision with no page yet is the gap worth closing**: reasoning that lives only in a Gitea issue never ships - `dist export` carries `docs/explanation/` and no issue tracker, so a distributed instance gets the mechanism without the why |
| A task-tracker adapter (`tools/chemenu/tasks/`), its recorded fixtures, or the live suite | [instructions/dev/tracker-testing.md](tracker-testing.md), and `MANIFEST.json` beside the fixtures when they were re-recorded |
| A skill's own step sequence or catalogue | The skill's `SKILL.md` source under `instructions/<name>/` or `instructions/dev/<name>/`; for a shipped skill (not under `instructions/dev/`) whose name or `description` changed, or one added or removed, `wikitool docs reference --apply` for the skill catalogue `docs/reference/skills.md` |
| A per-checkout configuration file an instance owns (`.wikitool-tasks.json`, `.wikitool-telemetry.json`, `.wikitool-remotes.json`, `.wikitool-upload.json`), or a section of the tiered settings (`wikitool.json`, `.wikitool-local.json`; `config_shapes.SETTINGS_SECTIONS`) | Its shape - a field, a default, what is required or tolerated - is its record in `tools/chemenu/config_shapes.py`, which the loader reads; change it there, then `wikitool docs reference --apply` for its region in [docs/reference/configuration.md](../../docs/reference/configuration.md). What a setting *does* is the hand-written prose around that region. Also the [setup-instance.md](../setup-instance.md) decision point that offers the file during setup, and `doctor`'s own row in [tools/CONTRACT.md](../../tools/CONTRACT.md), since `doctor` is what reports the file's state |
| A section of the tiered settings (`wikitool.json`, `.wikitool-local.json`; `config_shapes.SETTINGS_SECTIONS`) | Its shape - a field, a default, what is required or tolerated - is its record in `tools/chemenu/config_shapes.py`, which the loader reads; change it there, then `wikitool docs reference --apply` for its region in [docs/reference/configuration.md](../../docs/reference/configuration.md). What a setting *does* is the hand-written prose around that region. Also the [setup-instance.md](../setup-instance.md) decision point that offers the section during setup, and `doctor`'s own row in [tools/CONTRACT.md](../../tools/CONTRACT.md), since `doctor` is what reports the section's state |
| An installation instruction - [preflight.md](../preflight.md), [setup-instance.md](../setup-instance.md), [bootstrap.md](../bootstrap.md), [upgrade-instance.md](../upgrade-instance.md) - or `tools/prerequisites.txt` | [INSTALL.md](../../INSTALL.md), the human guide to the same procedure - for `upgrade-instance.md`, [docs/how-to/update-an-instance.md](../../docs/how-to/update-an-instance.md) instead. Read it against the instruction: what to prepare, the sentence for the agent, what the agent asks, where it stops and why. `docs verify` checks only the two enumerable overlaps - the prerequisites lists, which `wikitool docs prerequisites --apply` regenerates from the manifest, and the setup questions: a question the agent asks the user carries `<!-- setup-question: <key> -->` where it is asked in `setup-instance.md`, and `INSTALL.md` § "What the agent asks you" names it with the same marker. Every other sentence is this session's to compare. `INSTALL.md` does not retell the steps, so a change to their order or wording alone moves nothing there |
| [dev-setup.md](dev-setup.md), the release workflow (`version bump`/`version release`/`publish`/CI), or another developer-facing process | [docs/dev/development.md](../../docs/dev/development.md), read against it the same way - nothing checks this pair at all. A page under `docs/dev/` is never shipped, so it may link into `instructions/dev/` and cite issue numbers |
| A new page type the stack requires, or a new collection | Its type-spec and `COLLECTION.md` (both as the `.template` an instance adopts), the collection table in [kb/CONTRACT.md](../../kb/CONTRACT.md), and **both adoption paths**: [setup-instance.md](../setup-instance.md) for a fresh instance and [upgrade-instance.md](../upgrade-instance.md) for an existing one, where an unadopted template is what `docs verify` refuses. A new or changed `root: kb` type-spec or its schema - description, `layout:`, subtype enum, required fields - also needs `wikitool docs reference --apply` for `docs/reference/page-types.md` |
+17 -14
View File
@@ -36,15 +36,15 @@ plain `pytest` run unless you set it.
|---|---|---|
| `CHEMENU_LIVE_SP_BINARY` | The packaged Super Productivity (`.deb` layout). The suite starts its own headless copy on a fresh profile, seeded from `fixtures/sp/seed-backup.json`, and stops it again. | The suite |
| `CHEMENU_LIVE_CALDAV_URL`, `_USER`, `_PASSWORD` (optional `_VERSION` for the report line) | A CalDAV collection. In CI it is a throwaway Radicale started by `.gitea/scripts/start-radicale.sh`. | The suite - it may create the marker calendar |
| `CHEMENU_LIVE_PROFILE=<name>` | A tracker of your own, described by `.wikitool-tasks.d/<name>.json` in the checkout, used exactly as configured. | You - the suite never creates anything but items |
| `CHEMENU_LIVE_PROFILE=<name>` | A tracker of your own, described by a profile `.wikitool-tasks.d/<name>.json` in the checkout, used exactly as configured. | You - the suite never creates anything but items |
`CHEMENU_LIVE_REQUIRE=sp,caldav,profile` (any subset) turns "no such tracker configured" into
a failure instead of a skip. CI sets it; without it a workflow that lost its server would go
green by skipping, which is the outcome the suite exists to rule out.
The commands under test read their configuration from `.wikitool-tasks.json`, or from the file
`WIKITOOL_TASKS_CONFIG` names when that variable is set. The live suite sets the variable per
test, so it never touches the checkout's own `.wikitool-tasks.json`; you can use the same
The commands under test read the `tasks`, `superproductivity` and `caldav` sections of the
settings, or those of the profile `WIKITOOL_TASKS_CONFIG` names when that variable is set. The
live suite sets the variable per test, so it never touches the checkout's own settings; you can use the same
variable to run `task` and `review` by hand against a second tracker.
## What the suite writes, and what it never does
@@ -72,19 +72,23 @@ that fails against theirs. The steps differ per tracker only in the profile and
1. **Create the marker project in that tracker**, by hand, named exactly `Chemenu Live-Test`.
Nothing else in the tracker is touched, but this project's items are created and closed.
2. **Write the profile** to `.wikitool-tasks.d/<name>.json` (gitignored - it holds
credentials). It is a normal `.wikitool-tasks.json` plus one optional key,
`live_test_version`, which is stripped before use and only names the tracker's version in
the report line. Paths are absolute.
2. **Write the profile** to `.wikitool-tasks.d/<name>.json` (gitignored). It is in the format of
`.wikitool-local.json`, holds only the sections `tasks`, `superproductivity` and `caldav`, and
takes one optional key, `live_test_version`, which is stripped before use and only names the
tracker's version in the report line. Paths are absolute. **A secret in a profile is a
reference, never a value** - `{"ref": "<name>"}` - so the file holds no credential. Put the
value where the reference resolves: the environment variable `WIKITOOL_SECRET_<NAME>` (name in
capitals) for a run, or 1Password / the secrets file for a standing profile
([configuration reference](../../docs/reference/configuration.md#profiles)). The user does
that; a value never goes through the chat or onto a command line.
Super Productivity, API access (the app must be running with the Local REST API on):
```json
{
"schema": 1,
"provider": "superproductivity",
"thresholds": {"stalled_waiting_days": 14, "unpaged_project_weeks": 3, "someday_stale_months": 5},
"superproductivity": {"access": "api", "api_base_url": "http://127.0.0.1:3876", "api_token": "<token>"},
"tasks": {"provider": "superproductivity", "stalled_waiting_days": 14, "unpaged_project_weeks": 3, "someday_stale_months": 5},
"superproductivity": {"access": "api", "api_base_url": "http://127.0.0.1:3876", "api_token": {"ref": "live_sp_token"}},
"live_test_version": "19.1.0"
}
```
@@ -94,9 +98,8 @@ that fails against theirs. The steps differ per tracker only in the profile and
```json
{
"schema": 1,
"provider": "caldav",
"thresholds": {"stalled_waiting_days": 14, "unpaged_project_weeks": 3, "someday_stale_months": 5},
"caldav": {"url": "https://<server>/<user>/", "username": "<user>", "app_password": "<password>",
"tasks": {"provider": "caldav", "stalled_waiting_days": 14, "unpaged_project_weeks": 3, "someday_stale_months": 5},
"caldav": {"url": "https://<server>/<user>/", "username": "<user>", "app_password": {"ref": "live_caldav_password"},
"inbox_list": "Inbox", "someday_list": "Someday"},
"live_test_version": "<server and version>"
}
+8 -7
View File
@@ -86,29 +86,30 @@ puts a private corpus on a public repository. That is not cheaply reversible: a
the branch, but the objects stay fetchable by SHA until someone expires the server's reflogs and
runs `git gc --prune=now` on the bare repo.
`.wikitool-remotes.json` names the push URLs a checkout permits:
The `remotes` section of `.wikitool-local.json` names the push URLs a checkout permits:
```json
{ "schema": 1, "allowed_push_urls": ["ssh://git@example.net:22/you/your-wiki.git"] }
{ "schema": 1, "remotes": { "allowed_push_urls": ["ssh://git@example.net:22/you/your-wiki.git"] } }
```
It pins **URLs, not remote names** - a name-based list would wave through a `publish` whose
`origin` had been repointed, which is the failure it exists to catch. It reads the remote's
`pushurl` when one is set, because that is where `git push` actually writes.
The file is per-checkout and gitignored, for the same reason `ENVIRONMENT.md` is: two clones push
The list lives in the per-checkout settings file, which is gitignored, for the same reason `ENVIRONMENT.md` is: two clones push
to two different places, so a committed copy would tell a private clone that a public remote is a
legitimate target for its own content. **Absent means unrestricted** - a single-remote
checkout with nothing private in it has nothing to protect, and `doctor` reports which state a
checkout is in, WARNing only when there is more than one remote and no allowlist. A malformed
file is an error rather than "no restriction": a corrupted safeguard must not read as a disabled
section is an error rather than "no restriction": a corrupted safeguard must not read as a disabled
one.
**This gate has no `--confirm` token, on purpose.** The others clear with a token because the
question they ask ("is this change right?") is one the agent can put to the user and the user can
answer for that one changeset. This one asks "does this content belong to that repository?", which
is a standing property of the checkout, not a per-push judgment. The way past it is for the user
to add the URL to the file. **An agent must never edit `.wikitool-remotes.json` to get past a
to add the URL to the list - `config set` exits 42 for it, because the field is marked `gate`.
**An agent must never edit `remotes.allowed_push_urls` to get past a
refusal** - that is opening a gate on your own initiative, which AGENTS.md invariant 6 forbids.
Arm it *before* a second remote is added and before the first `publish` to it: added afterwards
@@ -116,7 +117,7 @@ it leaves open exactly the window it closes.
### Upload Review Gate
The MCP server's opt-in `submit` tool (`.wikitool-upload.json`) writes into a
The MCP server's opt-in `submit` tool (the `upload` section of `.wikitool-local.json`) writes into a
quarantine, `mcp-upload/`, that no other command reads. This gate is the only door out of it:
`wikitool upload accept <id>` refuses without a matching `--confirm <token>`, printing the
submission's manifest in full - filename, size, sha256, submitter, and `submitter_source` (the
@@ -159,7 +160,7 @@ with exit 0 and no gate.
**Not the Publish-Remote Gate.** That one stays on `publish`. The targets here are declared by
the committed `_capture.json` manifests under `raw/`; asking for the same URLs in
`.wikitool-remotes.json` as well would be a second declaration of the same thing. What this gate
`remotes.allowed_push_urls` as well would be a second declaration of the same thing. What this gate
asks instead is the per-run question - whether this content belongs in these repositories now -
which is the kind a token answers.
+4 -4
View File
@@ -6,7 +6,7 @@ description: Review a document submitted from outside through the MCP submit too
# Reviewing an external submission
`.wikitool-upload.json` opts a checkout into a sixth MCP tool, `submit` -
An `upload` section in `.wikitool-local.json` opts a checkout into a sixth MCP tool, `submit` -
documents pushed by a caller that is not this terminal, into a quarantine no
ordinary command reads. This is the human half of that path: what a reviewer
checks before letting one through, and how `upload accept`/`upload reject`
@@ -92,9 +92,9 @@ this when a submission is already waiting and a decision is due.
## Arming the intake
`submit` does not exist as a tool until `.wikitool-upload.json` is created at
the served root - absence means the write path is not registered at all, not
that it is unrestricted (see the file's own shape in
`submit` does not exist as a tool until the `upload` section exists in the
served root's `.wikitool-local.json` - absence means the write path is not registered at all, not
that it is unrestricted (see the section's own shape in
[raw/CONTRACT.md](../raw/CONTRACT.md) and `tools/chemenu/upload.py`). Two
things belong to the *deployment*, not to this repository, and are named here
because a reviewer needs to know they hold, not because this file configures
+2 -2
View File
@@ -9,7 +9,7 @@ description: Run and keep current the MCP read server that serves this wiki to a
Chemenu has a second consumer. `search`, `types`, `describe_type`, `lint` and `status` are
served over MCP to callers that are not this terminal - the CLI and the server are two adapters
over one core (`chemenu.api.Corpus`), not a CLI with a network interface bolted on. A sixth
tool, `submit`, is opt-in: a checkout that creates `.wikitool-upload.json` also
tool, `submit`, is opt-in: a checkout whose `.wikitool-local.json` has an `upload` section also
offers a quarantined write path for documents pushed from outside - see
[instructions/ingest-queue.md](ingest-queue.md) for reviewing what lands there.
@@ -112,7 +112,7 @@ everything an operator needs that is *true of the software* rather than of one i
- **Asked to expose a write tool?** Five of the six tools have none, structurally: the server
imports nothing under `chemenu.commands`, so `new`, `touch`, `xref`, `cite`, `publish` and
`migrate` are unreachable from it rather than filtered out of a list. The one exception is
`submit` (opt-in via `.wikitool-upload.json`): it may write, but only into
`submit` (opt-in via the `upload` settings section): it may write, but only into
`mcp-upload/`, a quarantine no other command reads - a **positive list** enforced in code
(`chemenu.upload._write_atomic_within`), not an absence. The commands that move a submission
*out* of that quarantine (`upload accept`/`upload reject`) still have the absence property:
+4
View File
@@ -105,6 +105,10 @@ declared by a migration document under `instructions/migrations/`. A single page
- **The check finds something mid-unit.** Fix it in that unit and re-run `verify`. Never carry
a finding into the next unit "to fix later": the next unit's diff baseline is this unit's
commit, so an uncorrected drop becomes invisible.
- **A step the agent must not do by hand?** A file it would have to write is generated, or holds a
secret, or is per checkout: then the step is a command of the group whose files it writes
(`config migrate` for the settings files), and the migration document names that command
instead of a recipe to follow by hand.
- **Contradiction with an existing page.** Never overwrite. Record both, ask the user, and hedge
the page's prose to the weaker of the two sources if it stays unresolved (kb/CONVENTIONS.md §
Hedging).
@@ -0,0 +1,117 @@
---
type: types/instruction.md
name: 10.0.0-settings-tiers
description: Move the settings of the four per-feature files .wikitool-telemetry.json, .wikitool-remotes.json, .wikitool-upload.json and .wikitool-tasks.json into the tiered settings with `wikitool config migrate` - run once per checkout; without it the Publish-Remote Gate and the upload limits are not in effect and the commands that need them exit 42.
manual: true
migrates_to: 10.0.0
migration_kind: mechanical
obligation: required
---
# Move the per-feature settings files into the tiered settings (10.0.0)
Until 10.0.0 four features kept their settings in a file of their own at the root of the
checkout: `.wikitool-telemetry.json`, `.wikitool-remotes.json`, `.wikitool-upload.json` and
`.wikitool-tasks.json`. 10.0.0 reads none of them. The same settings are now sections of the
[tiered settings](../../docs/reference/configuration.md#tiered-settings) - `telemetry`,
`remotes`, `upload`, and `tasks` with `superproductivity` and `caldav` - and each field sits in
the file its tier names: `wikitool.json` (committed) for what is the same in every clone,
`.wikitool-local.json` for what is true of one checkout, and for a token or a password the
secrets file, with only a reference in `wikitool.json`.
A file that is left behind is not read, so the setting it held is **not in effect**: no
Publish-Remote Gate, no upload limits, no tracker. `wikitool config migrate` moves the content and
removes the old files. It is `mechanical` because nothing is decided per file: every setting keeps
its effective value, defaults included.
<!-- wikitool:toc -->
## Contents
- [When to run](#when-to-run)
- [Steps](#steps)
- [How to tell a migrated checkout from an unmigrated one](#how-to-tell-a-migrated-checkout-from-an-unmigrated-one)
- [Decision points](#decision-points)
- [Scope](#scope)
<!-- /wikitool:toc -->
## When to run
After installing 10.0.0 machinery over an instance on 9.x - step 12 of
[upgrade-instance.md](../upgrade-instance.md), once `tools/wikitool migrate status` names this
document - **in every checkout of the instance that has one of the four files**. The files are
per checkout and gitignored, so another clone does not see them and runs the step for itself.
Until it has run, `tools/wikitool doctor` reports each leftover as a `FAIL`, and `publish`
(with a `.wikitool-remotes.json`), `task`, `review` and `new project` (with a
`.wikitool-tasks.json`) and the MCP server (with a `.wikitool-upload.json`) exit 42 and name the
command below.
## Steps
1. **See what is there:**
```bash
tools/wikitool doctor
```
Each old file that is still present is one `legacy-settings` line. None, and the checkout has
nothing to move: go to step 4.
2. **Move it:**
```bash
tools/wikitool config migrate
```
It prints, per setting, which file the value went to - never the value. A secret's value goes
into the secrets file in the user's configuration directory, and only a reference into
`wikitool.json`. It writes the new files first, reads them back and checks them, and only then
removes the old ones; if anything fails, nothing is changed and the old files are as they were.
A second run says there is nothing to move.
3. **Check it:**
```bash
tools/wikitool doctor
git status --short
```
`doctor` shows no `legacy-settings` line, and the settings lines are `OK`. `git status` shows
`wikitool.json` as new or changed: it holds the instance-tier values and the references, and it
is committed with the next `publish`. `.wikitool-local.json` does not appear, being ignored.
4. **Record it, once per instance** - not once per checkout:
```bash
tools/wikitool migrate done 10.0.0 --pages 0
```
`--pages 0` because no `kb/` page changes. The migration is `required`, so this advances
`kb_version`.
## How to tell a migrated checkout from an unmigrated one
An unmigrated checkout has at least one of the four files at its root, and `doctor` names each.
A migrated one has none; `.wikitool-tools.json` is not among them and stays.
## Decision points
- **`config migrate` stops: a key already holds a different value?** The target files already
have the key, set by hand or by `config set`, and the old file says something else. It cannot
know which one stands. Decide, remove the other from its file, and run it again.
- **A value was read before but only coerced** - a number written as a string, say? It is
carried over as the number it was read as. Anything an old file held that was never read (an
unknown key, the section of a provider that is not chosen) is named in the output and not
carried over.
- **The old Publish-Remote allowlist or upload limits go where?** Into `.wikitool-local.json`:
both affect a gate, so `config set` does not write them, and the migration is the one command
that does. Later changes to them are the user's own edit.
- **A profile file `WIKITOOL_TASKS_CONFIG` points at still holds a plain token?** It is not
touched by `config migrate`, and it is no longer read as the old format: a profile has the layout of
`.wikitool-local.json` and holds references only
([Profiles](../../docs/reference/configuration.md#profiles)). Rewrite it by hand, with the
value in `WIKITOOL_SECRET_<NAME>` or the secrets file.
## Scope
The four files named above, in the checkout the command runs in. `.wikitool-tools.json` and the
two tiered settings files are not old files. The machinery - the readers, `config migrate`,
`doctor`'s check - arrived with `dist upgrade` and needs nothing from this document.
+14 -12
View File
@@ -274,21 +274,21 @@ one it needs before that.
it, and nobody reads up on telemetry before the first file is written anyway. This step only asks
whether the operator wants to reverse that.
Ask the user once: telemetry on? If yes, create `.wikitool-telemetry.json` in the repo root
(per checkout, gitignored, no `.template` - like `.wikitool-remotes.json`):
Ask the user once: telemetry on? If yes, run `tools/wikitool config set telemetry.enabled true`.
It writes the `telemetry` section of `.wikitool-local.json` (per checkout, gitignored):
```json
{ "enabled": true }
{ "schema": 1, "telemetry": { "enabled": true } }
```
The file's two optional caps and their defaults are in
The section's two optional caps and their defaults are in
[docs/reference/configuration.md](../docs/reference/configuration.md#telemetry); most instances
need not touch them. If no, do nothing - the default is already
off, and no file is created. `WIKI_TRACE` still overrides in both directions, should a
off, and nothing is written. `WIKI_TRACE` still overrides in both directions, should a
single session need to differ.
`tools/wikitool doctor` reports the result in step 12 (`telemetry`): on/off, why
(installation form, this file, or `WIKI_TRACE`), and the current volume against both caps -
(installation form, this setting, or `WIKI_TRACE`), and the current volume against both caps -
never a `FAIL`, since both directions are a valid state. More on this:
[telemetry-and-evaluation.md](../docs/explanation/telemetry-and-evaluation.md#whether-it-runs-at-all).
@@ -300,15 +300,17 @@ one it needs before that.
end state - the pages work alone, `review` simply says so and refuses - so ask rather than
assume.
Ask the user once: is there a task tracker to connect? If yes, create `.wikitool-tasks.json`
in the repo root (per checkout, no `.template`, **gitignored once it holds a token** - like
`.wikitool-telemetry.json` and `.wikitool-remotes.json`), with the provider's own section and
the three thresholds the review reads as configuration rather than schema. The shape, the
Ask the user once: is there a task tracker to connect? If yes, set the `tasks`
section (provider and the three thresholds the review reads as configuration rather than
schema) and the provider's own section with `tools/wikitool config set`. What the tiers decide
goes there too: the account's address and login are per checkout, and a token or password is
never typed into the chat - the user puts it into 1Password, the secrets file or a
`WIKITOOL_SECRET_<NAME>` variable, and the setting holds a reference to it. The shape, the
shipped providers, and what Super Productivity in particular needs are in
[configuration.md](../docs/reference/configuration.md#task-tracker); do not restate them here. If no, do nothing - no
file is created, and adding one later needs nothing from this procedure.
section is written, and adding one later needs nothing from this procedure.
`doctor` reports the result in step 12 (`tasks`): absent is `OK`, a malformed file is the one
`doctor` reports the result in step 12 (`tasks`): absent is `OK`, a malformed section is the one
`FAIL` here (a broken opt-in must not read as "no tracker configured"), and a configured
provider that is simply not running is never a fault.