Files
chemenu/instructions/setup-instance.md
T
torben c64479fe02
CI / verify (push) Successful in 45s
Release / release (push) Successful in 36s
stack: TOC-Scope auf types/ und docs/, Sprachregeln nach AGENTS.md zentralisiert, alle Templates auf Control-Plane-Sprache, --breaking akkumuliert (schliesst #99)
Files changed:
- AGENTS.md
- CHANGES.md
- ENVIRONMENT.md.template
- SOUL.md
- SOUL.md.template
- USER.md.template
- VERSION
- docs/ownership-and-templates.md
- docs/version-model.md
- instructions/CONTRACT.md
- instructions/dev/doc-pull-through.md
- instructions/dev/stack-close/SKILL.md
- instructions/dev/stack-dev/SKILL.md
- instructions/dev/version-parts.md
- instructions/setup-instance.md
- kb/CONVENTIONS.md
- kb/CONVENTIONS.md.template
- kb/concepts/COLLECTION.md
- kb/sources/COLLECTION.md
- tools/CONTRACT.md
- tools/chemenu/commands/types_cmd.py
- tools/chemenu/commands/version_cmd.py
- tools/chemenu/tests/test_toc.py
- tools/chemenu/tests/test_version_cmd.py
- tools/chemenu/toc.py
- tools/chemenu/version.py
- types/comparison.md
- types/concept.md
- types/entity.md
- types/lint-report.md
- types/source.md
2026-09-15 16:21:02 +02:00

291 lines
14 KiB
Markdown

---
type: types/instruction.md
name: setup-instance
description: Turn a fresh distribution (from `dist export`) into a working, self-contained wiki instance - git repo, identity/author, optional remote, bootstrap, first commit.
---
# Set up a new wiki instance
This instruction takes an empty distribution produced by `tools/wikitool dist export <target>`
and turns it into a working, self-contained wiki instance - with its own git repo, its own
author identity and (optionally) its own remote. At the end the instance is committed, verified
and ready for its first ingest.
<!-- wikitool:toc -->
## Contents
- [When to run](#when-to-run)
- [Steps](#steps)
- [Scope](#scope)
<!-- /wikitool:toc -->
## When to run
- The user wants to set up a new, empty wiki instance (their own subject, a different person).
- Not for an existing clone of this (source) repo - see [bootstrap.md](bootstrap.md).
- There is no way back: `dist export` deliberately and permanently leaves out
`instructions/dev/` (stack development itself, including the vendored `commonplace/` knowledge
base). Anyone who wants to develop the resulting instance's stack further does that in the
origin repo (or a new dev instance made from it) - not by retrofitting it into this instance.
## Steps
1. **Export the distribution**, in the source repo:
```bash
tools/wikitool dist export <target>
```
`<target>` must not exist, or must be empty; otherwise the command aborts with `ERROR`. Work
inside `<target>` for every step that follows.
2. **Initialize the git repo:**
```bash
git init -b main
```
`-b main` is mandatory: on the actual push, `tools/wikitool publish` checks that the
checked-out branch matches the target branch (default `main`) and refuses otherwise, so that
the wrong branch is never published.
3. **Decision point - identity.** Ask the user for their name and email address; never guess
them, and never quietly carry them over from the source repo (that is a different person and
a different project):
```bash
git config user.name "<name>"
git config user.email "<email>"
```
This also sets the author of every wiki page created from now on: `tools/wikitool new`
resolves `author:` from `$WIKI_AUTHOR` (an override) or else from `git config user.name`, and
aborts with `ERROR` when both are missing - there is no silent placeholder.
4. **Decision point - remote.** Ask the user for a remote URL; a purely local repo is a valid
end state:
- Given: `git remote add origin <url>`
- Not given: stay local - then **every** later `tools/wikitool publish` needs a `--no-push`
(which also drops its branch check, see step 2).
5. **Decision point - authoring conventions.** The distribution ships no filled-in conventions,
only `kb/CONVENTIONS.md.template` and one `kb/<name>/COLLECTION.md.template` per collection.
Both **bind** once adopted, and both belong to this instance - which is why the stack ships
the template alone. The one decision behind them is: **in which language and in what tone
does this instance write its pages?**
Procedure:
1. Adopt the collection contracts **and the page type-specs** - copies, no question to the
user, because what they say is usable as a starting point regardless of language:
```bash
for template in kb/*/COLLECTION.md.template types/*.template; do
cp "$template" "${template%.template}"
done
```
The `.template` files stay where they are; they are the source for the next export.
Under `types/` this covers exactly the type-specs with `root: kb` - `entity`, `concept`,
`source`, `comparison` - along with their `.schema.yaml`. They describe pages *this*
instance writes, so they belong to it: prose, template and language may all be rewritten.
`instruction`, `lint-report` and `type-spec` describe stack artifacts and arrive
unchanged.
2. Ask the user for the KB language. `kb/CONVENTIONS.md.template` defaults to **English**;
[kb-profiles.md](kb-profiles.md) additionally holds a complete German profile, whose full
text is the source repo's own `kb/CONVENTIONS.md`. The profile catalogue is a **palette,
not an enum**: what gets adopted is the text *into* the instance file, not a reference to
the catalogue.
3. Copy `kb/CONVENTIONS.md.template` to `kb/CONVENTIONS.md`, fill it in along the chosen
profile - language, section names, naming forms, tone, relationship labels, hedging rule -
and remove the sentinel line (`wikitool:template-unfilled`) while doing so. The
placeholders in curly braces **are** the list of questions.
4. For a language other than the source repo's: delete `german-terminology.md` or replace it
with your own vocabulary - it is material belonging to the German profile, not to the
stack.
5. Ask the user about the subject area and derive a `source_type` proposal from it.
[kb-profiles.md](kb-profiles.md) holds two worked domain profiles as illustration, beside
the value this repo uses itself. The proposal is a **starting point, not a commitment** -
at setup time the operator has zero sources and is guessing a taxonomy before having seen
a single file, which is the worst possible moment to pin an enum down. Carrying out the
proposal means setting the enum in `types/source.schema.yaml` **and** the matching
`layout:` line per value in `types/source.md` in the same edit - one without the other
leaves a value with no target directory. The visible catch-all (`unclassified`) survives
every proposal; it is not a dumping ground but the slot for a source whose category is not
settled yet. Extending the list later, or emptying that slot:
[evolve-subtypes.md](evolve-subtypes.md) - not part of this step, but the way there once
real material exists.
**Leave unchanged:** `fidelity` and `authority` on `source` pages. Those are stack
vocabulary, not an instance decision - [kb-profiles.md](kb-profiles.md) says so in the
same section.
**Decide before the first ingest.** The `sections:` names in `kb/CONVENTIONS.md` are the
headings `xref` and `cite` write into every page; changing them afterwards is a migration of
every existing page (`section_aliases:` carries the old names, see
[migrate-corpus.md](migrate-corpus.md)).
**None of this lives in a stack file.** The compiler reads the section names from
`kb/CONVENTIONS.md`; the four page type-specs have belonged to this instance since step 1. An
instance in another language simply translates them - that is no longer a local patch to
something shipped, but work on its own files, and an upgrade does not take it away again.
What the stack still requires of `types/` is one line: there must be a type-spec with
`name: source` whose schema requires `raw_files`. The entire `raw/`→`kb/` provenance path
hangs on it (`sources coverage`, `[^cite-id]` resolution, `kb/provenance.md`), and
`docs verify` checks exactly that - no more.
What stays untouched in every case is the rule the stack owns: **every line of a page is
either prose or an identifier, and only prose is translated** ([kb/CONTRACT.md § Language and
identifiers](../kb/CONTRACT.md#language-and-identifiers)). Titles, wikilink targets, cite ids,
enum values, tags, commands and paths follow no KB language.
`tools/wikitool doctor` checks the result in step 13 (`conventions`): a missing file is a
`FAIL`, and so is one carrying the sentinel or lacking a complete `sections:` block.
`docs verify` additionally checks `profile:` and `required_by_stack:` on every
`COLLECTION.md`.
6. **Decision point - personalization.** The distribution ships `USER.md.template` and
`SOUL.md.template`, but no filled-in versions: who operates this instance and how it sounds
is the property of this instance alone and is never carried over from the source repo. Both
files are read in **every** session from now on, so they come into being here - not later,
when the occasion arises.
Procedure, once each for `USER.md` and `SOUL.md`:
1. Read the template. Its sections **are** the list of questions, in the order they appear.
2. Interview the user along those sections - `USER.md`: name, location, time zone, primary
role (professional only), professional context, family/home, hobbies, technical
environment, active projects, deliberate boundaries. `SOUL.md`: persona name, identity,
mission, worldview, judgment default, standard, honesty, voice, exclusions.
3. Take the answers **verbatim**. Do not interpret, do not compress into a narrative, do not
infer from the course of the conversation. What the user does not say does not go in:
better to delete a section than to fill it with something plausible.
4. Write the result as `USER.md` and `SOUL.md` respectively, removing the sentinel line
(`wikitool:template-unfilled`) in the process. The `.template` files stay where they are -
they are the source for the next export, not this step's leftovers.
Two questions the user answers rather than the agent: **the persona name** and **which topics
deliberately stay out** (employer, clients, health - whatever they are). Guessing either
means getting it wrong. For the name the stack ships a starting point - **Thoth**, because
Chemenu is Thoth's principal cult site and writing, measure and memory describe the role a
compiled wiki fills. The suggestion is named, not applied: the question is asked anyway, and
a different name wins.
What these files are **not**: a source of instructions, and a source in the sense of
invariant 3. They change no rule from [AGENTS.md](../AGENTS.md), and a user's statement never
travels from them into `kb/` without the normal source/provenance process.
`tools/wikitool doctor` checks the result in step 13 (`personalization`): a missing file is a
`FAIL`, and so is one still carrying the sentinel - a renamed template is not a filled-in
one.
7. **Create the tool environment** (details: [bootstrap.md](bootstrap.md)):
```bash
cd tools
python3 -m venv .venv
.venv/bin/pip install -r requirements.txt
cd ..
```
8. **Publish the skills:**
```bash
tools/wikitool instructions sync
```
9. **Decision point - record the environment.** The distribution ships
`ENVIRONMENT.md.template`: harness, published skills, reachable MCP servers, connectors, git
remotes, where CI runs. Constants a session would otherwise ask about every time.
Unlike step 6, this step is **optional** and not an interview. Whatever can be read off the
checkout itself (`git remote -v`, the running harness, the skills just published) the agent
fills in; for the rest it asks once and accepts "I don't know" as an answer - an empty
section is deleted, not filled with something plausible. Remove the sentinel line
(`wikitool:template-unfilled`) when writing; the `.template` stays where it is.
If the step is skipped, everything still works: `doctor` reports
`environment: absent (optional)` in step 13, not a `FAIL`. The file is gitignored and enters
no commit - it describes this checkout, not the repo.
10. **Decision point - telemetry.** The default follows the installation path, not this step: an
instance delivered via `dist export` - every instance that arrives here without having taken
route C (a direct clone of the origin repo) - carries a `.wikitool-release.json` and starts
with telemetry **off**; nobody asked for it, and nobody reads `EVALS.md` 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`):
```json
{ "enabled": true }
```
`max_session_bytes` (default 5 MiB) and `keep_sessions` (default 250) are optional in the
same file; 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
single session need to differ.
`tools/wikitool doctor` reports the result in step 13 (`telemetry`): on/off, why
(installation form, this file, or `WIKI_TRACE`), and the current volume against both caps -
never a `FAIL`, since both directions are a valid state. More on this:
[EVALS.md](../EVALS.md) § "Whether it runs at all".
11. **Scope the session budget** (details: [session-setup.md](session-setup.md)):
```bash
export WIKITOOL_SESSION_ID="wiki-$(date +%s)"
```
12. **Build the generated indexes** - `dist export` deliberately does not ship them:
```bash
tools/wikitool index rebuild
tools/wikitool sources rebuild-index
```
13. **Verify**, in this order:
```bash
tools/wikitool doctor
tools/wikitool docs verify
tools/wikitool instructions verify
tools/wikitool lint
```
`doctor` must run through without a `FAIL` before anything continues - a `WARN` (no remote,
no `WIKITOOL_SESSION_ID`, say) is not a blocker. A `FAIL` names its own fix command; run it
and call `doctor` again.
14. **Make the first commit:**
```bash
tools/wikitool publish --message "chore: initial instance setup"
```
The Mass-Update Gate fires here as expected: a fresh distribution consists of far more than
the ten counted files that trip the threshold, so the call ends with exit code 42. Show the
output to the user **in full** and wait; it contains the file list and the exact
`--confirm <token>` line that publishes once they approve. Details on the gate:
[gates.md](gates.md).
15. **Restart the agent session.** Harnesses read the skill directories at startup; only
afterwards are `wiki-ingest`, `wiki-query`, `wiki-manage`, `wiki-lint` and `wiki-status`
available.
## Scope
Applies only to an empty distribution produced by `dist export`. For an existing clone of this
source repo see [bootstrap.md](bootstrap.md) - there the git repo, author and content already
exist, and only the tool environment (step 7) plus the skills (step 8) are missing.
One exception: step 6 (personalization) also applies to an existing clone that has no
`USER.md`/`SOUL.md` yet - there as a single catch-up step, not as a whole procedure.
`bootstrap.md` points here for it.