diff --git a/.wikitool-kb.json b/.wikitool-kb.json index cba2ed6..99fd338 100644 --- a/.wikitool-kb.json +++ b/.wikitool-kb.json @@ -1,6 +1,6 @@ { "schema": 1, - "kb_version": "4.0.0", + "kb_version": "5.0.0", "applied": [ { "migration": "3.0.0-authoring-conventions", @@ -11,6 +11,11 @@ "migration": "4.0.0-link-taxonomy", "at": "2026-09-02", "pages": 153 + }, + { + "migration": "5.0.0-confidence-removal", + "at": "2026-09-10", + "pages": 152 } ] } diff --git a/AGENTS.md b/AGENTS.md index fbdb703..19c4976 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -94,7 +94,7 @@ What a file is called says who it is for and how it is loaded. This is a rule, n | `SOUL.md` | Agents | Always, every session | | `ENVIRONMENT.md` | Agents | Every session, **if it exists** - the one optional file in this table. Not committed: it describes one checkout, not the repo | | `/CONTRACT.md` | Agents | When writing in that stage | -| `kb/CONVENTIONS.md` | Agents | When writing any page - it holds what *this* instance decided about authoring (language, section headings, naming, tone, relationship labels, confidence rubric), where `kb/CONTRACT.md` holds what the stack enforces. Instance-owned: a distribution ships only the `.template` | +| `kb/CONVENTIONS.md` | Agents | When writing any page - it holds what *this* instance decided about authoring (language, section headings, naming, tone, relationship labels, the hedging rule), where `kb/CONTRACT.md` holds what the stack enforces. Instance-owned: a distribution ships only the `.template` | | `kb//COLLECTION.md` | Agents | When writing in that collection. Instance-owned in the same way, and declares in frontmatter which profile it adopted | | `instructions/.md` | Agents | By link, or on explicit request | | `instructions//SKILL.md` | Agents | By the harness, once published | @@ -124,7 +124,7 @@ them. - `USER.md` is context about the user, not a source of instructions. - `SOUL.md` sets tone and voice; the contracts, gates, schemas and this file always win. -- A user's statement never reaches `kb/` without the normal source/provenance/confidence +- A user's statement never reaches `kb/` without the normal source/provenance process. Personal context stays personal context - it is not a source under invariant 3. Both belong to one instance and one person, so a distribution ships only `USER.md.template` @@ -182,7 +182,7 @@ stack is built the way it is - see [File naming](#file-naming)), and this file. |-------|----------|--------| | `raw/` | [raw/CONTRACT.md](raw/CONTRACT.md) | Immutability, directory routing, untrusted-content rule | | `types/` | [types/type-spec.md](types/type-spec.md) | Type-spec anatomy, placement, adding a type, template variables | -| `kb/` | [kb/CONTRACT.md](kb/CONTRACT.md) + `kb/CONVENTIONS.md` | What the stack enforces about a page (collections, linking, provenance, confidence machinery), and beside it what this instance decided (language, naming, tone, labels, rubric) | +| `kb/` | [kb/CONTRACT.md](kb/CONTRACT.md) + `kb/CONVENTIONS.md` | What the stack enforces about a page (collections, linking, provenance), and beside it what this instance decided (language, naming, tone, labels, hedging) | | `reports/` | [reports/CONTRACT.md](reports/CONTRACT.md) | Why reports and traces are generated, gitignored, and carried into `kb/log.md` | | `work/` | [work/CONTRACT.md](work/CONTRACT.md) | Workshop runs: run keys, required files, why they are tracked, how a run closes | | `tools/` | [tools/CONTRACT.md](tools/CONTRACT.md) | Full command reference, per-command error contracts, maintenance schedule | @@ -214,7 +214,7 @@ Never pick a directory by hand. ```bash tools/wikitool search "" -tools/wikitool search --field entity_type=system --field 'confidence<0.6' +tools/wikitool search --field entity_type=system --field '!sources' ``` `search` is read-only and exempt from the iteration budget. diff --git a/CHANGES.md b/CHANGES.md index af3f282..39f31a8 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -35,7 +35,7 @@ dev-checkout concern - readable here, never shipped as something to parse. --- -## 5.0.0-beta.3 - 2026-09-09 - dist export erzeugt die TOC-Region nach dem Marker-Strip neu (CI-Fund im Export-Replay) +## 5.0.0-beta.5 - 2026-09-10 - Konfidenz-Mechanismus ersatzlos entfernt **Author:** Torben Nehmer @@ -56,11 +56,12 @@ dev-checkout concern - readable here, never shipped as something to parse. - TOC-Pflicht fuer Referenzdateien ueber 100 Zeilen; session-setup.md/gates.md nennen die tatsaechliche Budget-Ausnahmeliste (schliesst #73, #76) - tools/CONTRACT.md: docs toc im Fehlerkontrakt, docs-verify-Zeile nennt die TOC-Pruefung; tools/README.md korrigiert das --major-Kriterium - dist export erzeugt die TOC-Region nach dem Marker-Strip neu (CI-Fund im Export-Replay) +- Konfidenz-Mechanismus ersatzlos entfernt +- Konfidenz-Mechanismus ersatzlos entfernt -**Migration:** none required - Betrifft nur AGENTS.md, die Stage-/Collection-Contracts und instructions/; kb/-Inhalt bleibt unberuehrt, keine Migration noetig. -**Breaking Change:** docs verify verlangt jetzt eine aktuelle Inhaltsverzeichnis-Region () auf AGENTS.md, jedem Stage-/Collection-Contract und jeder flachen instructions/**.md-Datei ueber 100 Zeilen. Eine bestehende Instanz mit einer eigenen instructions/*.md-Datei ueber 100 Zeilen ohne TOC sieht docs verify nach dem Tool-Update neu fehlschlagen, bis einmalig 'wikitool docs toc --apply' laeuft und der Diff committet wird. +**Breaking Change:** docs verify verlangt eine aktuelle Inhaltsverzeichnis-Region () auf AGENTS.md, jedem Stage-/Collection-Contract und jeder flachen instructions/**.md-Datei ueber 100 Zeilen - eine bestehende Instanz mit einer eigenen instructions/*.md-Datei ueber 100 Zeilen ohne TOC sieht docs verify nach dem Tool-Update neu fehlschlagen, bis einmalig 'wikitool docs toc --apply' laeuft und der Diff committet wird. Ausserdem verschwinden wikitool confidence decay und confidence init-base ersatzlos, touch --confidence-base ebenso, und die Schemas fuer entity/concept verlieren confidence/confidence_base vollstaendig (additionalProperties: false) - jede bestehende Instanz muss den Korpus migrieren, sonst werden alle Entity-/Concept-Seiten beim Schema-Update sofort schemainvalide. Ablauf: instructions/migrations/5.0.0-confidence-removal.md Das Label `status/incoming` gibt es seit heute in Gitea: der Mensch legt einen Stub an — zwei Sätze, ein Verdacht, ein „wäre interessant" — und der Stack @@ -941,6 +942,49 @@ selbst widerlegt: grenzüberschreitend mit `--no-migration`. Schließt #73, #76. +**Konfidenz-Mechanismus ersatzlos entfernt (schließt #60).** `confidence`, +`confidence_base`, der Zeit-Decay und die Konfidenz-Rubrik sind aus Schema, +Kommandos (`confidence decay`/`init-base`, `touch --confidence-base`), Lint +(`confidence_exceeds_source_standing`), Suche (`--sort -confidence`, +Konfidenzspalte) und jeder Doku-Stelle entfernt, die sie erwähnte. + +Der Mechanismus wurde gemessen, nicht nur für unschön befunden: 43 der 152 +betroffenen Seiten trugen nie mehr als den Schema-Vorgabewert 0.5, der Decay +hat seit seiner Einführung keinen einzigen Wert bewegt (`confidence_decay.py` +übersprang `concept_type: decision`, `touch --confidence-base` zog das +abgeleitete Feld nie mit), und kein Konsument im Stack hing außer über +`corpus_diff.STRUCTURAL_FIELDS` — eine Abhängigkeit von der Existenz des +Feldes, nicht von seinem Wert — überhaupt an ihm. Vier Entwürfe für eine +Reparatur (Rubrik nachjustieren, Quellenautorität anheben, aus +`authority × fidelity` berechnen, zwei Schubladen für Reifegrad und +Volatilität) scheiterten an denselben Messwerten. Die vollständige Studienlage +steht in #85, wo das Thema als zurückgestellt geführt wird, nicht als +verworfen. + +An die Stelle tritt nichts Neues: `kb/CONVENTIONS.md` bekommt eine +Prosa-Hedging-Regel — nach Quellenlage hedgen statt nach Schwellenwert, siehe +`kb/CONVENTIONS.md § Hedging` — und die Arbeitsliste ersetzt +`--field 'confidence<0.6'` durch Prädikate auf tatsächlich aufgezeichneten +Feldern (`--field '!sources'`, `--field provenance=general`). Mit dem Feld +stirbt auch `confidence_exceeds_source_standing`, der einzige automatische +Abgleich zwischen einer Seite und der Standing ihrer Quellen; ein Ersatz ohne +Zahl ist als Kandidat in #85 vorgemerkt, aber bewusst nicht Teil dieses Pakets. + +`version bump` bekommt dabei ein neues Flag, `--migration-required`: der +laufende Kandidat hatte in einem früheren Bump `--no-migration` erklärt, und +dieses Paket macht die Erklärung falsch. Die `**Migration:** none +required`-Zeile ist maschinengeschrieben (Invariante 1 verbietet den +Handgriff), und bislang gab es keinen Weg, sie zurückzunehmen, sobald ein +späterer Bump doch eine Migration braucht. Das Flag entfernt die Zeile +stattdessen und verlangt ein Migrationsdokument, das die neue Basisversion +referenziert, bevor es das tut. + +Was das für eine bestehende Instanz bricht, steht in der `**Breaking +Change:**`-Zeile oben. `instructions/migrations/5.0.0-confidence-removal.md` +ist der mechanische Strip der zwei Felder über den betroffenen Korpus, +mitsamt der Invariante, die ein automatisierter Lauf einhalten muss (kein +`modified:`-Bump, byte-identischer Body, unveränderte Referenzarrays). + --- ## 4.7.4 - 2026-09-04 - bootstrap.md nennt den session-id-WARN nach frischem Bootstrap explizit als erwartet diff --git a/INSTALL-MCP.md b/INSTALL-MCP.md index dfdb135..7aa74a8 100644 --- a/INSTALL-MCP.md +++ b/INSTALL-MCP.md @@ -84,7 +84,7 @@ Danach kennt der Client fünf Werkzeuge: | Tool | Was es beantwortet | |---|---| -| `search` | Seiten in `kb/` nach Text, nach Frontmatter (`confidence<0.6`, `tags~k8s`) oder beidem | +| `search` | Seiten in `kb/` nach Text, nach Frontmatter (`!sources`, `tags~k8s`) oder beidem | | `types` | Welche Seitentypen dieses Wiki kennt | | `describe_type` | Der vollständige Vertrag eines Typs: Felder, Pflichtangaben, Enums | | `lint` | Strukturelle Befunde: kaputte Wikilinks, Waisen, Index-Drift, Schema-Lücken | diff --git a/INSTALL.md b/INSTALL.md index 619dbc8..b0dd588 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -69,7 +69,7 @@ Zwei Schritte, von denen nur der erste rein menschlich ist: - **Remote** (optional) - eine URL, wenn du das Repo auf einen Server pushen willst; sonst bleibt die Instanz lokal, und jedes `publish` läuft mit `--no-push`. - **Autorenkonventionen** - Sprache, Abschnittsnamen, Namensformen, Ton, Beziehungslabels - und Confidence-Rubrik stehen in `kb/CONVENTIONS.md`, dazu je Collection die Regeln in + und Hedging-Regel stehen in `kb/CONVENTIONS.md`, dazu je Collection die Regeln in `kb//COLLECTION.md`. Die Distribution bringt davon nur die `.template`-Dateien mit: das sind Entscheidungen *dieser* Instanz, keine Eigenschaft des Musters, und nichts davon liegt unter `tools/` oder `types/`. Fertige Profile - darunter ein vollständiges deutsches - diff --git a/README.md b/README.md index b92ad71..f939624 100644 --- a/README.md +++ b/README.md @@ -92,7 +92,7 @@ chemenu/ │ ├── instruction.md # Instruction type - lives outside kb/ via `root: repo` │ └── lint-report.md # Contract-only: describes reports/, owns no directory ├── kb/ # OUTPUT: compiled knowledge. A namespace, not a collection -│ ├── CONTRACT.md # Collections, naming, tone, linking, provenance, confidence +│ ├── CONTRACT.md # Collections, naming, tone, linking, provenance │ ├── index.md # Generated catalog *map*: counts and pointers │ ├── log.md # Generated chronological audit log │ ├── provenance.md # Generated raw-file reverse index @@ -201,7 +201,6 @@ The LLM will: - Check for contradictions (semantic judgment) - Find stale claims - Identify orphan pages and missing cross-references -- Apply confidence decay (`tools/wikitool confidence decay --apply`) - Rebuild `kb/index.md` and `kb/provenance.md`, append to `kb/log.md` - Generate a report @@ -239,7 +238,7 @@ themselves live as independently-discoverable skills under `.agents/skills/` |-------|---------| | `wiki-ingest` | Promote a new source from `incoming/` into `raw/`, then process it into the wiki: source summary, entity/concept pages, cross-references, index/log, publish | | `wiki-query` | Answer a question from the compiled wiki; read-only, can optionally file a valuable answer back as a new page | -| `wiki-lint` | Health-check the wiki: structural scan, raw coverage, semantic review, confidence decay | +| `wiki-lint` | Health-check the wiki: structural scan, raw coverage, semantic review | | `wiki-manage` | Create a new entity/concept/source/comparison page, or update an existing page with new information | | `wiki-status` | Read-only snapshot: page counts, orphans, uncovered raw files, most-connected pages | @@ -301,16 +300,6 @@ which command - lives in [`tools/CONTRACT.md`](tools/CONTRACT.md#maintenance-sch next to the command reference it depends on, so the two cannot drift apart. The notes below explain the three parts of it that need more than one line. -**Confidence decay.** Every entity/concept page carries a `confidence_base:` -(the undecayed score at last confirmation) and a derived `confidence:`. -`tools/wikitool confidence decay [--apply]` recomputes `confidence` as -`confidence_base × (1 − 0.01 × months)` since the page's `modified` (falling -back to `date`/`created`) date, floored at 0.2. It's dry-run by default and -only writes with `--apply`. Because it always recomputes from the untouched -base, repeated runs are idempotent - never edit `confidence:` directly; use -`tools/wikitool touch --page "" --confidence-base <value>` to -re-assess a page. - **Provenance.** Every fact should trace back to a raw file. Source pages declare their backing `raw_files:`; entity/concept pages declare `provenance:` (`sourced`/`general`/`mixed`) and cite specific claims inline with a @@ -365,8 +354,7 @@ cannot report, what is redacted, and why there is deliberately no LLM judge yet. Mechanical wiki operations - never hand-edited by the LLM - are handled by `tools/wikitool`: scaffolding pages, renaming and deleting them, cross-references, -index/log/provenance regeneration, confidence decay, structural linting, and -publishing. +index/log/provenance regeneration, structural linting, and publishing. The full command reference - every option, the per-command error contracts, and the maintenance schedule - is in [`tools/CONTRACT.md`](tools/CONTRACT.md). It is @@ -432,7 +420,7 @@ This is a git repo. Use it for: ### Search `tools/wikitool search "<text>"` searches `kb/` directly - by text, or by frontmatter with -`--field entity_type=system` or `--field 'confidence<0.6'`. It is read-only and is the one +`--field entity_type=system` or `--field '!sources'`. It is read-only and is the one command not counted against the session budget, because looking before acting is the habit worth encouraging. diff --git a/VERSION b/VERSION index f61653e..90a0894 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -5.0.0-beta.3 +5.0.0-beta.5 diff --git a/instructions/capture-session.md b/instructions/capture-session.md index d0537d8..f2ad8a5 100644 --- a/instructions/capture-session.md +++ b/instructions/capture-session.md @@ -79,8 +79,8 @@ reference it by name. Two half-accounts produce two source pages claiming the sa ### 2. Fix the fidelity before writing a word Capture is layered, and **the layer is decided at capture and never rises afterwards.** No -citation syntax, no later review, no confidence bump can promote a paraphrase to a quote; only -going back to the original can, and a session's scrollback will not be there to go back to. +citation syntax and no later review can promote a paraphrase to a quote; only going back to the +original can, and a session's scrollback will not be there to go back to. So decide, per passage, before writing: diff --git a/instructions/dev/issue-tracking.md b/instructions/dev/issue-tracking.md index eaf7b45..824e60a 100644 --- a/instructions/dev/issue-tracking.md +++ b/instructions/dev/issue-tracking.md @@ -160,7 +160,7 @@ issues at that URL, which is exactly why `dist export` excludes | `area/` | Means | |---|---| - | `area/kb` | The `kb/` schema, contract, confidence machinery, lint - the knowledge base as a system. | + | `area/kb` | The `kb/` schema, contract, provenance machinery, lint - the knowledge base as a system. | | `area/distribution` | Shipping, upgrading and versioning an instance. | | `area/corpus` | The content and scope of `kb/` in this instance, and the demo/testbed question. | | `area/workflow` | Git, merging, branching, publish, PRs. | diff --git a/instructions/german-terminology.md b/instructions/german-terminology.md index 0704a0c..2b16f33 100644 --- a/instructions/german-terminology.md +++ b/instructions/german-terminology.md @@ -68,7 +68,6 @@ that offered the choice instead of making it. A list of phrases is not a list of |---|---|---| | reconciliation / to reconcile | Abgleich / abgleichen | Not „Abstimmung", including in compounds: `Abgleichsintervall` | | claim | Aussage | **Never** „Anspruch" - that is a legal entitlement | -| confidence | Konfidenz | Matches the `confidence:` field and `wikitool confidence decay` | | desired state | Soll-Zustand | | | ownership (in prose) | Verwaltung / Zuständigkeit | But `Ownership Model` and `Ownership-Tier(s)` stay, **including as a heading** | | built-in | -eigen (`K3s-eigen`) | | diff --git a/instructions/kb-profiles.md b/instructions/kb-profiles.md index 7242a46..2b3fd84 100644 --- a/instructions/kb-profiles.md +++ b/instructions/kb-profiles.md @@ -55,7 +55,7 @@ is not a profile. | File | Holds | Profiles below | |---|---|---| - | `kb/CONVENTIONS.md` | Language, section headings, naming forms, tone, relationship labels, confidence rubric - once per instance | [Language profiles](#language-profiles) | + | `kb/CONVENTIONS.md` | Language, section headings, naming forms, tone, relationship labels, the hedging rule - once per instance | [Language profiles](#language-profiles) | | `kb/<name>/COLLECTION.md` | What one collection holds, its quality goal, its local linking and naming rules | [Collection profiles](#collection-profiles) | 2. **Copy the entry's text into the file**, then edit it until it is true of this instance. @@ -89,7 +89,7 @@ stack's hardcoded behaviour until the conventions file existed. | Naming | Human-readable titles with spaces; singular for entities; a decision named like any other concept, no `adr-NNN-` prefix; `X vs Y` for comparisons | | Tone | Wikipedia register, with a German buzzword and filler list | | Relationship labels | `hängt ab von` · `verwendet` · `implementiert` · `erweitert` · `ersetzt` · `steht in Konflikt mit` · `benötigt` · `erzeugt` · `konsumiert` · `besitzt` · `pflegt` · `läuft auf` · `verwandt mit` | -| Confidence rubric | 0.5 base, +0.2 per supporting source (max +0.6), recency and source-quality bonuses; hedge with "möglicherweise"/"kann" below 0.6, "unsicher"/"unbestätigt" below 0.4 | +| Hedging | By source standing, not a score: `provenance: general` with no `sources:` says "im Allgemeinen"/"üblicherweise"; a claim rests on its weakest cited source's `authority` (`normative` vs. `opinion`); disagreement is named in prose ("möglicherweise", "laut X, aber Y widerspricht") | | Terminology | [german-terminology.md](german-terminology.md) - which English terms stay English, and which have a settled German form | **The full text to copy** is this repo's own [kb/CONVENTIONS.md](../kb/CONVENTIONS.md). An @@ -113,7 +113,7 @@ There is no worked text for the rest of it. The template's placeholders are the A language profile is not a translation of `german`. Two of its sections are judgment about a language rather than vocabulary in it - which foreign technical terms stay untranslated, and how -to hedge a low-confidence claim - and those are exactly the two that read as awkward when +to phrase hedged and disagreeing claims - and those are exactly the two that read as awkward when translated mechanically. Write them, do not convert them. The one part that is mechanical: `section_aliases:`. Whatever the corpus used before goes in diff --git a/instructions/migrate-corpus.md b/instructions/migrate-corpus.md index 6b1a038..7972651 100644 --- a/instructions/migrate-corpus.md +++ b/instructions/migrate-corpus.md @@ -105,8 +105,9 @@ 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. -- **Contradiction with an existing page.** Never overwrite. Record both, ask the user, and pull - the confidence down with `touch --confidence-base` if it stays unresolved. +- **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). ## Writing the migration document diff --git a/instructions/migrations/5.0.0-confidence-removal.md b/instructions/migrations/5.0.0-confidence-removal.md new file mode 100644 index 0000000..703a452 --- /dev/null +++ b/instructions/migrations/5.0.0-confidence-removal.md @@ -0,0 +1,129 @@ +--- +type: types/instruction.md +name: 5.0.0-confidence-removal +description: Remove the confidence/confidence_base frontmatter fields from every entity and concept page - a shape change with no judgment call, since the machinery that read them is already gone. +manual: true +migrates_to: 5.0.0 +migration_kind: mechanical +--- +# Remove `confidence`/`confidence_base` from every page (5.0.0) + +5.0.0 removes the confidence mechanism from the stack: the two frontmatter fields, the +`wikitool confidence decay`/`init-base` commands, the search sort/filter machinery, and the +advisory lint check that compared it to source standing. `AGENTS.md` invariant 3 and +`kb/CONVENTIONS.md`'s hedging rule take over the two jobs the number used to do - hedging follows +what the sources carry, and the work list finds unreviewed pages by `!sources`/`provenance=general` +rather than by a threshold. The full measurement behind the removal - why the mechanism never +tracked anything auditable - is the changelog entry for this version, not repeated here. + +**No page learns anything new, and no body is touched.** This migration only drops two keys from +frontmatter; it is `mechanical` because there is no per-page judgment to make; the removal itself +was the judgment, made once, in the version that introduced this document. + +<!-- wikitool:toc --> +## Contents + +- [When to run](#when-to-run) +- [Steps](#steps) +- [How to tell a migrated page from an unmigrated one](#how-to-tell-a-migrated-page-from-an-unmigrated-one) +- [Decision points](#decision-points) +- [Scope](#scope) +<!-- /wikitool:toc --> + +## When to run + +After installing 5.0.0 machinery over an instance on 4.x. `tools/wikitool migrate status` names +it, and `tools/wikitool lint --fail-on-error` refuses with `schema_validation_errors` on every +entity/concept page still carrying either field - `types/entity.schema.yaml` and +`types/concept.schema.yaml` both declare `additionalProperties: false`, so the two keys are not +merely unused after 5.0.0, they are invalid. + +**This is not a window to live in.** Unlike a labelled-edge migration, there is no advisory phase +here: a page carrying the old fields is schema-invalid the moment the new schema lands, not +merely outdated. Both schemas declare `additionalProperties: false`, so a `lint --fail-on-error` +run between the two halves refuses the whole corpus. Install the 5.0.0 machinery and run this +migration in the same sitting, publishing both together rather than the schema change on its +own. + +## Steps + +1. **Confirm the scope.** Only `entity` and `concept` pages ever declared the fields; `source` + and `comparison` pages never did and need no check: + + ```bash + tools/wikitool search --field 'confidence:*' + ``` + + Every hit is a page this migration must touch. (Once the fields are gone from the schema, + the same predicate becomes a refusal rather than an empty result - that refusal is itself + the signal that the migration finished; see step 4.) + +2. **Strip both fields from each page's frontmatter, mechanically, not by hand.** A script that + reads a page, deletes the `confidence`/`confidence_base` keys if present, and writes the + frontmatter back through this stack's own YAML writer - never a hand-edit, and never a + subagent guessing at formatting. The invariant a checked run must hold: + + - `modified:` is byte-for-byte unchanged. This is a shape change, not a content + confirmation, and a bumped date would misstate 152 pages as freshly reviewed. + - The body is byte-for-byte unchanged, including footnotes and every generated region. + - Every page-reference array (`related:`, `sources:`, `entities:`, `concepts:`) is unchanged + in both content and order. + - The remaining frontmatter keys keep the schema's field order. + - No untracked or gitignored file is touched. + + Cut the corpus into units against the iteration budget - `instructions/migrate-corpus.md`'s + rule of thumb is 48 pages or fewer per unit, which for ~152 affected pages is four units. + +3. **Check each unit mechanically before anything else:** + + ```bash + tools/wikitool migrate verify --from <pre-migration rev> --path kb/<area> --fail-on-error + ``` + + It compares wikilink and citation counts, footnote definitions, H1, and structural + frontmatter - `confidence_base` no longer among the fields it compares as of this same + version, so the field's absence is not itself reported as a defect. Everything else it + checks stays exactly as strict as it was. + +4. **Record it. The checks tighten themselves:** + + ```bash + tools/wikitool lint --fail-on-error # schema_validation_errors must be 0 + tools/wikitool migrate done 5.0.0 --pages <N> + ``` + + Only once `lint --fail-on-error` passes clean is the run finished. From this point, `search + --field 'confidence<0.6'` (or any predicate naming either field) is refused with an "unknown + field" error rather than silently returning nothing - the search layer already refuses a + predicate no page in the corpus carries, so the migration's own completion is what makes + that refusal fire. + +## How to tell a migrated page from an unmigrated one + +An unmigrated entity or concept page still has `confidence:` and `confidence_base:` lines in its +frontmatter block; a migrated one has neither, and validates against the 5.0.0 schema without +them. `tools/wikitool search --field 'confidence:*'` lists every page still waiting; an empty +result (or, once the schema has landed, the predicate's own refusal) is the corpus-wide answer. + +## Decision points + +- **A page's `confidence_base` sat far below its cited sources' standing, or far above?** Not + this migration's question. The check that used to flag that mismatch + (`confidence_exceeds_source_standing`) is gone with the field it read, and its replacement - + if the corpus wants one - is a prose spot-check `wiki-lint` applies by hand, not a mechanical + gate. Do not use this migration as an occasion to also rewrite a page's hedging; that is + `wiki-manage`'s job, on its own schedule. +- **A page has `confidence` but no `confidence_base`, or the reverse?** Both are pre-existing + states this stack already tolerated (the decay formula skipped pages missing a base). Strip + whichever key is present; there is nothing to reconcile between them first. +- **Unsure whether a script wrote frontmatter correctly?** Diff one migrated page's frontmatter + block against its pre-migration version by hand before running the rest of a unit - the two + keys should be the only difference, in the position the schema declares. + +## Scope + +The `confidence`/`confidence_base` keys on every `kb/entities/**` and `kb/concepts/**` page. +Nothing under `raw/`, no body prose anywhere, and no other frontmatter field. Installing the +5.0.0 machinery itself - the schema change, the removed commands, the hedging rule in +`kb/CONVENTIONS.md` - is a separate step that must land first; this document only carries the +corpus across the boundary that step opens. diff --git a/instructions/private-instance.md b/instructions/private-instance.md index 0651f42..2eb33fa 100644 --- a/instructions/private-instance.md +++ b/instructions/private-instance.md @@ -51,7 +51,7 @@ changes to those paths go away. Measured, not assumed: The middle row is the one that matters, because nothing announces it. An upstream that ships a demo corpus *and* uses it as a test bed will add pages, and each one arrives in your instance -and starts showing up in your `lint`, your `index`, your `search` and your `confidence decay`. +and starts showing up in your `lint`, your `index` and your `search`. So the merge has to be scoped. That is the procedure below, and it is not optional. @@ -198,7 +198,7 @@ merge above. Nothing is lost by the detour: the fix has to pass that CI either w issue there, or resolve deliberately and finish the commit yourself. - **...but you changed how *your pages* are written?** That is not a stack change and the rule above does not apply to it. Language, section headings, naming forms, tone, relationship - labels and the confidence rubric live in `kb/CONVENTIONS.md`, and each collection's authoring + labels and the hedging rule live in `kb/CONVENTIONS.md`, and each collection's authoring rules in `kb/<name>/COLLECTION.md` - all under `kb/`, all yours, all restored by the merge procedure rather than overwritten by it. If you find yourself editing `tools/` or `types/` to change an authoring convention, that is a stack bug: file it, because the split exists diff --git a/instructions/setup-instance.md b/instructions/setup-instance.md index 3b7e8d4..b79ac08 100644 --- a/instructions/setup-instance.md +++ b/instructions/setup-instance.md @@ -101,7 +101,7 @@ bereit für den ersten `Ingest`. 3. `kb/CONVENTIONS.md.template` nach `kb/CONVENTIONS.md` kopieren, entlang des gewählten Profils ausfüllen - Sprache, Abschnittsnamen, Namensformen, Ton, Beziehungslabels, - Confidence-Rubrik - und dabei die Sentinel-Zeile (`wikitool:template-unfilled`) entfernen. + Hedging-Regel - und dabei die Sentinel-Zeile (`wikitool:template-unfilled`) entfernen. Die Platzhalter in geschweiften Klammern **sind** der Fragenkatalog. 4. Bei einer anderen Sprache als der des Quell-Repos: `german-terminology.md` löschen oder @@ -182,7 +182,7 @@ bereit für den ersten `Ingest`. Was diese Dateien **nicht** sind: eine Instruktionsquelle und eine Quelle im Sinne von Invariante 3. Sie ändern keine Regel aus [AGENTS.md](../AGENTS.md), und eine Nutzeraussage - wandert daraus nie ohne den normalen Quelle/Provenance/Confidence-Prozess nach `kb/`. + wandert daraus nie ohne den normalen Quelle/Provenance-Prozess nach `kb/`. `tools/wikitool doctor` prüft das Ergebnis in Schritt 12 (`personalization`): eine fehlende Datei ist ein `FAIL`, eine, die noch den Sentinel trägt, ebenso - ein umbenanntes Template diff --git a/instructions/wiki-lint/SKILL.md b/instructions/wiki-lint/SKILL.md index 8767c3b..2392b7b 100644 --- a/instructions/wiki-lint/SKILL.md +++ b/instructions/wiki-lint/SKILL.md @@ -1,6 +1,6 @@ --- name: wiki-lint -description: Health-check the LLM wiki - broken links, orphan pages, uncovered raw files, stale claims, duplicated rules, missing cross-references, confidence decay. Use when the user says "lint the wiki", "health-check the wiki", or periodically every 10 sources per the Maintenance Schedule. +description: Health-check the LLM wiki - broken links, orphan pages, uncovered raw files, stale claims, duplicated rules, missing cross-references. Use when the user says "lint the wiki", "health-check the wiki", or periodically every 10 sources per the Maintenance Schedule. --- # Wiki Lint @@ -27,7 +27,7 @@ mechanical half looks exactly like a complete one. - [ ] 5. Missing pages (judgment) - [ ] 6. Duplicated rules (judgment) - [ ] 7. Repair what is mechanical -- [ ] 8. Refresh confidence and verify the stack +- [ ] 8. Verify the stack - [ ] 9. Rebuild, write the report, carry its findings out ``` @@ -93,18 +93,16 @@ mechanical half looks exactly like a complete one. `tools/wikitool rename` - see [page-lifecycle.md](../page-lifecycle.md). Never hand-edit a frontmatter array to clear one. -8. **Refresh confidence and verify the stack.** +8. **Verify the stack.** ```bash - tools/wikitool confidence decay --apply tools/wikitool docs verify tools/wikitool instructions verify ``` - If decay reports pages with no `confidence_base`, run - `tools/wikitool confidence init-base --apply` first. `docs verify` catches command/contract - drift and ignore rules that would silently un-publish content; `instructions verify` catches - a skill copy that drifted from its source and an instruction nothing references. + `docs verify` catches command/contract drift and ignore rules that would silently un-publish + content; `instructions verify` catches a skill copy that drifted from its source and an + instruction nothing references. 9. **Rebuild, write the report, carry its findings out.** @@ -138,8 +136,8 @@ mechanical half looks exactly like a complete one. ## wikitool commands used `lint`, `search`, `sources coverage`, `xref add`, `xref remove`, `rename`, `new`, -`confidence decay --apply`, `confidence init-base --apply`, `docs verify`, `instructions verify`, -`sources rebuild-index`, `index rebuild`, `log append`, `publish` (only if asked) +`docs verify`, `instructions verify`, `sources rebuild-index`, `index rebuild`, `log append`, +`publish` (only if asked) **Deliberately absent:** `rm` - a lint pass never deletes a page, and [page-lifecycle.md](../page-lifecycle.md) is where a deletion belongs. `log status` - it decides diff --git a/instructions/wiki-manage/SKILL.md b/instructions/wiki-manage/SKILL.md index 22efd77..75363a9 100644 --- a/instructions/wiki-manage/SKILL.md +++ b/instructions/wiki-manage/SKILL.md @@ -13,8 +13,8 @@ integrating into an existing one. **Before the first `wikitool` call:** [session-setup.md](../session-setup.md). -**Read before drafting:** [kb/CONTRACT.md](../../kb/CONTRACT.md) - linking, provenance and the -confidence machinery, all of which the tool enforces - and +**Read before drafting:** [kb/CONTRACT.md](../../kb/CONTRACT.md) - linking and provenance, +both of which the tool enforces - and [kb/CONVENTIONS.md](../../kb/CONVENTIONS.md), which is where this instance's language, naming forms, tone and relationship labels are, together with the target collection's own `COLLECTION.md`, which carries its quality goal and what is local to that subtree. Field-level @@ -82,7 +82,7 @@ requirements come from `tools/wikitool types describe <type>`. tools/wikitool touch --page "<Title>" --summary "<new 1-liner>" [--provenance <value>] ``` - Never hand-edit `modified:`, `summary:`, `provenance:` or `confidence:`. + Never hand-edit `modified:`, `summary:` or `provenance:`. 7. **Close out.** [publish-cycle.md](../publish-cycle.md), `--op update`. diff --git a/instructions/wiki-query/SKILL.md b/instructions/wiki-query/SKILL.md index 5a0387d..8c75da2 100644 --- a/instructions/wiki-query/SKILL.md +++ b/instructions/wiki-query/SKILL.md @@ -28,12 +28,12 @@ invariant - rather than synthesizing a plausible-sounding answer from general kn tools/wikitool search "<the user's terms>" ``` - Results carry kind, summary, confidence and modified date - enough to decide what is worth - opening. Narrow with predicates when the question is structural rather than lexical: + Results carry kind, summary and modified date - enough to decide what is worth opening. + Narrow with predicates when the question is structural rather than lexical: ```bash tools/wikitool search "backup" --kind entity --subtype system - tools/wikitool search --field entity_type=system --field 'confidence<0.6' --sort -modified + tools/wikitool search --field entity_type=system --field '!sources' --sort -modified tools/wikitool search --field tags=k8s --limit 30 tools/wikitool search "Longhorn" --matches # show the matching lines ``` @@ -45,8 +45,8 @@ invariant - rather than synthesizing a plausible-sounding answer from general kn entries. Check `kb/sources/` when the question is about what a specific source said. 4. **Answer and cite.** Name the wiki pages the answer came from, and the sources behind them. - Hedge to the page's confidence: below 0.6 write "possibly"/"may"; below 0.4 write - "uncertain"/"unconfirmed". + Hedge to what those sources carry, not to a number - see + [kb/CONVENTIONS.md § Hedging](../../kb/CONVENTIONS.md#hedging). 5. **Decide what earns a page - before the first `new`.** Name every page you are considering, then hold each one on its own against all three criteria: the answer required synthesis diff --git a/kb/CONTRACT.md b/kb/CONTRACT.md index ea7dffe..2e3e86d 100644 --- a/kb/CONTRACT.md +++ b/kb/CONTRACT.md @@ -13,7 +13,7 @@ how it works, so it is identical everywhere and `dist export` ships it verbatim. **What an instance decides for itself is next door, in [kb/CONVENTIONS.md](CONVENTIONS.md)** - the language pages are written in, the headings its two -generated regions render under, the naming forms, the tone, the confidence rubric. That file binds exactly as this one does; it is simply owned by the instance +generated regions render under, the naming forms, the tone, the hedging rule. That file binds exactly as this one does; it is simply owned by the instance rather than by the stack, so the distribution ships only its `.template` and the instance writes the real one. Read both, plus the target collection's `kb/<name>/COLLECTION.md` (also instance-owned), before writing or editing a page. @@ -40,8 +40,6 @@ looks like) are in neither - they belong to the type-specs and are printed by - [Generated regions](#generated-regions) - [Linking](#linking) - [Provenance and citation](#provenance-and-citation) -- [Confidence](#confidence) - - [Confidence against source standing](#confidence-against-source-standing) - [What does not belong here](#what-does-not-belong-here) <!-- /wikitool:toc --> @@ -267,60 +265,13 @@ Every claim is either traceable to a raw file or explicitly marked as not. If no raw file or existing page backs an answer, say so explicitly rather than synthesizing one - and never file the synthesized version back into the wiki. -## Confidence - -`confidence_base` is the undecayed score set when a page's content is last confirmed; -`confidence` is *derived* from it by `tools/wikitool confidence decay` and must never be -edited directly. - -Re-assess a page with `tools/wikitool touch --page "<Title>" --confidence-base <value>`. - -What the number *means* - the base score, what raises it and by how much, and how to hedge in -prose below a threshold - is a rubric rather than a mechanism, so it is -[kb/CONVENTIONS.md § Confidence rubric](CONVENTIONS.md#confidence-rubric)'s. - -### Confidence against source standing - -The rubric already asks for an authority judgment ("+0.1 for official documentation, +0.05 for a -reputable secondary source") without anywhere to record it - source count lives in `sources:`, -recency in `modified:`, agreement is readable from the prose itself, but the authority term is -thought, applied, and forgotten; the next person re-derives it from scratch. `raw/CONTRACT.md`'s -capture fields (`fidelity`, `authority`) make it a recorded fact instead: `lint` -compares a page's `confidence_base` against the weakest capture standing of its cited sources and -reports one when the page claims more than its sources can carry. - -**A ceiling, not a formula.** `confidence_base` stays hand-set (see above); this only bounds it. -The reasons are the same two, together: `confidence` is already derived from `confidence_base` by -one mechanism (`confidence decay`), and a second derivation of the same number would leave two -disagreeing answers to "what should this be" - and authority is a ceiling a page may fall under by -independent verification, never a determinant a formula could compute outright. The check is -therefore advisory, in the same class as `unsharded_collections`: it names a mismatch and asks a -human to look, it never fails a build. - -The ceiling is stack vocabulary (`fidelity`/`authority` are - see `raw/CONTRACT.md`), not an -instance setting; an instance that disagrees with a specific finding overrides its judgment on -that one page, rather than reconfiguring the rubric: - -| worst `authority` among a page's sources | ceiling | worst `fidelity` among a page's sources | ceiling | -|---|---|---|---| -| `normative` | (none) | `verbatim` | (none) | -| `reporting` | 0.8 | `published` | (none) | -| `opinion` | 0.6 | `secondhand` | 0.7 | -| `unknown` | no finding | `nontextual` | 0.7 | -| | | `unknown` | no finding | - -The effective ceiling is the minimum of both columns. `unknown` never triggers a finding on its -own axis: a backfilled "we don't know" is not a claim about the source, and firing on it would -report every page citing a source captured before these two fields existed at once, which is -noise, not a finding. - ## What does not belong here - Raw source material - it stays immutable under `raw/`. - Type definitions, frontmatter contracts, or templates - those live in `types/`. - Procedures for operating the tooling - those live in `instructions/`. - **Anything an instance would have to rewrite for itself** - language, naming forms, tone, - relationship labels, the confidence rubric. Those are `kb/CONVENTIONS.md`'s, and a sentence + relationship labels, the hedging rule. Those are `kb/CONVENTIONS.md`'s, and a sentence of that kind here is a sentence the stack ships over the instance's own answer. - Rules that apply to only one collection - those belong in that collection's `COLLECTION.md`. diff --git a/kb/CONVENTIONS.md b/kb/CONVENTIONS.md index 76ea15a..ba03aec 100644 --- a/kb/CONVENTIONS.md +++ b/kb/CONVENTIONS.md @@ -34,7 +34,7 @@ those regions and nothing else. Nothing matches on this text. - [Naming](#naming) - [Tone](#tone) - [Relationship labels](#relationship-labels) -- [Confidence rubric](#confidence-rubric) +- [Hedging](#hedging) - [Keeping this file honest](#keeping-this-file-honest) <!-- /wikitool:toc --> @@ -109,20 +109,21 @@ destination in each `kb/<name>/COLLECTION.md`'s `outbound:` block. `- **depends- is what a German page carries, and that is deliberate: the label is an identifier, so translating it would make the graph's semantics depend on the prose again. -## Confidence rubric +## Hedging -`confidence_base` is set by hand and `confidence` is derived from it - that mechanism is the -contract's. What the number *means* is this instance's: +No number stands in for this any more (Gitea #60): hedge according to what the sources actually +carry, not against a threshold. -Base score for a single source is 0.5, adjusted by: +- `provenance: general` with no `sources:` is general knowledge, and prose says so plainly - + "im Allgemeinen", "üblicherweise" - rather than dressing it up as a sourced claim. +- A page citing an `opinion`-standing source does not speak in the tone of one citing a + `normative` one (`raw/CONTRACT.md`'s `authority` axis names the difference). Weigh the + weakest source actually relied on for a given sentence, not the page's strongest citation. +- Where the sources disagree or only partly support a claim, say so in prose - + "möglicherweise", "laut X, aber Y widerspricht" - instead of picking a side silently. -- **+0.2 per supporting source** (max +0.6) -- **+0.2** if confirmed <30 days ago, **+0.1** if <90 days -- **+0.1** for official documentation, **+0.05** for a reputable secondary source -- **+0.1** if multiple independent sources agree - -In prose, hedge according to the score: below 0.6 write "möglicherweise"/"kann"; below 0.4 -write "unsicher"/"unbestätigt". +This is `SOUL.md`'s existing standard ("Was nicht belegt ist, ist nicht gewusst, nur vermutet - +und wird auch so benannt"), applied to `kb/` without a number competing next to it. ## Keeping this file honest diff --git a/kb/CONVENTIONS.md.template b/kb/CONVENTIONS.md.template index 7156652..a6825a0 100644 --- a/kb/CONVENTIONS.md.template +++ b/kb/CONVENTIONS.md.template @@ -74,14 +74,16 @@ Bad: {the same sentence written the way it must not be.} from [instructions/link-taxonomy.md](../instructions/link-taxonomy.md) and authorised per destination in each `kb/<name>/COLLECTION.md`'s `outbound:` block. -## Confidence rubric +## Hedging -`confidence_base` is set by hand and `confidence` is derived from it - that mechanism is the -contract's. What the number *means* is this instance's: +Hedge according to what the sources actually carry, not against a numeric score. -{the base score, what raises it, and by how much} +{How this instance signals general knowledge (`provenance: general`, no `sources:`) versus a +sourced claim, in the KB language.} -{How to hedge in prose at a low score, in the KB language.} +{How this instance's prose distinguishes a claim resting on a `normative`-standing source +(`raw/CONTRACT.md`'s `authority` axis) from one resting on `opinion`, and how it signals +disagreement between sources.} ## Keeping this file honest diff --git a/kb/concepts/architectures/Consolidation Tiers.md b/kb/concepts/architectures/Consolidation Tiers.md index d1fabf0..0394823 100644 --- a/kb/concepts/architectures/Consolidation Tiers.md +++ b/kb/concepts/architectures/Consolidation Tiers.md @@ -12,8 +12,6 @@ related: - composition: Procedural Memory - exemplifies: LLM Wiki Pattern sources: [Source - LLM Wiki v2] -confidence: 0.95 -confidence_base: 0.95 provenance: sourced summary: Hierarchische Speicherarchitektur, die Informationen durch zunehmend verdichtete Schichten vom Working Memory bis zum Semantic und Procedural Memory befördert. --- diff --git a/kb/concepts/architectures/Context Isolation.md b/kb/concepts/architectures/Context Isolation.md index 1a9833b..ca1e571 100644 --- a/kb/concepts/architectures/Context Isolation.md +++ b/kb/concepts/architectures/Context Isolation.md @@ -9,8 +9,6 @@ related: - see-also: Scale Ceiling - see-also: Workflow Extraction sources: [Source - Copilot Skill Restructure Instructions, Source - Conversation - AGENTS.md Skill Restructuring Session 2026-08-04] -confidence: 0.80 -confidence_base: 0.80 provenance: sourced summary: Grundsatz, für jede Aufgabe nur den jeweils benötigten Kontext zu laden --- diff --git a/kb/concepts/architectures/Cross-platform Agent Skills.md b/kb/concepts/architectures/Cross-platform Agent Skills.md index 386900e..8c481e5 100644 --- a/kb/concepts/architectures/Cross-platform Agent Skills.md +++ b/kb/concepts/architectures/Cross-platform Agent Skills.md @@ -10,8 +10,6 @@ related: - see-also: Scale Ceiling - see-also: Workflow Extraction sources: [Source - Copilot Skill Restructure Instructions, Source - Conversation - AGENTS.md Skill Restructuring Session 2026-08-04] -confidence: 0.90 -confidence_base: 0.90 provenance: sourced summary: Architektur fuer Agent-Skills, die ueber mehrere LLM-Werkzeuge hinweg funktionieren; in Chemenu selbst am 2026-08-04 umgesetzt und ueberprueft --- diff --git a/kb/concepts/architectures/Episodic Memory.md b/kb/concepts/architectures/Episodic Memory.md index 087304c..be2b14b 100644 --- a/kb/concepts/architectures/Episodic Memory.md +++ b/kb/concepts/architectures/Episodic Memory.md @@ -7,8 +7,6 @@ modified: 2026-08-29 related: - part-of: Consolidation Tiers sources: [] -confidence: 0.50 -confidence_base: 0.50 provenance: general summary: Speicherschicht für verdichtete Sitzungszusammenfassungen und Befunde; Brücke zwischen rohem Working Memory und langlebigem Semantic Memory. --- diff --git a/kb/concepts/architectures/Hybrid Search.md b/kb/concepts/architectures/Hybrid Search.md index 8701fca..f97a87e 100644 --- a/kb/concepts/architectures/Hybrid Search.md +++ b/kb/concepts/architectures/Hybrid Search.md @@ -12,8 +12,6 @@ related: - rests-on: Knowledge Graph - see-also: Graph Traversal sources: [Source - LLM Wiki v2] -confidence: 0.90 -confidence_base: 0.90 provenance: sourced summary: Multimodale Suche, die BM25-Schlüsselwortabgleich, Vektor-Embeddings und Graph Traversal verbindet, um Wissensabruf im Wiki skalierbar zu machen. --- diff --git a/kb/concepts/architectures/Implementation Spectrum.md b/kb/concepts/architectures/Implementation Spectrum.md index c032d63..ec94c82 100644 --- a/kb/concepts/architectures/Implementation Spectrum.md +++ b/kb/concepts/architectures/Implementation Spectrum.md @@ -13,8 +13,6 @@ related: - composition: Privacy and Governance - composition: Crystallization sources: [Source - LLM Wiki v2] -confidence: 0.90 -confidence_base: 0.90 provenance: sourced summary: Modularer Einführungspfad für die Funktionen von LLM Wiki v2, vom minimal tragfähigen Wiki bis zur vollen Umsetzung mit Automatisierung und Governance. --- diff --git a/kb/concepts/architectures/Knowledge Graph.md b/kb/concepts/architectures/Knowledge Graph.md index 2eb7bbb..713750c 100644 --- a/kb/concepts/architectures/Knowledge Graph.md +++ b/kb/concepts/architectures/Knowledge Graph.md @@ -11,8 +11,6 @@ related: - composition: Typed Relationships - see-also: Graph Traversal sources: [Source - LLM Wiki v2] -confidence: 0.90 -confidence_base: 0.90 provenance: sourced summary: Typisierte Schicht aus Entities und Beziehungen über den Wiki-Seiten, die eine reichere Wissensdarstellung und graphbasierte Abfragen ermöglicht. --- diff --git a/kb/concepts/architectures/LLM Wiki Pattern.md b/kb/concepts/architectures/LLM Wiki Pattern.md index 0a4715e..4540349 100644 --- a/kb/concepts/architectures/LLM Wiki Pattern.md +++ b/kb/concepts/architectures/LLM Wiki Pattern.md @@ -12,8 +12,6 @@ related: - composition: Memory Lifecycle - see-also: Memex sources: [Source - LLM Wiki Pattern, Source - LLM Wiki v2] -confidence: 0.95 -confidence_base: 0.95 provenance: sourced summary: Methodik für persönliches Wissensmanagement, bei der ein LLM aus Rohquellen ein dauerhaftes Wiki aufbaut - Wissen wird kompiliert statt per RAG neu hergeleitet. --- diff --git a/kb/concepts/architectures/MCP-Leseserver.md b/kb/concepts/architectures/MCP-Leseserver.md index 0771338..3707cdb 100644 --- a/kb/concepts/architectures/MCP-Leseserver.md +++ b/kb/concepts/architectures/MCP-Leseserver.md @@ -11,8 +11,6 @@ related: - see-also: Iteration and Cost Limits - see-also: Chemenu sources: [Source - MCP Read Server Implementation Session 2026-09-02] -confidence: 0.50 -confidence_base: 0.50 provenance: sourced summary: 'Zweiter Konsument von chemenu ueber MCP: search/types/describe_type/lint/status auf chemenu.api.Corpus, strukturell ohne Schreibpfad, jede Antwort trage einen Commit-Stempel.' --- diff --git a/kb/concepts/architectures/Memory Lifecycle.md b/kb/concepts/architectures/Memory Lifecycle.md index 85a2822..569973e 100644 --- a/kb/concepts/architectures/Memory Lifecycle.md +++ b/kb/concepts/architectures/Memory Lifecycle.md @@ -12,8 +12,6 @@ related: - see-also: Forgetting - enables: Knowledge Compounding sources: [Source - LLM Wiki v2] -confidence: 0.95 -confidence_base: 0.95 provenance: sourced summary: Architektur des Wissenslebenszyklus mit Confidence Scoring, Supersession, Forgetting und Consolidation Tiers zur Pflege von Fakten über die Zeit. --- diff --git a/kb/concepts/architectures/OKF Compatibility.md b/kb/concepts/architectures/OKF Compatibility.md index 2a84ed4..1920291 100644 --- a/kb/concepts/architectures/OKF Compatibility.md +++ b/kb/concepts/architectures/OKF Compatibility.md @@ -7,8 +7,6 @@ modified: 2026-08-29 related: - see-also: awesome-llm-wiki sources: [Source - LLM Improvements Codex Analysis] -confidence: 0.80 -confidence_base: 0.80 provenance: sourced summary: Optionale Kompatibilität zum Open Knowledge Framework als Export- und Prüfmodus, ohne das interne Modell zu ersetzen --- diff --git a/kb/concepts/architectures/Optional Instance Context File.md b/kb/concepts/architectures/Optional Instance Context File.md index 86da709..9101a47 100644 --- a/kb/concepts/architectures/Optional Instance Context File.md +++ b/kb/concepts/architectures/Optional Instance Context File.md @@ -10,8 +10,6 @@ related: - mechanism: wikitool - operates-on: Chemenu sources: [Source - Conversation - ENVIRONMENT.md as an Optional Third Session-Level File Session 2026-08-31] -confidence: 0.50 -confidence_base: 0.50 provenance: sourced summary: 'Muster fuer eine Datei, die eine Instanz ueber ihre Umgebung informiert, ohne Betriebsvoraussetzung zu sein: Health-Check meldet ohne zu scheitern, pro Checkout statt pro Repo' --- diff --git a/kb/concepts/architectures/Personalization Plane.md b/kb/concepts/architectures/Personalization Plane.md index 16d1c9c..144c600 100644 --- a/kb/concepts/architectures/Personalization Plane.md +++ b/kb/concepts/architectures/Personalization Plane.md @@ -9,8 +9,6 @@ related: - operates-on: Chemenu - see-also: Optional Instance Context File sources: [Source - Conversation - ENVIRONMENT.md as an Optional Third Session-Level File Session 2026-08-31] -confidence: 0.50 -confidence_base: 0.50 provenance: sourced summary: 'Schicht fuer Instanz-Identitaet: USER.md/SOUL.md werden als Template ausgeliefert, im Setup-Interview woertlich befuellt und vom doctor-Check auf fehlend wie unbefuellt geprueft' --- diff --git a/kb/concepts/architectures/Procedural Memory.md b/kb/concepts/architectures/Procedural Memory.md index 7cd55e5..0eeeb78 100644 --- a/kb/concepts/architectures/Procedural Memory.md +++ b/kb/concepts/architectures/Procedural Memory.md @@ -7,8 +7,6 @@ modified: 2026-08-29 related: - part-of: Consolidation Tiers sources: [] -confidence: 0.50 -confidence_base: 0.50 provenance: general summary: Langlebigste Speicherschicht für Abläufe, Muster, bewährte Vorgehensweisen und Rezepte, gewonnen aus wiederholten semantischen Beobachtungen. --- diff --git a/kb/concepts/architectures/RAG.md b/kb/concepts/architectures/RAG.md index ce232ee..4e7150e 100644 --- a/kb/concepts/architectures/RAG.md +++ b/kb/concepts/architectures/RAG.md @@ -9,8 +9,6 @@ related: - see-also: NotebookLM - see-also: ChatGPT sources: [Source - LLM Wiki Pattern] -confidence: 0.90 -confidence_base: 0.90 provenance: sourced summary: Architekturmuster, bei dem LLMs die Generierung um Dokumente aus einer Wissensbasis anreichern. --- diff --git a/kb/concepts/architectures/Scale Ceiling.md b/kb/concepts/architectures/Scale Ceiling.md index 4793f18..b2f5b4a 100644 --- a/kb/concepts/architectures/Scale Ceiling.md +++ b/kb/concepts/architectures/Scale Ceiling.md @@ -9,8 +9,6 @@ related: - see-also: Cross-platform Agent Skills - see-also: Context Isolation sources: [Source - Copilot Skill Restructure Instructions] -confidence: 0.80 -confidence_base: 0.80 provenance: sourced summary: Punkt, ab dem Wiki-Ansätze mit einem einzigen Kontext qualitativ abfallen --- diff --git a/kb/concepts/architectures/Semantic Memory.md b/kb/concepts/architectures/Semantic Memory.md index 90582e4..d34dc57 100644 --- a/kb/concepts/architectures/Semantic Memory.md +++ b/kb/concepts/architectures/Semantic Memory.md @@ -7,8 +7,6 @@ modified: 2026-08-29 related: - part-of: Consolidation Tiers sources: [] -confidence: 0.50 -confidence_base: 0.50 provenance: general summary: Langlebige Schicht für sitzungsübergreifend verdichtete Fakten aus mehreren Episoden, mit höherer Konfidenz und stärkerer Verdichtung als episodische Erinnerungen. --- diff --git a/kb/concepts/architectures/Three-Layer Architecture.md b/kb/concepts/architectures/Three-Layer Architecture.md index 7170117..6c670af 100644 --- a/kb/concepts/architectures/Three-Layer Architecture.md +++ b/kb/concepts/architectures/Three-Layer Architecture.md @@ -10,8 +10,6 @@ related: - composition: Memory Lifecycle - composition: Knowledge Graph sources: [Source - LLM Wiki Pattern, Source - LLM Wiki v2] -confidence: 0.95 -confidence_base: 0.95 provenance: sourced summary: "Strukturmodell des LLM-Wiki-Musters mit drei Schichten: unver\xE4nderliche Rohquellen, vom LLM gepflegtes Wiki und Schemakonfiguration, die Knowledge Compounding tr\xE4gt." --- diff --git a/kb/concepts/architectures/Token Economics.md b/kb/concepts/architectures/Token Economics.md index 2b58589..53d1a4b 100644 --- a/kb/concepts/architectures/Token Economics.md +++ b/kb/concepts/architectures/Token Economics.md @@ -9,8 +9,6 @@ related: - see-also: Scale Ceiling - see-also: Context Isolation sources: [Source - Copilot Skill Restructure Instructions, Source - Conversation - AGENTS.md Skill Restructuring Session 2026-08-04] -confidence: 0.60 -confidence_base: 0.60 provenance: mixed summary: Kosten- und Effizienzüberlegungen zum Tokenverbrauch von LLMs - die genannten Werte 5-8x/61%/100% sind unbestätigt, keine gesicherten Fakten --- diff --git a/kb/concepts/architectures/Working Memory.md b/kb/concepts/architectures/Working Memory.md index 0593b04..67e3802 100644 --- a/kb/concepts/architectures/Working Memory.md +++ b/kb/concepts/architectures/Working Memory.md @@ -7,8 +7,6 @@ modified: 2026-08-29 related: - part-of: Consolidation Tiers sources: [] -confidence: 0.50 -confidence_base: 0.50 provenance: general summary: Kurzlebige Speicherschicht für jüngste Beobachtungen und vorläufige Befunde vor der Verdichtung; niedrigste Konfidenz, keine Verdichtung, wird zum Sitzungsende erneuert. --- diff --git a/kb/concepts/decisions/Delete Rather Than Anonymize.md b/kb/concepts/decisions/Delete Rather Than Anonymize.md index 75a0e7a..1b7b34a 100644 --- a/kb/concepts/decisions/Delete Rather Than Anonymize.md +++ b/kb/concepts/decisions/Delete Rather Than Anonymize.md @@ -7,8 +7,6 @@ modified: 2026-09-01 related: - operates-on: Chemenu sources: ['Source - Public Release, Corpus Purge and History Squash Session 2026-09-01', Source - Private-Instance Merge Correction and Issue 30 Session 2026-09-01] -confidence: 0.70 -confidence_base: 0.70 provenance: sourced summary: 'Private Korpusinhalte per Loeschung entfernen statt zu anonymisieren: ein Seitentitel ist der einzige Identifier eines Wikis, Umbenennen ist die volle page-lifecycle-Prozedur je Seite, Loeschen ist ein unterstuetztes Kommando.' --- diff --git a/kb/concepts/decisions/Denylist over Allowlist.md b/kb/concepts/decisions/Denylist over Allowlist.md index e592ebe..b71178c 100644 --- a/kb/concepts/decisions/Denylist over Allowlist.md +++ b/kb/concepts/decisions/Denylist over Allowlist.md @@ -9,8 +9,6 @@ related: - grounds: Write-Once Frontmatter Fields - see-also: Green Suite Blind Spot sources: [Source - Conversation - Write-Once Frontmatter Fields and touch --set Session 2026-08-31, Source - Conversation - Two Round-Trip Defects Found by an Ingest Session 2026-08-31] -confidence: 0.70 -confidence_base: 0.70 provenance: sourced summary: Entscheidung, schreibbare Felder als Schema minus kurzer Sperrliste zu bestimmen statt als gepflegte Positivliste, weil die Positivliste eine zweite Kopie des Schemas waere --- diff --git a/kb/concepts/decisions/Diff-Reviewable Agent Edits.md b/kb/concepts/decisions/Diff-Reviewable Agent Edits.md index b949f79..49779a6 100644 --- a/kb/concepts/decisions/Diff-Reviewable Agent Edits.md +++ b/kb/concepts/decisions/Diff-Reviewable Agent Edits.md @@ -9,8 +9,6 @@ related: - operates-on: Claude Code - derived-from: Write-Once Frontmatter Fields sources: [Source - Conversation - Auto Mode and Tool Choice Session 2026-08-31] -confidence: 0.70 -confidence_base: 0.70 provenance: sourced summary: Entscheidung, Dateiaenderungen ueber Edit/Write statt ueber Shell-Heredocs zu fahren, weil nur das erste eine pruefbare Diff hinterlaesst --- diff --git a/kb/concepts/decisions/Dual Licensing by File Plan.md b/kb/concepts/decisions/Dual Licensing by File Plan.md index 5661eb8..f386ff4 100644 --- a/kb/concepts/decisions/Dual Licensing by File Plan.md +++ b/kb/concepts/decisions/Dual Licensing by File Plan.md @@ -7,8 +7,6 @@ modified: 2026-09-01 related: - operates-on: Chemenu sources: ['Source - Public Release, Corpus Purge and History Squash Session 2026-09-01'] -confidence: 0.70 -confidence_base: 0.70 provenance: sourced summary: Ein Repo mit Code- und Inhaltsanteil erhaelt zwei Lizenzen; die Grenze zwischen ihnen ist kein zweiter, gepflegter Pfadkatalog, sondern der ohnehin vorhandene Dateiplan des Distributionswerkzeugs. --- diff --git a/kb/concepts/decisions/Issue Label Scheme.md b/kb/concepts/decisions/Issue Label Scheme.md index d1ab830..fda673c 100644 --- a/kb/concepts/decisions/Issue Label Scheme.md +++ b/kb/concepts/decisions/Issue Label Scheme.md @@ -10,8 +10,6 @@ related: - see-also: KB Stack Versioning - see-also: Detect-Repair Asymmetry sources: [Source - Conversation - Issue Triage Labels and TODO Retirement Session 2026-08-31, Source - Gitea Issue 41 - Issue Management and Label Scheme 2026-09-02, Source - Gitea Issues 62-63 - status-incoming Label Introduction 2026-09-04] -confidence: 0.70 -confidence_base: 0.85 provenance: sourced summary: 'Pflicht-Labelschema fuer das Gitea-Board: vier Achsen (area/kind/prio/size) plus seit 2026-09-04 drei optionale status/-Flags, darunter status/incoming fuer unausgearbeitete Stubs, die die Vier-Achsen-Pflicht aussetzen statt sie zu ergaenzen; die Regel liegt in instructions/dev/, weil sie keine ausgelieferte Instanz erreichen darf' --- diff --git a/kb/concepts/decisions/KB Stack Versioning.md b/kb/concepts/decisions/KB Stack Versioning.md index 02c15be..89b3b27 100644 --- a/kb/concepts/decisions/KB Stack Versioning.md +++ b/kb/concepts/decisions/KB Stack Versioning.md @@ -9,8 +9,6 @@ related: - see-also: Issue Label Scheme - see-also: CI Integration sources: [Source - Conversation - Versioning CI-CD and Content Migration Session 2026-08-30, Source - Conversation - Issue Triage Labels and TODO Retirement Session 2026-08-31, Source - Version Part Nomenclature and Breaking Change Gate Session 2026-09-02] -confidence: 0.70 -confidence_base: 0.70 provenance: sourced summary: 'Semantische Versionierung des Wiki-Stacks: VERSION beschreibt die Maschinerie, Kompatibilitaet (Drop-in-Ersatz) und Inhaltsmigration sind seit 2.5.0 getrennte, unabhaengig geprueft Fragen' --- diff --git a/kb/concepts/decisions/Structural Enforcement over Documented Rule.md b/kb/concepts/decisions/Structural Enforcement over Documented Rule.md index 91dd81d..3c90463 100644 --- a/kb/concepts/decisions/Structural Enforcement over Documented Rule.md +++ b/kb/concepts/decisions/Structural Enforcement over Documented Rule.md @@ -10,8 +10,6 @@ related: - see-also: Iteration and Cost Limits - see-also: Mass-Update Gate sources: [Source - Conversation - Hardening the Test Suite Against Silent Environment Dependencies Session 2026-08-31] -confidence: 0.50 -confidence_base: 0.50 provenance: sourced summary: Entscheidung, eine wiederkehrende Fehlerregel in die Ausfuehrung einzubauen statt sie aufzuschreiben - Rangfolge erzwingen vor melden vor erinnern, belegt an einer Regel, die gelesen wurde und nicht wirkte --- diff --git a/kb/concepts/patterns/Audit Trail.md b/kb/concepts/patterns/Audit Trail.md index 8295eba..3c0395e 100644 --- a/kb/concepts/patterns/Audit Trail.md +++ b/kb/concepts/patterns/Audit Trail.md @@ -12,8 +12,6 @@ related: - evidenced-by: Source - LLM Wiki v2 - enables: Supersession sources: [] -confidence: 0.50 -confidence_base: 0.50 provenance: general summary: Unveränderliches chronologisches Log aller Wiki-Operationen (Ingest, Bearbeitung, Löschung, Abfrage) mit Zeitstempel, Akteur, Ziel und Änderungsbeschreibung. --- diff --git a/kb/concepts/patterns/BM25.md b/kb/concepts/patterns/BM25.md index 16d2b45..a6ceb11 100644 --- a/kb/concepts/patterns/BM25.md +++ b/kb/concepts/patterns/BM25.md @@ -9,8 +9,6 @@ related: - see-also: LLM Wiki Pattern - evidenced-by: Source - LLM Wiki v2 sources: [] -confidence: 0.50 -confidence_base: 0.50 provenance: general summary: Schlüsselwortbasiertes Retrieval-Verfahren, das über Termfrequenz, inverse Dokumentfrequenz und Stemming exakte oder teilweise Übereinstimmungen findet. --- diff --git a/kb/concepts/patterns/Command Round-Trip Integrity.md b/kb/concepts/patterns/Command Round-Trip Integrity.md index 3bbd8c5..cd9003a 100644 --- a/kb/concepts/patterns/Command Round-Trip Integrity.md +++ b/kb/concepts/patterns/Command Round-Trip Integrity.md @@ -11,8 +11,6 @@ related: - see-also: Green Suite Blind Spot - contrasts: Write-Once Frontmatter Fields sources: [Source - Conversation - Two Round-Trip Defects Found by an Ingest Session 2026-08-31] -confidence: 0.70 -confidence_base: 0.70 provenance: sourced summary: Anforderung, dass zwei Befehle auf derselben Datei in jeder Reihenfolge zusammenpassen und jeder erzeugte Zustand einen Gegenbefehl hat - 2026-08-31 in wikitool zweimal verletzt --- diff --git a/kb/concepts/patterns/Confidence Scoring.md b/kb/concepts/patterns/Confidence Scoring.md index 121cd44..10314c5 100644 --- a/kb/concepts/patterns/Confidence Scoring.md +++ b/kb/concepts/patterns/Confidence Scoring.md @@ -8,8 +8,6 @@ related: - part-of: Memory Lifecycle - exemplifies: LLM Wiki Pattern sources: [Source - LLM Wiki v2] -confidence: 0.95 -confidence_base: 0.95 provenance: sourced summary: Mechanismus, der faktischen Aussagen quantitative Werte nach Quellenzahl, Aktualität, Qualität und Bestätigung zuweist, um gut gestütztes Wissen zu erkennen. --- diff --git a/kb/concepts/patterns/Contradiction Resolution.md b/kb/concepts/patterns/Contradiction Resolution.md index 8cb45d6..f30c719 100644 --- a/kb/concepts/patterns/Contradiction Resolution.md +++ b/kb/concepts/patterns/Contradiction Resolution.md @@ -12,8 +12,6 @@ related: - evidenced-by: Source - LLM Wiki v2 - enables: Supersession sources: [] -confidence: 0.50 -confidence_base: 0.50 provenance: general summary: Automatisches Erkennen und Auflösen widersprüchlicher Aussagen anhand von Konfidenz, Aktualität und Autorität der Quelle. --- diff --git a/kb/concepts/patterns/Entity Extraction.md b/kb/concepts/patterns/Entity Extraction.md index 0017867..0eaffb2 100644 --- a/kb/concepts/patterns/Entity Extraction.md +++ b/kb/concepts/patterns/Entity Extraction.md @@ -9,8 +9,6 @@ related: - enables: Knowledge Graph - evidenced-by: Source - LLM Wiki v2 sources: [] -confidence: 0.50 -confidence_base: 0.50 provenance: general summary: Erkennen und Strukturieren von Entities (Personen, Projekte, Bibliotheken, Concepts, Dateien, Entscheidungen, Systeme, Werkzeuge) samt typspezifischer Attribute aus Rohquellen. --- diff --git a/kb/concepts/patterns/Filter on Ingest.md b/kb/concepts/patterns/Filter on Ingest.md index 6d7da5c..143dea4 100644 --- a/kb/concepts/patterns/Filter on Ingest.md +++ b/kb/concepts/patterns/Filter on Ingest.md @@ -8,8 +8,6 @@ related: - exemplifies: Implementation Spectrum - part-of: Privacy and Governance sources: [] -confidence: 0.50 -confidence_base: 0.50 provenance: general summary: Automatisches Erkennen und Entfernen sensibler Daten (API-Schlüssel, Token, Credentials, personenbezogene Daten) vor der Aufnahme ins Wiki, per Regex und ML-Erkennung. --- diff --git a/kb/concepts/patterns/Forgetting.md b/kb/concepts/patterns/Forgetting.md index 1af55ba..83aff25 100644 --- a/kb/concepts/patterns/Forgetting.md +++ b/kb/concepts/patterns/Forgetting.md @@ -9,8 +9,6 @@ related: - see-also: Confidence Scoring - rests-on: Consolidation Tiers sources: [Source - LLM Wiki v2] -confidence: 0.90 -confidence_base: 0.90 provenance: sourced summary: Muster zur Wissensbindung, das selten abgerufene Fakten schrittweise zurückstuft, modelliert nach der Ebbinghausschen Vergessenskurve. --- diff --git a/kb/concepts/patterns/Graph Traversal.md b/kb/concepts/patterns/Graph Traversal.md index 90c2f4c..8c59e1d 100644 --- a/kb/concepts/patterns/Graph Traversal.md +++ b/kb/concepts/patterns/Graph Traversal.md @@ -10,8 +10,6 @@ related: - exemplifies: LLM Wiki Pattern - evidenced-by: Source - LLM Wiki v2 sources: [] -confidence: 0.50 -confidence_base: 0.50 provenance: general summary: Verfahren, verbundene Entities im Wissensgraphen über typisierte Beziehungen (uses, depends-on, contradicts, caused) zu finden und strukturelle Fragen zu beantworten. --- diff --git a/kb/concepts/patterns/Mesh Sync.md b/kb/concepts/patterns/Mesh Sync.md index 19f66da..5a87863 100644 --- a/kb/concepts/patterns/Mesh Sync.md +++ b/kb/concepts/patterns/Mesh Sync.md @@ -9,8 +9,6 @@ related: - part-of: Multi-Agent Collaboration - evidenced-by: Source - LLM Wiki v2 sources: [] -confidence: 0.50 -confidence_base: 0.50 provenance: general summary: Abgleichsmechanismus, der Beobachtungen paralleler Agenten in ein gemeinsames Wiki überführt; Last-Write-Wins mit Konflikterkennung und manuellem Eingriff. --- diff --git a/kb/concepts/patterns/Quality Scoring.md b/kb/concepts/patterns/Quality Scoring.md index a2bc092..4a95f9a 100644 --- a/kb/concepts/patterns/Quality Scoring.md +++ b/kb/concepts/patterns/Quality Scoring.md @@ -10,8 +10,6 @@ related: - see-also: Memory Lifecycle - evidenced-by: Source - LLM Wiki v2 sources: [] -confidence: 0.50 -confidence_base: 0.50 provenance: general summary: Quantitative Bewertung aller vom LLM geschriebenen Inhalte nach struktureller Qualität, Vollständigkeit der Quellenangaben, Konsistenz mit dem Wiki und Themenabdeckung. --- diff --git a/kb/concepts/patterns/Reciprocal Rank Fusion.md b/kb/concepts/patterns/Reciprocal Rank Fusion.md index 3fd4d80..f4b8f6e 100644 --- a/kb/concepts/patterns/Reciprocal Rank Fusion.md +++ b/kb/concepts/patterns/Reciprocal Rank Fusion.md @@ -9,8 +9,6 @@ related: - exemplifies: LLM Wiki Pattern - evidenced-by: Source - LLM Wiki v2 sources: [] -confidence: 0.50 -confidence_base: 0.50 provenance: general summary: Verfahren, das Ergebnislisten mehrerer Suchmodalitäten zu einem gemeinsamen Ranking verbindet, ohne Gewichte zwischen den Modalitäten justieren zu müssen. --- diff --git a/kb/concepts/patterns/Self-Healing.md b/kb/concepts/patterns/Self-Healing.md index 2bbf800..9997d50 100644 --- a/kb/concepts/patterns/Self-Healing.md +++ b/kb/concepts/patterns/Self-Healing.md @@ -12,8 +12,6 @@ related: - see-also: Detect-Repair Asymmetry - see-also: Command Round-Trip Integrity sources: [] -confidence: 0.50 -confidence_base: 0.50 provenance: general summary: "Automatisches Beheben von M\xE4ngeln, die beim Lint auffallen: verwaiste Seiten, veraltete Aussagen, kaputte Links und Formatverst\xF6\xDFe." --- diff --git a/kb/concepts/patterns/Shared vs Private.md b/kb/concepts/patterns/Shared vs Private.md index 4517f58..aba2312 100644 --- a/kb/concepts/patterns/Shared vs Private.md +++ b/kb/concepts/patterns/Shared vs Private.md @@ -7,8 +7,6 @@ modified: 2026-08-29 related: - part-of: Multi-Agent Collaboration sources: [] -confidence: 0.50 -confidence_base: 0.50 provenance: general summary: Abgrenzung persönlicher Beobachtungen (privat) von Team- und Projektwissen (geteilt), mit Regeln zum Hochstufen geprüften Wissens. --- diff --git a/kb/concepts/patterns/Typed Relationships.md b/kb/concepts/patterns/Typed Relationships.md index 11ad183..d087709 100644 --- a/kb/concepts/patterns/Typed Relationships.md +++ b/kb/concepts/patterns/Typed Relationships.md @@ -9,8 +9,6 @@ related: - part-of: Knowledge Graph - evidenced-by: Source - LLM Wiki v2 sources: [] -confidence: 0.50 -confidence_base: 0.50 provenance: general summary: Verwendung semantisch aussagekräftiger Beziehungstypen (uses, depends-on, contradicts, caused, fixed, supersedes, replaces) statt undifferenzierter Wikilinks. --- diff --git a/kb/concepts/patterns/Vector Search.md b/kb/concepts/patterns/Vector Search.md index 572b014..a0b6ce1 100644 --- a/kb/concepts/patterns/Vector Search.md +++ b/kb/concepts/patterns/Vector Search.md @@ -9,8 +9,6 @@ related: - exemplifies: LLM Wiki Pattern - evidenced-by: Source - LLM Wiki v2 sources: [] -confidence: 0.50 -confidence_base: 0.50 provenance: general summary: Semantische Ähnlichkeitssuche über Embedding-Vektoren, die inhaltlich verwandte Seiten auch ohne exakte Schlüsselwortübereinstimmung findet. --- diff --git a/kb/concepts/patterns/Work Coordination.md b/kb/concepts/patterns/Work Coordination.md index 97e86b7..5b5942e 100644 --- a/kb/concepts/patterns/Work Coordination.md +++ b/kb/concepts/patterns/Work Coordination.md @@ -8,8 +8,6 @@ related: - exemplifies: Implementation Spectrum - part-of: Multi-Agent Collaboration sources: [] -confidence: 0.50 -confidence_base: 0.50 provenance: general summary: Leichtgewichtige Erfassung von Aufgabenstatus (in Arbeit, blockiert, erledigt, prüfbedürftig) und Zuweisung, um Doppelarbeit bei mehreren Agenten zu vermeiden. --- diff --git a/kb/concepts/problems/Ambient Environment Dependency.md b/kb/concepts/problems/Ambient Environment Dependency.md index 6a7e406..f652fd4 100644 --- a/kb/concepts/problems/Ambient Environment Dependency.md +++ b/kb/concepts/problems/Ambient Environment Dependency.md @@ -10,8 +10,6 @@ related: - exemplifies: wikitool - exemplifies: Gitea Actions sources: [Source - Conversation - Hardening the Test Suite Against Silent Environment Dependencies Session 2026-08-31] -confidence: 0.50 -confidence_base: 0.50 provenance: sourced summary: 'Fehlerklasse, in der ein Test gruen ist, weil die Maschine zufaellig passt statt weil der Code stimmt - abgegrenzt gegen den Green Suite Blind Spot, belegt an vier Faellen unter Gitea-Issue #8' --- diff --git a/kb/concepts/problems/Detect-Repair Asymmetry.md b/kb/concepts/problems/Detect-Repair Asymmetry.md index bd432aa..08ec4ef 100644 --- a/kb/concepts/problems/Detect-Repair Asymmetry.md +++ b/kb/concepts/problems/Detect-Repair Asymmetry.md @@ -12,8 +12,6 @@ related: - contrasts: Write-Once Frontmatter Fields - contrasts: Command Round-Trip Integrity sources: [Source - Conversation - Comma Bug Budget Refund and Lint Report Path Session 2026-08-31, Source - Conversation - Issue Triage Labels and TODO Retirement Session 2026-08-31, Source - Conversation - Write-Once Frontmatter Fields and touch --set Session 2026-08-31, Source - Conversation - Two Round-Trip Defects Found by an Ingest Session 2026-08-31] -confidence: 0.50 -confidence_base: 0.50 provenance: sourced summary: Werkzeugluecke, in der ein Check einen Defekt zuverlaessig meldet, aber kein Befehl ihn behebt - womit die Handeditierung der einzige verbleibende Ausweg ist --- diff --git a/kb/concepts/problems/Green Suite Blind Spot.md b/kb/concepts/problems/Green Suite Blind Spot.md index 45a9283..7031a33 100644 --- a/kb/concepts/problems/Green Suite Blind Spot.md +++ b/kb/concepts/problems/Green Suite Blind Spot.md @@ -11,8 +11,6 @@ related: - see-also: Ambient Environment Dependency - rests-on: Lint Workflow sources: [Source - Conversation - Two Round-Trip Defects Found by an Ingest Session 2026-08-31, Source - Conversation - Hardening the Test Suite Against Silent Environment Dependencies Session 2026-08-31] -confidence: 0.70 -confidence_base: 0.70 provenance: sourced summary: Defekt, der eine vollstaendig gruene Testsuite ueberlebt, weil nie ein Test das richtige Verhalten behauptet hat - belegt an drei prio/1-2-Defekten (Round-Trip, Zitat-Notation-als-Code, Zitat-Limit) --- diff --git a/kb/concepts/problems/Naming Convention Conflict.md b/kb/concepts/problems/Naming Convention Conflict.md index 862e4e8..10abdac 100644 --- a/kb/concepts/problems/Naming Convention Conflict.md +++ b/kb/concepts/problems/Naming Convention Conflict.md @@ -7,8 +7,6 @@ modified: 2026-08-29 related: - operates-on: AGENTS.md sources: [Source - LLM Improvements Codex Analysis] -confidence: 0.80 -confidence_base: 0.80 provenance: sourced summary: Widerspruch zwischen README.md (kebab-case) und AGENTS.md (lesbar mit Leerzeichen), der zu Drift bei der Validierung führt --- diff --git a/kb/concepts/problems/Write-Once Frontmatter Fields.md b/kb/concepts/problems/Write-Once Frontmatter Fields.md index 8e0c036..7111ba4 100644 --- a/kb/concepts/problems/Write-Once Frontmatter Fields.md +++ b/kb/concepts/problems/Write-Once Frontmatter Fields.md @@ -11,8 +11,6 @@ related: - see-also: Diff-Reviewable Agent Edits - see-also: Command Round-Trip Integrity sources: [Source - Conversation - Write-Once Frontmatter Fields and touch --set Session 2026-08-31, Source - Conversation - Two Round-Trip Defects Found by an Ingest Session 2026-08-31] -confidence: 0.70 -confidence_base: 0.70 provenance: sourced summary: Defektklasse, in der ein Feld nur beim Anlegen der Seite schreibbar ist und danach unerreichbar bleibt, weil kein Mutationsbefehl es kennt und new nicht idempotent ist --- diff --git a/kb/concepts/protocols/CPPC.md b/kb/concepts/protocols/CPPC.md index 0b75256..ff73db7 100644 --- a/kb/concepts/protocols/CPPC.md +++ b/kb/concepts/protocols/CPPC.md @@ -9,8 +9,6 @@ related: - mechanism: amd-pstate - see-also: Kernel PM Governors sources: [Source - AMD Powermanagement CPU] -confidence: 0.95 -confidence_base: 0.95 provenance: sourced summary: Hardwareschnittstelle Collaborative Processor Performance Control für feingranulares CPU-Power-Management zwischen Betriebssystem und AMD-Prozessor. --- diff --git a/kb/concepts/protocols/Modbus.md b/kb/concepts/protocols/Modbus.md index ccecf99..677ffca 100644 --- a/kb/concepts/protocols/Modbus.md +++ b/kb/concepts/protocols/Modbus.md @@ -9,8 +9,6 @@ related: - see-also: ha-core - see-also: Home Assistant sources: [] -confidence: 0.90 -confidence_base: 0.90 provenance: general summary: Industrielles Kommunikationsprotokoll von 1979 zur Anbindung speicherprogrammierbarer Steuerungen und Geräte über serielle oder TCP-Netze. --- diff --git a/kb/concepts/protocols/SSD TRIM.md b/kb/concepts/protocols/SSD TRIM.md index b04fd0b..72cd32c 100644 --- a/kb/concepts/protocols/SSD TRIM.md +++ b/kb/concepts/protocols/SSD TRIM.md @@ -8,8 +8,6 @@ related: - see-also: LVM - see-also: Arch Linux sources: [Source - Arch Linux Cheat Sheet] -confidence: 0.90 -confidence_base: 0.90 provenance: sourced summary: Datenträgerbefehl, mit dem SSDs ungenutzte Blöcke zurückgewinnen - für gleichbleibende Leistung und längere Lebensdauer. --- diff --git a/kb/concepts/workflows/Anti-Cramming Heuristic.md b/kb/concepts/workflows/Anti-Cramming Heuristic.md index 566173b..b715836 100644 --- a/kb/concepts/workflows/Anti-Cramming Heuristic.md +++ b/kb/concepts/workflows/Anti-Cramming Heuristic.md @@ -8,8 +8,6 @@ related: - part-of: Content Quality Control - see-also: Iteration and Cost Limits sources: [Source - LLM Improvements Sonnet Analysis, Source - LLM Improvements Production Agent Gaps 2026] -confidence: 0.80 -confidence_base: 0.80 provenance: sourced summary: "Regel gegen \xFCberladene Seiten: ab dem dritten Absatz zu einem Unterthema eine eigene Seite anlegen" --- diff --git a/kb/concepts/workflows/Bulk Operations.md b/kb/concepts/workflows/Bulk Operations.md index 2398ae0..57a70c6 100644 --- a/kb/concepts/workflows/Bulk Operations.md +++ b/kb/concepts/workflows/Bulk Operations.md @@ -9,8 +9,6 @@ related: - exemplifies: Implementation Spectrum - see-also: Mass-Update Gate sources: [] -confidence: 0.50 -confidence_base: 0.50 provenance: general summary: Umkehrbare, protokollierte Operationen zum Massenlöschen, Exportieren, Zusammenführen oder Archivieren von Wiki-Inhalten, mit Freigabepflicht und Undo. --- diff --git a/kb/concepts/workflows/CI Integration.md b/kb/concepts/workflows/CI Integration.md index 54c0e91..eaa14fb 100644 --- a/kb/concepts/workflows/CI Integration.md +++ b/kb/concepts/workflows/CI Integration.md @@ -8,8 +8,6 @@ related: - invokes: wikitool - operates-on: Gitea Actions sources: [Source - LLM Improvements Codex Analysis, Source - Conversation - Nightly Drift-Check Workflow and doctor's Bootstrap Gap Session 2026-08-31] -confidence: 0.80 -confidence_base: 0.80 provenance: sourced summary: 'CI/CD-Hooks vor dem Publish: ci.yml (Push/PR, Stack-Pfade, seit 1.8.1 mit Coverage-Messung ohne Schwelle) und nightly.yml (Zeitplan, schliesst die paths-ignore-Luecke fuer Content-Drift; schedule-Ausloesung seit 2026-09-01 bestaetigt) setzen Quality Gates durch' --- diff --git a/kb/concepts/workflows/Checkpoint Audit.md b/kb/concepts/workflows/Checkpoint Audit.md index ea1d8ce..c5e53aa 100644 --- a/kb/concepts/workflows/Checkpoint Audit.md +++ b/kb/concepts/workflows/Checkpoint Audit.md @@ -8,8 +8,6 @@ related: - see-also: Semantic Lint Automation - part-of: Content Quality Control sources: [Source - LLM Improvements Sonnet Analysis] -confidence: 0.80 -confidence_base: 0.80 provenance: sourced summary: "Regelm\xE4\xDFiger Qualit\xE4tsrhythmus: Index und Backlinks alle 15 Eintr\xE4ge neu aufbauen, auf 0 neue Artikel pr\xFCfen, die 3 meistge\xE4nderten erneut lesen" --- diff --git a/kb/concepts/workflows/Claude Code Auto Mode.md b/kb/concepts/workflows/Claude Code Auto Mode.md index 4c22b83..028312a 100644 --- a/kb/concepts/workflows/Claude Code Auto Mode.md +++ b/kb/concepts/workflows/Claude Code Auto Mode.md @@ -8,8 +8,6 @@ related: - mechanism: Claude Code - contradicts: Diff-Reviewable Agent Edits sources: [Source - Conversation - Auto Mode and Tool Choice Session 2026-08-31] -confidence: 0.50 -confidence_base: 0.50 provenance: sourced summary: 'auto-Berechtigungsmodus von Claude Code: ein Klassifikator genehmigt Aktionen vor der Ausfuehrung statt nachzufragen; die Beschreibung stammt weit ueberwiegend aus zweiter Hand ueber einen Doku-Subagenten' --- diff --git a/kb/concepts/workflows/Content Quality Control.md b/kb/concepts/workflows/Content Quality Control.md index b2824a6..eb0a939 100644 --- a/kb/concepts/workflows/Content Quality Control.md +++ b/kb/concepts/workflows/Content Quality Control.md @@ -9,8 +9,6 @@ related: - composition: Stub Threshold - composition: Split Threshold sources: [Source - LLM Improvements Sonnet Analysis] -confidence: 0.80 -confidence_base: 0.80 provenance: sourced summary: "Regeln und Schwellenwerte f\xFCr die Seitenqualit\xE4t: Mindestumfang f\xFCr Stubs, Aufteilungsschwellen und Zielwerte f\xFCr die Zeilenzahl" --- diff --git a/kb/concepts/workflows/Crystallization.md b/kb/concepts/workflows/Crystallization.md index 2859ed2..3c84913 100644 --- a/kb/concepts/workflows/Crystallization.md +++ b/kb/concepts/workflows/Crystallization.md @@ -9,8 +9,6 @@ related: - part-of: Memory Lifecycle - rests-on: Event-Driven Automation sources: [Source - LLM Wiki v2] -confidence: 0.85 -confidence_base: 0.85 provenance: sourced summary: Verdichten abgeschlossener Erkundungen, Debugging-Sitzungen und Recherchen zu strukturierten Wiki-Auszügen als eigenständige Wissensquellen. --- diff --git a/kb/concepts/workflows/Event-Driven Automation.md b/kb/concepts/workflows/Event-Driven Automation.md index 3c311b6..3f914d7 100644 --- a/kb/concepts/workflows/Event-Driven Automation.md +++ b/kb/concepts/workflows/Event-Driven Automation.md @@ -9,8 +9,6 @@ related: - enables: Memory Lifecycle - rests-on: Hooks sources: [Source - LLM Wiki v2] -confidence: 0.95 -confidence_base: 0.95 provenance: sourced summary: Muster, das automatische Auslöser an Wiki-Lebenszyklusereignisse hängt, um manuellen Pflegeaufwand und das Risiko der Verwahrlosung zu senken. --- diff --git a/kb/concepts/workflows/Hooks.md b/kb/concepts/workflows/Hooks.md index 1dc5c5e..066dd53 100644 --- a/kb/concepts/workflows/Hooks.md +++ b/kb/concepts/workflows/Hooks.md @@ -8,8 +8,6 @@ related: - grounds: Event-Driven Automation - exemplifies: LLM Wiki Pattern sources: [Source - LLM Wiki v2] -confidence: 0.85 -confidence_base: 0.85 provenance: sourced summary: Mechanismus von Event-Listenern, der bei Wiki-Lebenszyklusereignissen wie Quellen-Ingest, Seitenänderung und Sitzungsende automatisch Aktionen auslöst. --- diff --git a/kb/concepts/workflows/Index Scaling.md b/kb/concepts/workflows/Index Scaling.md index 4eb347f..e1bc448 100644 --- a/kb/concepts/workflows/Index Scaling.md +++ b/kb/concepts/workflows/Index Scaling.md @@ -10,8 +10,6 @@ related: - operationalized-from: pascalandy schema - see-also: Iteration and Cost Limits sources: [Source - LLM Improvements Sonnet Analysis, Source - LLM Improvements Production Agent Gaps 2026] -confidence: 0.80 -confidence_base: 0.80 provenance: sourced summary: "Skalierungsregeln f\xFCr Indexseiten: Tabellenabschnitte ab 50 Eintr\xE4gen teilen, ab 200 Seiten _meta/topic-map.md anlegen" --- diff --git a/kb/concepts/workflows/Iteration and Cost Limits.md b/kb/concepts/workflows/Iteration and Cost Limits.md index ac99b50..0a16769 100644 --- a/kb/concepts/workflows/Iteration and Cost Limits.md +++ b/kb/concepts/workflows/Iteration and Cost Limits.md @@ -12,8 +12,6 @@ related: - exemplifies: Structural Enforcement over Documented Rule - see-also: MCP-Leseserver sources: [Source - LLM Improvements Production Agent Gaps 2026, Source - Conversation - Comma Bug Budget Refund and Lint Report Path Session 2026-08-31, Source - Conversation - Gate Counting and Measured Calibration Session 2026-08-31, Source - MCP Read Server Implementation Session 2026-09-02] -confidence: 0.88 -confidence_base: 0.88 provenance: sourced summary: Im Code durchgesetzte Obergrenze von 60 wikitool-Aufrufen je Session, Loop-Breaker bei 3 identischen Wiederholungen, Slot-Erstattung, ein gemessenes Kalibrierungsband, und Retrieval sowie der MCP-Leseserver bleiben ausgenommen --- diff --git a/kb/concepts/workflows/KB Migration.md b/kb/concepts/workflows/KB Migration.md index 709d7fe..e348d33 100644 --- a/kb/concepts/workflows/KB Migration.md +++ b/kb/concepts/workflows/KB Migration.md @@ -10,8 +10,6 @@ related: - see-also: Mass-Update Gate - see-also: Iteration and Cost Limits sources: [Source - Conversation - Versioning CI-CD and Content Migration Session 2026-08-30] -confidence: 0.70 -confidence_base: 0.70 provenance: sourced summary: Migration des KB-Inhalts entlang einer geordneten Versionskette; abgegrenzt gegen offene Instanz-Aktionen, die in den doctor-Check gehoeren statt in die Kette --- diff --git a/kb/concepts/workflows/Knowledge Compounding.md b/kb/concepts/workflows/Knowledge Compounding.md index d7ccc8a..d1fe9b2 100644 --- a/kb/concepts/workflows/Knowledge Compounding.md +++ b/kb/concepts/workflows/Knowledge Compounding.md @@ -9,8 +9,6 @@ related: - see-also: Memex - see-also: Tolkien Gateway sources: [Source - LLM Wiki Pattern] -confidence: 0.90 -confidence_base: 0.90 provenance: sourced summary: Effekt, bei dem Wissen im Wiki an Wert gewinnt, weil jede neue Quelle an bestehende, untereinander verwiesene Seiten anknüpft und sie ergänzt. --- diff --git a/kb/concepts/workflows/Lint Workflow.md b/kb/concepts/workflows/Lint Workflow.md index 3c0cec6..20f3d7d 100644 --- a/kb/concepts/workflows/Lint Workflow.md +++ b/kb/concepts/workflows/Lint Workflow.md @@ -10,8 +10,6 @@ related: - grounds: Detect-Repair Asymmetry - grounds: Green Suite Blind Spot sources: [Source - Conversation - Comma Bug Budget Refund and Lint Report Path Session 2026-08-31] -confidence: 0.50 -confidence_base: 0.50 provenance: sourced summary: Deterministischer Health-Check rund um wikitool lint; seit 1.7.2 maskiert es Code vor dem Notation-Match und zaehlt Zitat-Bloecke statt Zeilen --- diff --git a/kb/concepts/workflows/Mass-Update Gate.md b/kb/concepts/workflows/Mass-Update Gate.md index d06af9b..b5dc158 100644 --- a/kb/concepts/workflows/Mass-Update Gate.md +++ b/kb/concepts/workflows/Mass-Update Gate.md @@ -13,8 +13,6 @@ related: - see-also: Publish-Remote Gate - see-also: MCP-Leseserver sources: [Source - LLM Improvements Sonnet Analysis, Source - LLM Improvements Production Agent Gaps 2026, Source - Conversation - Comma Bug Budget Refund and Lint Report Path Session 2026-08-31, Source - Conversation - Gate Counting and Measured Calibration Session 2026-08-31, Source - LLM Improvements Codex Analysis] -confidence: 0.88 -confidence_base: 0.88 provenance: sourced summary: 'Mass-Update Gate: publish endet mit 42 (Freigabe durch den Menschen noetig) ab 10 gezaehlten Dateien; generierte Dateien und work/ werden committet\, aber seit 1.5.0 nicht gezaehlt; freigegeben per --confirm <token>' --- diff --git a/kb/concepts/workflows/Multi-Agent Collaboration.md b/kb/concepts/workflows/Multi-Agent Collaboration.md index c24de65..c2945b7 100644 --- a/kb/concepts/workflows/Multi-Agent Collaboration.md +++ b/kb/concepts/workflows/Multi-Agent Collaboration.md @@ -11,8 +11,6 @@ related: - composition: Shared vs Private - composition: Work Coordination sources: [Source - LLM Wiki v2] -confidence: 0.85 -confidence_base: 0.85 provenance: sourced summary: Wissensmanagement mit mehreren Agenten; erweitert das LLM-Wiki-Muster um Mesh Sync, die Trennung von geteiltem und privatem Wissen und leichtgewichtige Arbeitskoordination. --- diff --git a/kb/concepts/workflows/Privacy and Governance.md b/kb/concepts/workflows/Privacy and Governance.md index a49a411..6830ae2 100644 --- a/kb/concepts/workflows/Privacy and Governance.md +++ b/kb/concepts/workflows/Privacy and Governance.md @@ -10,8 +10,6 @@ related: - see-also: Audit Trail - see-also: Bulk Operations sources: [Source - LLM Wiki v2] -confidence: 0.90 -confidence_base: 0.90 provenance: sourced summary: Rahmenwerk zur Absicherung von Wiki-Inhalten über Datenfilterung beim Ingest, Audit-Trail-Protokollierung und umkehrbare Massenoperationen. --- diff --git a/kb/concepts/workflows/Publish-Remote Gate.md b/kb/concepts/workflows/Publish-Remote Gate.md index 519cec9..0874454 100644 --- a/kb/concepts/workflows/Publish-Remote Gate.md +++ b/kb/concepts/workflows/Publish-Remote Gate.md @@ -9,8 +9,6 @@ related: - operates-on: Chemenu - see-also: MCP-Leseserver sources: [Source - Publish-Remote Gate and Issue Triage Session 2026-09-01, Source - Private-Instance Merge Correction and Issue 30 Session 2026-09-01, Source - MCP Read Server Implementation Session 2026-09-02] -confidence: 0.70 -confidence_base: 0.70 provenance: sourced summary: 'Drittes, im Code durchgesetztes Gate: publish bricht mit Exit 42 ab, wenn die aufgeloeste Push-URL nicht in einer optionalen, gitignoreten Allowlist steht; doctor benennt seit 2026-09-02 den Gate-Zustand statt nur die Dateiexistenz' --- diff --git a/kb/concepts/workflows/Quality and Self-Correction.md b/kb/concepts/workflows/Quality and Self-Correction.md index 4540896..bdae613 100644 --- a/kb/concepts/workflows/Quality and Self-Correction.md +++ b/kb/concepts/workflows/Quality and Self-Correction.md @@ -10,8 +10,6 @@ related: - rests-on: Event-Driven Automation - rests-on: Confidence Scoring sources: [Source - LLM Wiki v2] -confidence: 0.90 -confidence_base: 0.90 provenance: sourced summary: Automatische Qualitätssicherung für Wikis mit Inhaltsbewertung, Selbstheilung und Widerspruchserkennung. --- diff --git a/kb/concepts/workflows/Semantic Lint Automation.md b/kb/concepts/workflows/Semantic Lint Automation.md index 0e7541d..e83ecbf 100644 --- a/kb/concepts/workflows/Semantic Lint Automation.md +++ b/kb/concepts/workflows/Semantic Lint Automation.md @@ -7,8 +7,6 @@ modified: 2026-08-29 related: - mechanism: wikitool sources: [Source - LLM Improvements Codex Analysis, Source - LLM Improvements Sonnet Analysis] -confidence: 0.80 -confidence_base: 0.80 provenance: sourced summary: "Maschinelle Heuristiken zur Priorisierung der semantischen Pr\xFCfung: veraltete Aussagen, hohe \xC4nderungsdichte und schwache Verlinkung" --- diff --git a/kb/concepts/workflows/Session Orientation.md b/kb/concepts/workflows/Session Orientation.md index 8aced32..2c343f5 100644 --- a/kb/concepts/workflows/Session Orientation.md +++ b/kb/concepts/workflows/Session Orientation.md @@ -7,8 +7,6 @@ modified: 2026-08-29 related: - mechanism: wikitool sources: [Source - LLM Improvements Codex Analysis, Source - LLM Improvements Sonnet Analysis] -confidence: 0.80 -confidence_base: 0.80 provenance: sourced summary: Verbindliche Vorabprüfung, die vor Query- und Update-Operationen einen Kontextbericht erzeugt (Index, jüngste Logs, Umfang) --- diff --git a/kb/concepts/workflows/Split Merge Reclassify.md b/kb/concepts/workflows/Split Merge Reclassify.md index 97b063c..0da393e 100644 --- a/kb/concepts/workflows/Split Merge Reclassify.md +++ b/kb/concepts/workflows/Split Merge Reclassify.md @@ -7,8 +7,6 @@ modified: 2026-08-29 related: - mechanism: wikitool sources: [Source - LLM Improvements Codex Analysis] -confidence: 0.80 -confidence_base: 0.80 provenance: sourced summary: Eigene Befehle zum Teilen, Zusammenführen und Umklassifizieren von Seiten, mit automatischer Korrektur von Links und Frontmatter --- diff --git a/kb/concepts/workflows/Split Threshold.md b/kb/concepts/workflows/Split Threshold.md index 5f6bc35..56dd807 100644 --- a/kb/concepts/workflows/Split Threshold.md +++ b/kb/concepts/workflows/Split Threshold.md @@ -9,8 +9,6 @@ related: - see-also: Stub Threshold - see-also: Index Scaling sources: [Source - LLM Improvements Sonnet Analysis] -confidence: 0.80 -confidence_base: 0.80 provenance: sourced summary: "Maximale Seitengr\xF6\xDFe, ab der eine Aufteilung empfohlen wird (Farza: >120-150 Zeilen, Pascalandy: 200 Zeilen)" --- diff --git a/kb/concepts/workflows/Stub Threshold.md b/kb/concepts/workflows/Stub Threshold.md index e4e0a94..25694a1 100644 --- a/kb/concepts/workflows/Stub Threshold.md +++ b/kb/concepts/workflows/Stub Threshold.md @@ -9,8 +9,6 @@ related: - see-also: Split Threshold - see-also: Semantic Lint Automation sources: [Source - LLM Improvements Sonnet Analysis, Source - LLM Wiki v2] -confidence: 0.80 -confidence_base: 0.80 provenance: sourced summary: "Mindestumfang, ab dem eine Wiki-Seite nicht mehr als Stub gilt (Farza: \u22653 S\xE4tze oder 15 Zeilen)" --- diff --git a/kb/concepts/workflows/Supersession.md b/kb/concepts/workflows/Supersession.md index ca71ebf..615acbb 100644 --- a/kb/concepts/workflows/Supersession.md +++ b/kb/concepts/workflows/Supersession.md @@ -10,8 +10,6 @@ related: - see-also: Knowledge Graph - exemplifies: LLM Wiki Pattern sources: [Source - LLM Wiki v2] -confidence: 0.95 -confidence_base: 0.95 provenance: sourced summary: Ablösen alten Wissens durch neue, widersprechende Information; gibt dem Wiki eine Versionierung mit ausdrücklicher Verknüpfung und Erhalt der Historie. --- diff --git a/kb/concepts/workflows/User Management.md b/kb/concepts/workflows/User Management.md index d598f3f..d2b46f2 100644 --- a/kb/concepts/workflows/User Management.md +++ b/kb/concepts/workflows/User Management.md @@ -10,8 +10,6 @@ related: - see-also: Aura - see-also: makepkg sources: [Source - Arch Linux Cheat Sheet] -confidence: 0.95 -confidence_base: 0.95 provenance: sourced summary: Linux-Ablauf zum Anlegen, Ändern, Überwachen und Löschen von Benutzerkonten mit useradd, usermod und userdel, samt Gruppenverwaltung und sudoers-Konfiguration. --- diff --git a/kb/concepts/workflows/Workflow Extraction.md b/kb/concepts/workflows/Workflow Extraction.md index 2354c3f..df86efc 100644 --- a/kb/concepts/workflows/Workflow Extraction.md +++ b/kb/concepts/workflows/Workflow Extraction.md @@ -9,8 +9,6 @@ related: - see-also: Context Isolation - see-also: Token Economics sources: [Source - Copilot Skill Restructure Instructions] -confidence: 0.80 -confidence_base: 0.80 provenance: sourced summary: Herauslösen von Workflow-Abschnitten aus monolithischer Dokumentation --- diff --git a/kb/concepts/workflows/Workflow Orchestration.md b/kb/concepts/workflows/Workflow Orchestration.md index 0bc7085..cf311e8 100644 --- a/kb/concepts/workflows/Workflow Orchestration.md +++ b/kb/concepts/workflows/Workflow Orchestration.md @@ -7,8 +7,6 @@ modified: 2026-08-29 related: - mechanism: wikitool sources: [Source - LLM Improvements Codex Analysis] -confidence: 0.80 -confidence_base: 0.80 provenance: sourced summary: Orchestrierte Einzelbefehle für vollständige Operationen (ingest run, lint run, update run) mit Dry-Run-Vorschau vor dem Schreiben --- diff --git a/kb/entities/people/Andrej Karpathy.md b/kb/entities/people/Andrej Karpathy.md index 6341ef6..f609808 100644 --- a/kb/entities/people/Andrej Karpathy.md +++ b/kb/entities/people/Andrej Karpathy.md @@ -9,8 +9,6 @@ related: - authored: Three-Layer Architecture - authored: Knowledge Compounding sources: [Source - LLM Wiki v2, Source - LLM Wiki Pattern] -confidence: 0.95 -confidence_base: 0.95 provenance: sourced summary: KI-Forscher, der das grundlegende LLM-Wiki-Muster geprägt und damit die Methodik der Wissenskompilierung etabliert hat. --- diff --git a/kb/entities/people/E3DC GmbH.md b/kb/entities/people/E3DC GmbH.md index 0adc133..895e7d2 100644 --- a/kb/entities/people/E3DC GmbH.md +++ b/kb/entities/people/E3DC GmbH.md @@ -7,8 +7,6 @@ modified: 2026-08-29 related: - owns: E3DC sources: [] -confidence: 0.50 -confidence_base: 0.50 provenance: general summary: Deutscher Hersteller von Energiespeichersystemen für Wohn- und Gewerbegebäude. --- diff --git a/kb/entities/people/Rohit Gupta.md b/kb/entities/people/Rohit Gupta.md index ab5b028..4443d44 100644 --- a/kb/entities/people/Rohit Gupta.md +++ b/kb/entities/people/Rohit Gupta.md @@ -9,8 +9,6 @@ related: - owns: Agent Memory - see-also: Andrej Karpathy sources: [Source - LLM Wiki v2] -confidence: 0.95 -confidence_base: 0.95 provenance: sourced summary: Urheber von agentmemory, einem persistenten Speicher für KI-Coding-Agenten mit über 20000 GitHub-Stars. --- diff --git a/kb/entities/people/Vannevar Bush.md b/kb/entities/people/Vannevar Bush.md index 969e74f..be0d666 100644 --- a/kb/entities/people/Vannevar Bush.md +++ b/kb/entities/people/Vannevar Bush.md @@ -8,8 +8,6 @@ related: - see-also: LLM Wiki Pattern - authored: Memex sources: [Source - LLM Wiki Pattern] -confidence: 0.90 -confidence_base: 0.90 provenance: sourced summary: "Amerikanischer Ingenieur und Wissenschaftsadministrator, der 1945 das Memex-Konzept ersann: ein pers\xF6nlicher, kuratierter Wissensspeicher mit assoziativen Dokumentpfaden." --- diff --git a/kb/entities/projects/BCDModule.md b/kb/entities/projects/BCDModule.md index 48fad84..0ab7766 100644 --- a/kb/entities/projects/BCDModule.md +++ b/kb/entities/projects/BCDModule.md @@ -7,8 +7,6 @@ modified: 2026-08-29 related: - uses: Go sources: [] -confidence: 0.50 -confidence_base: 0.50 provenance: general summary: Go-Modul, das die Entscheidungslogik für die Batterieladung umsetzt. --- diff --git a/kb/entities/projects/Chemenu.md b/kb/entities/projects/Chemenu.md index 02aac7f..ace5276 100644 --- a/kb/entities/projects/Chemenu.md +++ b/kb/entities/projects/Chemenu.md @@ -15,8 +15,6 @@ related: - uses: wikitool - composition: AGENTS.md sources: [Source - Copilot Skill Restructure Instructions, Source - Conversation - AGENTS.md Skill Restructuring Session 2026-08-04, Source - Conversation - Versioning CI-CD and Content Migration Session 2026-08-30, Source - Conversation - Comma Bug Budget Refund and Lint Report Path Session 2026-08-31, Source - Conversation - Issue Triage Labels and TODO Retirement Session 2026-08-31, Source - Conversation - Write-Once Frontmatter Fields and touch --set Session 2026-08-31, Source - Conversation - Gate Counting and Measured Calibration Session 2026-08-31, Source - Conversation - Two Round-Trip Defects Found by an Ingest Session 2026-08-31, Source - Conversation - Hardening the Test Suite Against Silent Environment Dependencies Session 2026-08-31, 'Source - Public Release, Corpus Purge and History Squash Session 2026-09-01', Source - Publish-Remote Gate and Issue Triage Session 2026-09-01, Source - Private-Instance Merge Correction and Issue 30 Session 2026-09-01, Source - MCP Read Server Implementation Session 2026-09-02, Source - Version Part Nomenclature and Breaking Change Gate Session 2026-09-02, Source - Gitea Issue 41 - Issue Management and Label Scheme 2026-09-02] -confidence: 0.90 -confidence_base: 0.90 provenance: mixed summary: Deterministischer Wissenskompiler (raw/ -> kb/); seit 2.0.0 unter dem Namen Chemenu; Issue 26 zur Versionsstellen-Nomenklatur in 2.5.0 geschlossen --- diff --git a/kb/entities/projects/andybalholm-edl.md b/kb/entities/projects/andybalholm-edl.md index 4cfa9b7..4ad5311 100644 --- a/kb/entities/projects/andybalholm-edl.md +++ b/kb/entities/projects/andybalholm-edl.md @@ -7,8 +7,6 @@ modified: 2026-08-29 related: - uses: Go sources: [] -confidence: 0.50 -confidence_base: 0.50 provenance: general summary: Go-basierte EDL-Bibliothek für die Kommunikation mit eingebetteten Geräten. --- diff --git a/kb/entities/projects/goresponsiveness.md b/kb/entities/projects/goresponsiveness.md index 7dd3568..38a2e5b 100644 --- a/kb/entities/projects/goresponsiveness.md +++ b/kb/entities/projects/goresponsiveness.md @@ -7,8 +7,6 @@ modified: 2026-08-29 related: - uses: Go sources: [] -confidence: 0.50 -confidence_base: 0.50 provenance: general summary: Go-Werkzeug zur Messung von Anwendungsleistung und Responsiveness. --- diff --git a/kb/entities/projects/ha-core.md b/kb/entities/projects/ha-core.md index 359e42d..61b15e5 100644 --- a/kb/entities/projects/ha-core.md +++ b/kb/entities/projects/ha-core.md @@ -12,8 +12,6 @@ related: - uses: Go - uses: Python sources: [] -confidence: 0.70 -confidence_base: 0.70 provenance: general summary: Kern-Integrationsbibliothek für Home-Assistant-E3DC-Systeme; stellt die E3DC-Kommunikationsprotokolle und den Home-Assistant-Integrationscode bereit. --- diff --git a/kb/entities/projects/hacs-e3dc.md b/kb/entities/projects/hacs-e3dc.md index 0094286..0ace58d 100644 --- a/kb/entities/projects/hacs-e3dc.md +++ b/kb/entities/projects/hacs-e3dc.md @@ -9,8 +9,6 @@ related: - uses: Go - depends-on: ha-core sources: [] -confidence: 0.50 -confidence_base: 0.50 provenance: general summary: Home Assistant Custom Component zur Überwachung von E3DC-Energiesystemen. --- diff --git a/kb/entities/projects/hacs-integration-blueprint.md b/kb/entities/projects/hacs-integration-blueprint.md index 35e3cb8..0c40950 100644 --- a/kb/entities/projects/hacs-integration-blueprint.md +++ b/kb/entities/projects/hacs-integration-blueprint.md @@ -7,8 +7,6 @@ modified: 2026-08-29 related: - depends-on: ha-core sources: [] -confidence: 0.50 -confidence_base: 0.50 provenance: general summary: Home-Assistant-Automatisierungs-Blueprints für das E3DC-Energiemanagement. --- diff --git a/kb/entities/projects/llm-wiki-skills.md b/kb/entities/projects/llm-wiki-skills.md index 0119733..aad66f0 100644 --- a/kb/entities/projects/llm-wiki-skills.md +++ b/kb/entities/projects/llm-wiki-skills.md @@ -7,8 +7,6 @@ modified: 2026-08-29 related: - see-also: Chemenu sources: [Source - Copilot Skill Restructure Instructions] -confidence: 0.80 -confidence_base: 0.80 provenance: sourced summary: Plattformübergreifende LLM-Wiki-Skills von yugasun --- diff --git a/kb/entities/projects/plugnburn-edl.md b/kb/entities/projects/plugnburn-edl.md index 7a2c1b9..cc2ed81 100644 --- a/kb/entities/projects/plugnburn-edl.md +++ b/kb/entities/projects/plugnburn-edl.md @@ -8,8 +8,6 @@ related: - uses: Go - uses: gdeploy sources: [] -confidence: 0.50 -confidence_base: 0.50 provenance: general summary: Go-basiertes EDL-Werkzeug zur Firmware-Programmierung eingebetteter Geräte. --- diff --git a/kb/entities/projects/wiki-skills-vanillaflava.md b/kb/entities/projects/wiki-skills-vanillaflava.md index 5840d39..2afb543 100644 --- a/kb/entities/projects/wiki-skills-vanillaflava.md +++ b/kb/entities/projects/wiki-skills-vanillaflava.md @@ -8,8 +8,6 @@ related: - see-also: Chemenu - see-also: llm-wiki-skills sources: [Source - Copilot Skill Restructure Instructions] -confidence: 0.80 -confidence_base: 0.80 provenance: sourced summary: Referenzimplementierung plattformübergreifender LLM-Wiki-Skills --- diff --git a/kb/entities/projects/wiki-skills.md b/kb/entities/projects/wiki-skills.md index 5cce4ba..fce07aa 100644 --- a/kb/entities/projects/wiki-skills.md +++ b/kb/entities/projects/wiki-skills.md @@ -9,8 +9,6 @@ related: - see-also: wiki-skills-vanillaflava - see-also: llm-wiki-skills sources: [Source - Copilot Skill Restructure Instructions, Source - Conversation - AGENTS.md Skill Restructuring Session 2026-08-04] -confidence: 0.80 -confidence_base: 0.80 provenance: sourced summary: Umsetzung der Wiki-Skills für Claude Code von kfchou --- diff --git a/kb/entities/systems/AGENTS.md.md b/kb/entities/systems/AGENTS.md.md index dba0ca3..3082b4c 100644 --- a/kb/entities/systems/AGENTS.md.md +++ b/kb/entities/systems/AGENTS.md.md @@ -11,8 +11,6 @@ related: - evidenced-by: Source - LLM Improvements Sonnet Analysis - owns: ENVIRONMENT.md sources: [Source - LLM Improvements Codex Analysis, Source - LLM Improvements Sonnet Analysis, Source - LLM Wiki v2, Source - Copilot Skill Restructure Instructions, Source - Conversation - AGENTS.md Skill Restructuring Session 2026-08-04, Source - LLM Improvements Production Agent Gaps 2026, Source - Conversation - Comma Bug Budget Refund and Lint Report Path Session 2026-08-31, Source - Conversation - Hardening the Test Suite Against Silent Environment Dependencies Session 2026-08-31, Source - Conversation - ENVIRONMENT.md as an Optional Third Session-Level File Session 2026-08-31] -confidence: 0.90 -confidence_base: 0.90 provenance: sourced summary: 'Kontrollebene des LLM-Wikis: Invarianten, Dateibenennung, Routing, Gates, seit 1.1.0 Personalization und seit 1.8.0 der Environment-Abschnitt; erreicht Claude Code nur ueber den Import in CLAUDE.md' --- diff --git a/kb/entities/systems/CLAUDE.md.md b/kb/entities/systems/CLAUDE.md.md index cc62f5f..a6d021e 100644 --- a/kb/entities/systems/CLAUDE.md.md +++ b/kb/entities/systems/CLAUDE.md.md @@ -8,8 +8,6 @@ related: - depends-on: AGENTS.md - uses: ENVIRONMENT.md sources: [Source - Conversation - ENVIRONMENT.md as an Optional Third Session-Level File Session 2026-08-31] -confidence: 0.50 -confidence_base: 0.50 provenance: sourced summary: Datei, die Claude Code beim Sitzungsstart laedt; importiert AGENTS.md/USER.md/SOUL.md und seit 1.8.0 ENVIRONMENT.md, traegt selbst keine Regeln --- diff --git a/kb/entities/systems/E3DC.md b/kb/entities/systems/E3DC.md index a086795..cb0abca 100644 --- a/kb/entities/systems/E3DC.md +++ b/kb/entities/systems/E3DC.md @@ -9,8 +9,6 @@ related: - required-by: hacs-e3dc - implements: Modbus sources: [] -confidence: 0.80 -confidence_base: 0.80 provenance: general summary: Deutsches Heim-Energiespeichersystem, das Solarstromerzeugung mit Lithium-Batteriespeicher für Eigenverbrauch und Notstrom verbindet. --- diff --git a/kb/entities/systems/ENVIRONMENT.md.md b/kb/entities/systems/ENVIRONMENT.md.md index aad0250..90291cf 100644 --- a/kb/entities/systems/ENVIRONMENT.md.md +++ b/kb/entities/systems/ENVIRONMENT.md.md @@ -8,8 +8,6 @@ related: - implements: Optional Instance Context File - rests-on: Personalization Plane sources: [Source - Conversation - ENVIRONMENT.md as an Optional Third Session-Level File Session 2026-08-31] -confidence: 0.50 -confidence_base: 0.50 provenance: sourced summary: 'Optionale, gitignorete Root-Datei: Harness, Skills, MCP-Server, Connectoren, Remotes und CI-Ort eines Checkouts; doctor meldet sie, scheitert aber nie an ihr' --- diff --git a/kb/entities/systems/Memex.md b/kb/entities/systems/Memex.md index b3144f3..cfd8932 100644 --- a/kb/entities/systems/Memex.md +++ b/kb/entities/systems/Memex.md @@ -8,8 +8,6 @@ related: - exemplifies: Knowledge Compounding - see-also: Tolkien Gateway sources: [Source - LLM Wiki Pattern] -confidence: 0.90 -confidence_base: 0.90 provenance: sourced summary: Vannevar Bushs Konzept eines Wissensmanagementsystems von 1945 mit assoziativen Pfaden und Hypertext; geistiger Vorläufer moderner Wikis. --- diff --git a/kb/entities/systems/Tolkien Gateway.md b/kb/entities/systems/Tolkien Gateway.md index 19b85cf..8bb8518 100644 --- a/kb/entities/systems/Tolkien Gateway.md +++ b/kb/entities/systems/Tolkien Gateway.md @@ -8,8 +8,6 @@ related: - exemplifies: LLM Wiki Pattern - exemplifies: Knowledge Compounding sources: [Source - LLM Wiki Pattern] -confidence: 0.85 -confidence_base: 0.85 provenance: sourced summary: Von Fans erstelltes Wiki mit Tausenden verlinkten Seiten zum Tolkien-Legendarium; Beispiel für den Aufbau einer persönlichen Wissensbasis durch schrittweise Anhäufung. --- diff --git a/kb/entities/technologies/Arch Linux.md b/kb/entities/technologies/Arch Linux.md index ed6f150..a4660a0 100644 --- a/kb/entities/technologies/Arch Linux.md +++ b/kb/entities/technologies/Arch Linux.md @@ -12,8 +12,6 @@ related: - uses: GPG - see-also: LVM sources: [Source - Arch Linux Cheat Sheet] -confidence: 0.90 -confidence_base: 0.90 provenance: sourced summary: Schlanke Rolling-Release-Linux-Distribution, genutzt als Basis für CI/CD-Paketbau-Umgebungen und Infrastruktur. --- diff --git a/kb/entities/technologies/Disk Encryption.md b/kb/entities/technologies/Disk Encryption.md index 5f82acb..6917d4c 100644 --- a/kb/entities/technologies/Disk Encryption.md +++ b/kb/entities/technologies/Disk Encryption.md @@ -8,8 +8,6 @@ related: - see-also: LVM - see-also: Arch Linux sources: [Source - Arch Linux Cheat Sheet] -confidence: 0.90 -confidence_base: 0.90 provenance: sourced summary: Schutz ruhender Daten über das Kernelmodul dm-crypt und die LUKS-Schlüsselverwaltung zur transparenten Verschlüsselung von Speichergeräten unter Linux. --- diff --git a/kb/entities/technologies/Docker.md b/kb/entities/technologies/Docker.md index b03c2c4..2eb7a38 100644 --- a/kb/entities/technologies/Docker.md +++ b/kb/entities/technologies/Docker.md @@ -6,8 +6,6 @@ created: 2026-07-25 modified: 2026-09-01 related: [] sources: [Source - Docker Cheatsheet] -confidence: 0.95 -confidence_base: 0.95 provenance: sourced summary: Container-Plattform als Industriestandard für CI/CD-Infrastruktur, mit BuildKit-Daemon und entfernter Docker-Verwaltung über SSH. --- diff --git a/kb/entities/technologies/GRUB.md b/kb/entities/technologies/GRUB.md index ebca86d..686343f 100644 --- a/kb/entities/technologies/GRUB.md +++ b/kb/entities/technologies/GRUB.md @@ -6,8 +6,6 @@ created: 2026-08-02 modified: 2026-08-29 related: [] sources: [] -confidence: 0.50 -confidence_base: 0.50 provenance: general summary: GNU-Bootloader für Linux-Systeme; übernimmt das Laden des Kernels und die Boot-Konfiguration. --- diff --git a/kb/entities/technologies/Gitea Actions.md b/kb/entities/technologies/Gitea Actions.md index 1b7d6d6..70fb2de 100644 --- a/kb/entities/technologies/Gitea Actions.md +++ b/kb/entities/technologies/Gitea Actions.md @@ -11,8 +11,6 @@ related: - part-of: Gitea - uses: Docker sources: [Source - Conversation - Versioning CI-CD and Content Migration Session 2026-08-30, Source - Conversation - Issue Triage Labels and TODO Retirement Session 2026-08-31, Source - Conversation - Hardening the Test Suite Against Silent Environment Dependencies Session 2026-08-31, Source - Conversation - Nightly Drift-Check Workflow and doctor's Bootstrap Gap Session 2026-08-31] -confidence: 0.90 -confidence_base: 0.90 provenance: sourced summary: CI/CD-Workflow-Plattform, in Gitea integriert; fuehrt YAML-Workflows ueber den Act Runner aus, samt Release-Pipeline, belegten paths-ignore-Filtern und einem nightly.yml-Drift-Check, dessen schedule-Ausloesung seit 2026-09-01 (Run 90) belegt ist --- diff --git a/kb/entities/technologies/Gitea.md b/kb/entities/technologies/Gitea.md index ad95f16..cfa3d4e 100644 --- a/kb/entities/technologies/Gitea.md +++ b/kb/entities/technologies/Gitea.md @@ -7,8 +7,6 @@ modified: 2026-08-29 related: - uses: Act Runner sources: [Source - Conversation - Issue Triage Labels and TODO Retirement Session 2026-08-31, Source - Conversation - Two Round-Trip Defects Found by an Ingest Session 2026-08-31] -confidence: 0.90 -confidence_base: 0.90 provenance: sourced summary: Selbst gehosteter Git-Dienst auf docker-host.example.net; bietet Repository-Verwaltung und CI/CD über Gitea Actions mit Act Runner. --- diff --git a/kb/entities/technologies/Go.md b/kb/entities/technologies/Go.md index 7b35d61..c33ce6b 100644 --- a/kb/entities/technologies/Go.md +++ b/kb/entities/technologies/Go.md @@ -12,8 +12,6 @@ related: - required-by: goresponsiveness - required-by: hacs-e3dc sources: [] -confidence: 0.95 -confidence_base: 0.95 provenance: general summary: Quelloffene Programmiersprache von Google für Systemprogrammierung und Backend-Dienste, mit eingebauter Nebenläufigkeit über Goroutines und Channels. --- diff --git a/kb/entities/technologies/Home Assistant.md b/kb/entities/technologies/Home Assistant.md index bc317bc..af9469e 100644 --- a/kb/entities/technologies/Home Assistant.md +++ b/kb/entities/technologies/Home Assistant.md @@ -8,8 +8,6 @@ related: - implements: Modbus - composition: ha-core sources: [] -confidence: 0.50 -confidence_base: 0.50 provenance: general summary: Quelloffene Plattform zum Aufbau von Hausautomationssystemen mit Gerätesteuerung und Automatisierung. --- diff --git a/kb/entities/technologies/Kernel PM Governors.md b/kb/entities/technologies/Kernel PM Governors.md index ce36078..dedc6e2 100644 --- a/kb/entities/technologies/Kernel PM Governors.md +++ b/kb/entities/technologies/Kernel PM Governors.md @@ -8,8 +8,6 @@ related: - operates-on: CPPC - depends-on: Linux Kernel sources: [Source - AMD Powermanagement CPU] -confidence: 0.95 -confidence_base: 0.95 provenance: sourced summary: Power-Management-Module des Linux-Kernels, die die CPU-Frequenz dynamisch nach Systemlast und Leistungsanforderung skalieren. --- diff --git a/kb/entities/technologies/LVM.md b/kb/entities/technologies/LVM.md index 548208e..be8b09a 100644 --- a/kb/entities/technologies/LVM.md +++ b/kb/entities/technologies/LVM.md @@ -8,8 +8,6 @@ related: - runs-on: Arch Linux - see-also: Disk Encryption sources: [Source - Arch Linux Cheat Sheet] -confidence: 0.90 -confidence_base: 0.90 provenance: sourced summary: Device-Mapper-Framework unter Linux für flexible Datenträgerverwaltung mit Logical Volumes, Snapshots und Online-Vergrößerung jenseits klassischer Partitionierung. --- diff --git a/kb/entities/technologies/Linux Kernel.md b/kb/entities/technologies/Linux Kernel.md index 0541572..775424a 100644 --- a/kb/entities/technologies/Linux Kernel.md +++ b/kb/entities/technologies/Linux Kernel.md @@ -7,8 +7,6 @@ modified: 2026-08-29 related: - implements: CPPC sources: [Source - AMD Powermanagement CPU] -confidence: 0.95 -confidence_base: 0.95 provenance: sourced summary: Quelloffener Betriebssystemkern; verwaltet Systemressourcen und Hardware-Abstraktion, einschließlich Power Management und CPU-Frequenzskalierung. --- diff --git a/kb/entities/technologies/MQTT.md b/kb/entities/technologies/MQTT.md index ca7eca6..87acb1b 100644 --- a/kb/entities/technologies/MQTT.md +++ b/kb/entities/technologies/MQTT.md @@ -7,8 +7,6 @@ modified: 2026-08-28 related: - see-also: Modbus sources: [] -confidence: 0.50 -confidence_base: 0.50 provenance: general summary: Leichtgewichtiges Publish-Subscribe-Protokoll für die Kommunikation von IoT-Geräten über TCP/IP-Netze. --- diff --git a/kb/entities/technologies/OPC UA.md b/kb/entities/technologies/OPC UA.md index 029a784..7b16604 100644 --- a/kb/entities/technologies/OPC UA.md +++ b/kb/entities/technologies/OPC UA.md @@ -7,8 +7,6 @@ modified: 2026-08-29 related: - see-also: Modbus sources: [] -confidence: 0.50 -confidence_base: 0.50 provenance: general summary: Industrieprotokoll für sichere, standardisierte Gerätekommunikation mit semantischer Datenmodellierung. --- diff --git a/kb/entities/technologies/Python.md b/kb/entities/technologies/Python.md index d460669..32f307f 100644 --- a/kb/entities/technologies/Python.md +++ b/kb/entities/technologies/Python.md @@ -7,8 +7,6 @@ modified: 2026-08-29 related: - required-by: ha-core sources: [] -confidence: 0.50 -confidence_base: 0.50 provenance: general summary: Interpretierte Programmiersprache, weit verbreitet für Backend-Dienste und Hausautomationsplattformen. --- diff --git a/kb/entities/technologies/Rust.md b/kb/entities/technologies/Rust.md index 8cda37f..1d876d3 100644 --- a/kb/entities/technologies/Rust.md +++ b/kb/entities/technologies/Rust.md @@ -7,8 +7,6 @@ modified: 2026-08-29 related: - required-by: Aura sources: [] -confidence: 0.50 -confidence_base: 0.50 provenance: general summary: Systemprogrammiersprache, die Speichersicherheit ohne Garbage Collection bietet. --- diff --git a/kb/entities/technologies/Wine GE.md b/kb/entities/technologies/Wine GE.md index 2ee04fc..0093f8b 100644 --- a/kb/entities/technologies/Wine GE.md +++ b/kb/entities/technologies/Wine GE.md @@ -10,8 +10,6 @@ related: - composition: Wine-Staging - see-also: Lutris sources: [Source - Wine] -confidence: 0.85 -confidence_base: 0.85 provenance: sourced summary: Eigene Wine-Builds von GloriousEggroll mit zusätzlichen Patches und Optimierungen für bessere Kompatibilität von Windows-Anwendungen und -Spielen unter Linux. --- diff --git a/kb/entities/technologies/Wine-Staging.md b/kb/entities/technologies/Wine-Staging.md index 9cbe859..58a6030 100644 --- a/kb/entities/technologies/Wine-Staging.md +++ b/kb/entities/technologies/Wine-Staging.md @@ -10,8 +10,6 @@ related: - part-of: Wine GE - see-also: Arch Linux sources: [Source - Wine] -confidence: 0.85 -confidence_base: 0.85 provenance: sourced summary: Experimenteller Entwicklungszweig von Wine mit ungetesteten Patches und Funktionen vor der Aufnahme upstream; dient als Erprobungsfeld für neue Wine-Funktionalität. --- diff --git a/kb/entities/technologies/acpi-cpufreq.md b/kb/entities/technologies/acpi-cpufreq.md index eed1356..79ab4cf 100644 --- a/kb/entities/technologies/acpi-cpufreq.md +++ b/kb/entities/technologies/acpi-cpufreq.md @@ -9,8 +9,6 @@ related: - depends-on: Linux Kernel - uses: Kernel PM Governors sources: [Source - AMD Powermanagement CPU] -confidence: 0.95 -confidence_base: 0.95 provenance: sourced summary: Linux-Kerneltreiber für die CPU-Frequenzskalierung von Prozessoren nach dem ACPI-Standard. --- diff --git a/kb/entities/technologies/amd-pstate.md b/kb/entities/technologies/amd-pstate.md index dfab42a..d6898a8 100644 --- a/kb/entities/technologies/amd-pstate.md +++ b/kb/entities/technologies/amd-pstate.md @@ -11,8 +11,6 @@ related: - supersedes: acpi-cpufreq - uses: Kernel PM Governors sources: [Source - AMD Powermanagement CPU] -confidence: 0.95 -confidence_base: 0.95 provenance: sourced summary: Linux-Kerneltreiber für das Power Management von AMD-Prozessoren über die CPPC-Schnittstelle; löst acpi-cpufreq ab. --- diff --git a/kb/entities/technologies/iii Engine.md b/kb/entities/technologies/iii Engine.md index 862760e..40419d8 100644 --- a/kb/entities/technologies/iii Engine.md +++ b/kb/entities/technologies/iii Engine.md @@ -9,8 +9,6 @@ related: - operates-on: Knowledge Graph - invokes: Event-Driven Automation sources: [Source - LLM Wiki v2] -confidence: 0.90 -confidence_base: 0.90 provenance: sourced summary: Kern-Engine, die die Infrastruktur für persistente Speicher von KI-Agenten und die Umsetzung des Wissensgraphen bereitstellt. --- diff --git a/kb/entities/tools/AUR.md b/kb/entities/tools/AUR.md index bf51e97..9a2f686 100644 --- a/kb/entities/tools/AUR.md +++ b/kb/entities/tools/AUR.md @@ -10,8 +10,6 @@ related: - depends-on: makepkg - uses: GPG sources: [Source - Arch Linux Cheat Sheet] -confidence: 0.95 -confidence_base: 0.95 provenance: sourced summary: Gemeinschaftlich gepflegtes Repository für Arch-Linux-Pakete, gebaut aus PKGBUILD-Quellbeschreibungen. --- diff --git a/kb/entities/tools/Act Runner.md b/kb/entities/tools/Act Runner.md index 4022fdc..c673dc9 100644 --- a/kb/entities/tools/Act Runner.md +++ b/kb/entities/tools/Act Runner.md @@ -8,8 +8,6 @@ related: - uses: Gitea - hosts: Gitea Actions sources: [Source - Conversation - Versioning CI-CD and Content Migration Session 2026-08-30] -confidence: 0.95 -confidence_base: 0.95 provenance: sourced summary: Offizieller Gitea-Actions-Runner, der CI/CD-Workflows in Docker-Containern auf einer dedizierten Runner-VM ausführt; JavaScript-Actions brauchen node im Job-Container --- diff --git a/kb/entities/tools/Agent Memory.md b/kb/entities/tools/Agent Memory.md index 0051753..4bd290c 100644 --- a/kb/entities/tools/Agent Memory.md +++ b/kb/entities/tools/Agent Memory.md @@ -11,8 +11,6 @@ related: - invokes: Event-Driven Automation - runs-on: iii Engine sources: [Source - LLM Wiki v2] -confidence: 0.95 -confidence_base: 0.95 provenance: sourced summary: Persistenter Speicher für KI-Coding-Agenten; setzt Wissensgraph- und Lifecycle-Management-Muster um. --- diff --git a/kb/entities/tools/Aura.md b/kb/entities/tools/Aura.md index a608bd5..934babe 100644 --- a/kb/entities/tools/Aura.md +++ b/kb/entities/tools/Aura.md @@ -10,8 +10,6 @@ related: - uses: GPG - runs-on: Arch Linux sources: [Source - Arch Linux Cheat Sheet] -confidence: 0.90 -confidence_base: 0.90 provenance: sourced summary: In Rust geschriebener AUR-Helper mit sicherer Paketverwaltung und eigenem Build-Verzeichnis für Arch Linux. --- diff --git a/kb/entities/tools/Bottles.md b/kb/entities/tools/Bottles.md index e2c0923..88d7c30 100644 --- a/kb/entities/tools/Bottles.md +++ b/kb/entities/tools/Bottles.md @@ -12,8 +12,6 @@ related: - uses: Wine-Staging - uses: Wine GE sources: [Source - Wine] -confidence: 0.90 -confidence_base: 0.90 provenance: sourced summary: Grafisches Werkzeug zur Verwaltung von Wine-Präfixen und zum Ausführen von Windows-Anwendungen unter Linux mit mehreren Runtimes. --- diff --git a/kb/entities/tools/ChatGPT.md b/kb/entities/tools/ChatGPT.md index 3e4c4d5..246663b 100644 --- a/kb/entities/tools/ChatGPT.md +++ b/kb/entities/tools/ChatGPT.md @@ -9,8 +9,6 @@ related: - implements: RAG - exemplifies: LLM Wiki Pattern sources: [Source - LLM Wiki Pattern] -confidence: 0.80 -confidence_base: 0.80 provenance: sourced summary: KI-Chatbot von OpenAI mit Datei-Upload für RAG-artige Dokumentabfragen, ohne dauerhafte Wissensanhäufung oder Querverweis-Synthese. --- diff --git a/kb/entities/tools/Claude Code.md b/kb/entities/tools/Claude Code.md index 32af259..0c373b9 100644 --- a/kb/entities/tools/Claude Code.md +++ b/kb/entities/tools/Claude Code.md @@ -12,8 +12,6 @@ related: - implements: Claude Code Auto Mode - operates-on: Diff-Reviewable Agent Edits sources: [Source - LLM Wiki Pattern, Source - Copilot Skill Restructure Instructions, Source - Conversation - AGENTS.md Skill Restructuring Session 2026-08-04, Source - Conversation - Auto Mode and Tool Choice Session 2026-08-31] -confidence: 0.85 -confidence_base: 0.85 provenance: sourced summary: KI-Coding-Assistent von Anthropic; liest ganze Codebasen, erzeugt Code und ändert Dateien, konfiguriert über CLAUDE.md; liest Agent Skills ausschließlich aus .claude/skills/; steuert Freigaben über sechs --permission-mode-Werte. --- diff --git a/kb/entities/tools/Codex CLI.md b/kb/entities/tools/Codex CLI.md index 67faef1..029a0b2 100644 --- a/kb/entities/tools/Codex CLI.md +++ b/kb/entities/tools/Codex CLI.md @@ -11,8 +11,6 @@ related: - see-also: Mistral Vibe - evidenced-by: Source - Copilot Skill Restructure Instructions sources: [Source - Copilot Skill Restructure Instructions, Source - Conversation - AGENTS.md Skill Restructuring Session 2026-08-04] -confidence: 0.80 -confidence_base: 0.80 provenance: sourced summary: Kommandozeilenschnittstelle für das Coding-Modell Codex --- diff --git a/kb/entities/tools/Dataview.md b/kb/entities/tools/Dataview.md index de53eec..56f10da 100644 --- a/kb/entities/tools/Dataview.md +++ b/kb/entities/tools/Dataview.md @@ -8,8 +8,6 @@ related: - runs-on: Obsidian - operates-on: LLM Wiki Pattern sources: [Source - LLM Wiki Pattern] -confidence: 0.85 -confidence_base: 0.85 provenance: sourced summary: Obsidian-Plugin für Abfragen über das Frontmatter von Seiten; erzeugt dynamische Tabellen, Listen und strukturierte Sichten auf Wiki-Inhalte. --- diff --git a/kb/entities/tools/GPG.md b/kb/entities/tools/GPG.md index 48bf949..f4f35e0 100644 --- a/kb/entities/tools/GPG.md +++ b/kb/entities/tools/GPG.md @@ -10,8 +10,6 @@ related: - see-also: makepkg - runs-on: Arch Linux sources: [Source - Arch Linux Cheat Sheet] -confidence: 0.85 -confidence_base: 0.85 provenance: sourced summary: GNU Privacy Guard zum Verschlüsseln und Signieren; unverzichtbar für die Prüfung von AUR-Paketen und kryptografische Operationen unter Arch Linux. --- diff --git a/kb/entities/tools/GitHub Copilot.md b/kb/entities/tools/GitHub Copilot.md index 8b27051..d78fefb 100644 --- a/kb/entities/tools/GitHub Copilot.md +++ b/kb/entities/tools/GitHub Copilot.md @@ -10,8 +10,6 @@ related: - see-also: Claude Code - see-also: Mistral Vibe sources: [Source - Copilot Skill Restructure Instructions, Source - Conversation - AGENTS.md Skill Restructuring Session 2026-08-04] -confidence: 0.70 -confidence_base: 0.70 provenance: mixed summary: KI-gestützte Code-Vervollständigung auf Basis der OpenAI-Modelle, in Entwickler-Editoren integriert; unterstützt in VS Code die native Erkennung von Agent Skills (SKILL.md). --- diff --git a/kb/entities/tools/Gitea MCP Server.md b/kb/entities/tools/Gitea MCP Server.md index 29a9818..58f38ec 100644 --- a/kb/entities/tools/Gitea MCP Server.md +++ b/kb/entities/tools/Gitea MCP Server.md @@ -9,8 +9,6 @@ related: - uses: Gitea - uses: Gitea Actions sources: [Source - Conversation - Versioning CI-CD and Content Migration Session 2026-08-30, Source - Conversation - Issue Triage Labels and TODO Retirement Session 2026-08-31, Source - Gitea Issue 41 - Issue Management and Label Scheme 2026-09-02] -confidence: 0.70 -confidence_base: 0.70 provenance: sourced summary: MCP-Server fuer die Gitea-API; liest Actions-Laeufe, Logs, Releases und Issues, ist bei privatem Repository der einzige belastbare Blick auf den CI-Zustand und traegt seit 2026-08-31 auch die Board-Triage --- diff --git a/kb/entities/tools/Lutris.md b/kb/entities/tools/Lutris.md index 72b7f92..74d43de 100644 --- a/kb/entities/tools/Lutris.md +++ b/kb/entities/tools/Lutris.md @@ -12,8 +12,6 @@ related: - see-also: Wine GE - uses: Steam sources: [Source - Wine] -confidence: 0.80 -confidence_base: 0.80 provenance: sourced summary: Quelloffene Spieleplattform für Linux mit einheitlicher Oberfläche für Installation und Start von Spielen über die Wine-Kompatibilitätsschicht. --- diff --git a/kb/entities/tools/Marp.md b/kb/entities/tools/Marp.md index 7bfa8f3..1015358 100644 --- a/kb/entities/tools/Marp.md +++ b/kb/entities/tools/Marp.md @@ -8,8 +8,6 @@ related: - runs-on: Obsidian - operates-on: LLM Wiki Pattern sources: [Source - LLM Wiki Pattern] -confidence: 0.85 -confidence_base: 0.85 provenance: sourced summary: Markdown-basiertes Format für Foliensätze; erzeugt Präsentationen direkt aus Markdown, mit Themes und PDF-Export. --- diff --git a/kb/entities/tools/Mistral Vibe.md b/kb/entities/tools/Mistral Vibe.md index f301c9d..847fff6 100644 --- a/kb/entities/tools/Mistral Vibe.md +++ b/kb/entities/tools/Mistral Vibe.md @@ -11,8 +11,6 @@ related: - see-also: Codex CLI - evidenced-by: Source - Copilot Skill Restructure Instructions sources: [Source - Copilot Skill Restructure Instructions, Source - Conversation - AGENTS.md Skill Restructuring Session 2026-08-04] -confidence: 0.80 -confidence_base: 0.80 provenance: sourced summary: CLI-Coding-Agent von Mistral AI --- diff --git a/kb/entities/tools/NotebookLM.md b/kb/entities/tools/NotebookLM.md index 1201620..3d8e1f6 100644 --- a/kb/entities/tools/NotebookLM.md +++ b/kb/entities/tools/NotebookLM.md @@ -9,8 +9,6 @@ related: - implements: RAG - exemplifies: LLM Wiki Pattern sources: [Source - LLM Wiki Pattern] -confidence: 0.80 -confidence_base: 0.80 provenance: sourced summary: RAG-basiertes KI-Wissenswerkzeug von Google; beantwortet Fragen aus hochgeladenen Dokumenten, ohne Wissen dauerhaft anzuhäufen. --- diff --git a/kb/entities/tools/Obsidian Web Clipper.md b/kb/entities/tools/Obsidian Web Clipper.md index 19df239..6a56e3a 100644 --- a/kb/entities/tools/Obsidian Web Clipper.md +++ b/kb/entities/tools/Obsidian Web Clipper.md @@ -8,8 +8,6 @@ related: - depends-on: Obsidian - exemplifies: LLM Wiki Pattern sources: [Source - LLM Wiki Pattern] -confidence: 0.85 -confidence_base: 0.85 provenance: sourced summary: Browser-Erweiterung, die Webartikel als Markdown direkt in Obsidian-Vaults ablegt, für die schnelle Aufnahme in Wissens-Workflows. --- diff --git a/kb/entities/tools/Obsidian.md b/kb/entities/tools/Obsidian.md index b8b1ef3..0f437cb 100644 --- a/kb/entities/tools/Obsidian.md +++ b/kb/entities/tools/Obsidian.md @@ -11,8 +11,6 @@ related: - see-also: qmd - exemplifies: LLM Wiki Pattern sources: [Source - LLM Wiki Pattern] -confidence: 0.95 -confidence_base: 0.95 provenance: sourced summary: Markdown-basierte Notizanwendung mit bidirektionaler Verlinkung, Wissensgraph-Darstellung und Plugin-Ökosystem für persönliche Wikis. --- diff --git a/kb/entities/tools/OpenAI Codex.md b/kb/entities/tools/OpenAI Codex.md index 50e7664..0a9fdf2 100644 --- a/kb/entities/tools/OpenAI Codex.md +++ b/kb/entities/tools/OpenAI Codex.md @@ -10,8 +10,6 @@ related: - see-also: Pi - exemplifies: LLM Wiki Pattern sources: [Source - LLM Wiki Pattern] -confidence: 0.85 -confidence_base: 0.85 provenance: sourced summary: Coding-Modell von OpenAI, das GitHub Copilot antreibt; versteht, erzeugt und ändert Code in mehreren Sprachen. --- diff --git a/kb/entities/tools/OpenCode.md b/kb/entities/tools/OpenCode.md index 4a8acaa..9499ec9 100644 --- a/kb/entities/tools/OpenCode.md +++ b/kb/entities/tools/OpenCode.md @@ -10,8 +10,6 @@ related: - see-also: Pi - exemplifies: LLM Wiki Pattern sources: [Source - LLM Wiki Pattern] -confidence: 0.80 -confidence_base: 0.80 provenance: sourced summary: KI-Coding-Assistent für Codeerzeugung und -analyse; kann das LLM-Wiki-Muster für dauerhafte Wissensverwaltung umsetzen. --- diff --git a/kb/entities/tools/Pi.md b/kb/entities/tools/Pi.md index 8cdd163..8eb4713 100644 --- a/kb/entities/tools/Pi.md +++ b/kb/entities/tools/Pi.md @@ -10,8 +10,6 @@ related: - see-also: OpenCode - exemplifies: LLM Wiki Pattern sources: [Source - LLM Wiki Pattern] -confidence: 0.80 -confidence_base: 0.80 provenance: sourced summary: Assistenz-Agent von Inflection AI; kann das LLM-Wiki-Muster wie andere LLM-Agenten umsetzen. --- diff --git a/kb/entities/tools/Proton.md b/kb/entities/tools/Proton.md index 82ee99f..57f4d1f 100644 --- a/kb/entities/tools/Proton.md +++ b/kb/entities/tools/Proton.md @@ -12,8 +12,6 @@ related: - see-also: Lutris - part-of: Steam sources: [Source - Wine] -confidence: 0.85 -confidence_base: 0.85 provenance: sourced summary: Wine-basierte Kompatibilitätsschicht von Valve; lässt Windows-Spiele über Steam unter Linux laufen, mit optimierter DirectX-Übersetzung. --- diff --git a/kb/entities/tools/Steam.md b/kb/entities/tools/Steam.md index eacc194..6bf323e 100644 --- a/kb/entities/tools/Steam.md +++ b/kb/entities/tools/Steam.md @@ -8,8 +8,6 @@ related: - see-also: Lutris - see-also: Proton sources: [] -confidence: 0.50 -confidence_base: 0.50 provenance: general summary: Valves Plattform für digitalen Spielevertrieb und Spielebibliothek auf dem PC. --- diff --git a/kb/entities/tools/Wine.md b/kb/entities/tools/Wine.md index 106fe5d..180421e 100644 --- a/kb/entities/tools/Wine.md +++ b/kb/entities/tools/Wine.md @@ -12,8 +12,6 @@ related: - see-also: Lutris - runs-on: Arch Linux sources: [Source - Wine, Source - Arch Linux Cheat Sheet] -confidence: 0.95 -confidence_base: 0.95 provenance: sourced summary: Kompatibilitätsschicht, die Windows-API-Aufrufe nach POSIX übersetzt und Windows-Anwendungen unter Linux, BSD und macOS ohne Virtualisierung oder Emulation ausführt. --- diff --git a/kb/entities/tools/awesome-llm-wiki.md b/kb/entities/tools/awesome-llm-wiki.md index 1a45183..b836acf 100644 --- a/kb/entities/tools/awesome-llm-wiki.md +++ b/kb/entities/tools/awesome-llm-wiki.md @@ -11,8 +11,6 @@ related: - see-also: wikitool - evidenced-by: Source - LLM Improvements Codex Analysis sources: [Source - LLM Improvements Codex Analysis, Source - LLM Improvements Sonnet Analysis, Source - Copilot Skill Restructure Instructions] -confidence: 0.80 -confidence_base: 0.80 provenance: sourced summary: Externes GitHub-Repository (gavischneider/awesome-llm-wiki) mit verschiedenen Umsetzungen und Mustern für LLM-Wiki-Skills --- diff --git a/kb/entities/tools/farzaa gist.md b/kb/entities/tools/farzaa gist.md index a8ca5ff..31be983 100644 --- a/kb/entities/tools/farzaa gist.md +++ b/kb/entities/tools/farzaa gist.md @@ -12,8 +12,6 @@ related: - evidenced-by: Source - LLM Improvements Sonnet Analysis - composition: pascalandy schema sources: [Source - LLM Improvements Codex Analysis, Source - LLM Improvements Sonnet Analysis] -confidence: 0.80 -confidence_base: 0.80 provenance: sourced summary: Externes Gist (farzaa/c35ac0cfbeb957788650e36aabea836d) mit Ideen und Umsetzungen zum LLM-Wiki-Muster --- diff --git a/kb/entities/tools/gdeploy.md b/kb/entities/tools/gdeploy.md index abc706f..6cf8697 100644 --- a/kb/entities/tools/gdeploy.md +++ b/kb/entities/tools/gdeploy.md @@ -8,8 +8,6 @@ related: - uses: Go - see-also: plugnburn-edl sources: [] -confidence: 0.75 -confidence_base: 0.75 provenance: general summary: In Go geschriebenes CLI-Werkzeug zur Automatisierung von Anwendungs-Deployment, Konfigurationsverwaltung und Infrastruktur. --- diff --git a/kb/entities/tools/makepkg.md b/kb/entities/tools/makepkg.md index e7bc364..20f2a35 100644 --- a/kb/entities/tools/makepkg.md +++ b/kb/entities/tools/makepkg.md @@ -10,8 +10,6 @@ related: - see-also: Aura - uses: GPG sources: [Source - Arch Linux Cheat Sheet] -confidence: 0.95 -confidence_base: 0.95 provenance: sourced summary: Build-Werkzeug von Arch Linux; wertet PKGBUILD-Dateien aus, um Quellcode zu übersetzen und installierbare Pakete zu erzeugen. --- diff --git a/kb/entities/tools/pascalandy schema.md b/kb/entities/tools/pascalandy schema.md index c4c17a3..9b15b56 100644 --- a/kb/entities/tools/pascalandy schema.md +++ b/kb/entities/tools/pascalandy schema.md @@ -9,8 +9,6 @@ related: - see-also: AGENTS.md - evidenced-by: Source - LLM Improvements Sonnet Analysis sources: [Source - LLM Improvements Sonnet Analysis] -confidence: 0.70 -confidence_base: 0.70 provenance: sourced summary: Von der Community beigesteuertes Wiki Schema (Global) aus pascalandys Kommentar in Farzas Gist, mit alternativer Tag-Taxonomie (area/kind/topic/status/pty) --- diff --git a/kb/entities/tools/qmd.md b/kb/entities/tools/qmd.md index 3aaa992..6333023 100644 --- a/kb/entities/tools/qmd.md +++ b/kb/entities/tools/qmd.md @@ -8,8 +8,6 @@ related: - consumes: Obsidian - exemplifies: LLM Wiki Pattern sources: [Source - LLM Wiki Pattern, Source - qmd - GitHub Repository] -confidence: 0.80 -confidence_base: 0.80 provenance: sourced summary: 'Lokale Suchmaschine fuer Markdown-Dateien: TypeScript/Node.js/Bun, SQLite-FTS5-BM25 plus sqlite-vec-Vektorsuche plus node-llama-cpp-LLM-Reranking.' --- diff --git a/kb/entities/tools/wikitool.md b/kb/entities/tools/wikitool.md index d59b5f6..b8e7a4b 100644 --- a/kb/entities/tools/wikitool.md +++ b/kb/entities/tools/wikitool.md @@ -28,8 +28,6 @@ related: - evidenced-by: Source - LLM Improvements Codex Analysis - evidenced-by: Source - LLM Improvements Sonnet Analysis sources: [Source - LLM Improvements Codex Analysis, Source - LLM Improvements Sonnet Analysis, Source - Copilot Skill Restructure Instructions, Source - Conversation - AGENTS.md Skill Restructuring Session 2026-08-04, Source - LLM Improvements Production Agent Gaps 2026, Source - Conversation - Versioning CI-CD and Content Migration Session 2026-08-30, Source - Conversation - Comma Bug Budget Refund and Lint Report Path Session 2026-08-31, Source - Conversation - Issue Triage Labels and TODO Retirement Session 2026-08-31, Source - Conversation - Auto Mode and Tool Choice Session 2026-08-31, Source - Conversation - Write-Once Frontmatter Fields and touch --set Session 2026-08-31, Source - Conversation - Gate Counting and Measured Calibration Session 2026-08-31, Source - Conversation - Two Round-Trip Defects Found by an Ingest Session 2026-08-31, Source - Conversation - Hardening the Test Suite Against Silent Environment Dependencies Session 2026-08-31, Source - Conversation - ENVIRONMENT.md as an Optional Third Session-Level File Session 2026-08-31, 'Source - Public Release, Corpus Purge and History Squash Session 2026-09-01', Source - Publish-Remote Gate and Issue Triage Session 2026-09-01, Source - Private-Instance Merge Correction and Issue 30 Session 2026-09-01, Source - MCP Read Server Implementation Session 2026-09-02, Source - Version Part Nomenclature and Breaking Change Gate Session 2026-09-02] -confidence: 0.90 -confidence_base: 0.90 provenance: sourced summary: Deterministisches CLI fuer alle mechanischen Wiki-Operationen; seit 2.0.0 im Paket chemenu, seit 2.4.0 zusaetzlich als MCP-Leseserver erreichbar, seit 2.5.0 mit Breaking-Change-Pflichtmarker --- diff --git a/kb/index.md b/kb/index.md index 353043f..00d8184 100644 --- a/kb/index.md +++ b/kb/index.md @@ -7,7 +7,7 @@ A map of the wiki, not a catalog of it: counts and pointers only. To *find* a page, search instead of reading this file: - `tools/wikitool search "<text>"` - ranked text search, with summaries -- `tools/wikitool search --field entity_type=system --field 'confidence<0.6'` - structured query over frontmatter +- `tools/wikitool search --field entity_type=system --field '!sources'` - structured query over frontmatter The page tables live in a generated `INDEX.md` inside each collection, linked below. @@ -18,7 +18,7 @@ The page tables live in a generated `INDEX.md` inside each collection, linked be - **Concepts:** 80 - **Entities:** 72 - **Sources:** 29 -- **Last Updated:** 2026-09-09 +- **Last Updated:** 2026-09-10 --- diff --git a/kb/log.md b/kb/log.md index 77fa078..5ce6ad1 100644 --- a/kb/log.md +++ b/kb/log.md @@ -203,3 +203,9 @@ Kalibrierungsfrage dazu geht als eigenes Issue auf das Board, nicht in diesen La Alle Checklistenpunkte erledigt: 29 Seiten getouched, `migrate verify` 0 findings, `lint` Exit 0, Publish 00220f8 gelandet. Die dauerhaften Schluesse stehen in den 29 Source-Seiten selbst (fidelity/authority) und in CHANGES.md; die Entscheidungsregel des Laufs ist dort zusammengefasst, das Workshop-Verzeichnis daher geloescht. Die Kalibrierungsfrage aus dem 67er-lint-Befund liegt als Notiz an Issue #60, das `status/incoming` bleibt. --- + +## [2026-09-10] update | confidence-removal: Abschluss, migrate done 5.0.0, Workshop geschlossen + +Korpusmigration zu #86/#60: confidence/confidence_base aus allen 152 betroffenen Entity-/Concept-Seiten entfernt (types/entity.schema.yaml, types/concept.schema.yaml deklarieren additionalProperties: false seit dem Stack-Teil von #60). Vier Einheiten entlang bestehender Area-Verzeichnisse (u1 kb/concepts/architectures+decisions+protocols+problems: 35, u2 kb/concepts/patterns+workflows: 45, u3 kb/entities/tools+people: 35, u4 kb/entities/technologies+projects+systems: 37), je per Skript work/confidence-removal/strip_confidence.py ueber chemenu.frontmatter_io.read_page/write_page (nie von Hand). migrate verify --from HEAD --fail-on-error zeigt fuer alle vier Einheiten 0 Befunde - modified:, Body, Referenzarrays und Feldreihenfolge unveraendert. lint --fail-on-error: 0 schema_validation_errors (voller Report unter reports/Lint Report 2026-09-10.md; die dort gemeldeten redundant_see_also-Funde sind vorbestehend, advisory und unabhaengig von dieser Migration). Ein Body-Treffer bleibt bewusst bestehen: kb/concepts/patterns/Confidence Scoring.md zitiert 'confidence: 0.XX' als YAML-Beispiel innerhalb eines Code-Blocks - das ist Content ueber das Pattern selbst, kein Frontmatter-Feld dieser Seite, und liegt ausserhalb des Body-unberuehrt-Scopes von #86. migrate done 5.0.0 --pages 152 gesetzt, kb_version steht auf 5.0.0. Workshop work/confidence-removal/ nach work/CONTRACT.md geschlossen und geloescht; die dauerhafte Ausgabe ist der bereinigte Korpus selbst. Naechster Schritt: ein gemeinsamer publish mit den Stack-Aenderungen aus #60 (kein eigener Publish fuer diese Einheit, siehe #60 Sequencing). + +--- diff --git a/raw/CONTRACT.md b/raw/CONTRACT.md index 0436764..6548eb5 100644 --- a/raw/CONTRACT.md +++ b/raw/CONTRACT.md @@ -8,7 +8,7 @@ checked against what was actually said. `raw/` is deliberately **not a collection** and carries no `COLLECTION.md`. Nothing in [kb/CONTRACT.md](../kb/CONTRACT.md) applies to it: raw files have no types, no frontmatter, no -wikilinks, no provenance and no confidence. They are untrusted input, and the top-level split +wikilinks and no provenance. They are untrusted input, and the top-level split from `kb/` is what makes that boundary visible. <!-- wikitool:toc --> diff --git a/tools/CONTRACT.md b/tools/CONTRACT.md index 6da9e41..b2150c1 100644 --- a/tools/CONTRACT.md +++ b/tools/CONTRACT.md @@ -2,7 +2,7 @@ `wikitool` is a deterministic CLI for Chemenu, used by agents (and humans) so mechanical wiki operations - frontmatter, index statistics, cross-references, log -formatting, confidence decay, git publishing - never have to be re-derived by +formatting, git publishing - never have to be re-derived by an LLM. The root [`AGENTS.md`](../AGENTS.md) holds the invariants that say when using these commands is mandatory; this file is the full reference. Changes to `wikitool` itself are tracked in the repo root [`CHANGES.md`](../CHANGES.md), @@ -46,11 +46,11 @@ tools/wikitool <command> --help | Command | Purpose | |---------|---------| | `new <type-name> --name "<Name>" [--type <path>] [--set field=value ...]` | Scaffold a page of any type. The type-spec drives fields, defaults, directory (`base_dir`/`layout`), title prefix, and template - `--set` is repeatable, and comma-separated values fill array fields. An element that itself contains a comma is written `\,`, or passed as its own repeated `--set` for that field - repeating an array field appends. See `types list`/`types describe`. | -| `new entity --name "<Name>" --set entity_type=<t> [--set tags=a,b] [--set related=X,Y] [--set sources="Source - Z"] [--set confidence=0.7] [--set provenance=sourced\|general\|mixed]` | Scaffold `kb/entities/<subdir>/<Name>.md` | +| `new entity --name "<Name>" --set entity_type=<t> [--set tags=a,b] [--set related=X,Y] [--set sources="Source - Z"] [--set provenance=sourced\|general\|mixed]` | Scaffold `kb/entities/<subdir>/<Name>.md` | | `new concept --name "<Name>" --set concept_type=<t> ...` | Scaffold `kb/concepts/<Name>.md` | | `new source --name "<Name>" --set raw_files=raw/notes/x.md,raw/notes/y.md [--set source_url=<URL>] [--set entities=A,B] [--set concepts=C,D]` | Scaffold `kb/sources/Source - <Name>.md` (prefix added automatically) with a `raw_files:` list (rejects paths that don't exist) | | `new comparison --name "X vs Y" --set entities=X,Y` | Scaffold `kb/comparisons/X vs Y.md` | -| `touch --page "<Title>" [--summary "..."] [--provenance <v>] [--confidence-base <n>] [--date YYYY-MM-DD] [--set field=value ...] [--add field=value ...] [--remove field=value ...] [--no-date] [--dry-run]` | Update a page's own frontmatter: bump `modified:` and optionally rewrite any field its type declares. `--summary`/`--provenance`/`--confidence-base` are shorthands; `--set` reaches every other field and **replaces** its value, while `--add`/`--remove` change single elements of an array field (removing an absent element succeeds and says so). Repeating `--set` for one array field appends *within the call*, and `\,` is a literal comma - same rules as `new --set`. Refused with the command that owns them instead: `type:` (page-lifecycle), `confidence:` (derived - set `--confidence-base`), and the page-ref arrays `related:`/`sources:`/`entities:`/`concepts:` (`xref`). Everything else the schema declares is settable, and an unknown field lists what the page actually has. Schema-validates the fields it writes, and `raw_files:` entries must exist on disk. A source declares `date:` instead of `modified:`, and that is the *publication* date of the raw material - it is never bumped to today, and changes only when `--date` names a value explicitly. | +| `touch --page "<Title>" [--summary "..."] [--provenance <v>] [--date YYYY-MM-DD] [--set field=value ...] [--add field=value ...] [--remove field=value ...] [--no-date] [--dry-run]` | Update a page's own frontmatter: bump `modified:` and optionally rewrite any field its type declares. `--summary`/`--provenance` are shorthands; `--set` reaches every other field and **replaces** its value, while `--add`/`--remove` change single elements of an array field (removing an absent element succeeds and says so). Repeating `--set` for one array field appends *within the call*, and `\,` is a literal comma - same rules as `new --set`. Refused with the command that owns them instead: `type:` (page-lifecycle), and the page-ref arrays `related:`/`sources:`/`entities:`/`concepts:` (`xref`). Everything else the schema declares is settable, and an unknown field lists what the page actually has. Schema-validates the fields it writes, and `raw_files:` entries must exist on disk. A source declares `date:` instead of `modified:`, and that is the *publication* date of the raw material - it is never bumped to today, and changes only when `--date` names a value explicitly. | | `rename --from "<Old>" --to "<New>" [--dry-run]` | Rename a page and repoint every reference to it: body `[[wikilinks]]` (aliases and anchors preserved), a `[^cite-id]` whose id was derived from the old title (refreshed to match the new one, both in its Footnotes definition and every reference to it), the page's own H1, and every page-ref frontmatter array declared by the type's `page_ref_fields:`. If `--from` is *not* a page but is referenced, it instead repoints those references onto the existing `--to` page and moves nothing - the fix for a reference spelled `act_runner` when the page is `Act Runner` | | `rm --page "<Title>" [--yes] [--dry-run]` | Delete a page and mechanically de-link it. Refuses without `--yes` while other pages still reference it. Strips ref-array entries and bare `- [[Title]]` / `- **label:** [[Title]]` bullets; leaves prose and inline citations in place and reports them | | `move --page "<Title>"` \| `move --reconcile` `[--dry-run]` | Move a page to the directory its type-spec computes for its current frontmatter (`base_dir` + `layout` - the same rule `new` places a page by, via `TypeResolver.compute_target_dir`), never a hand-chosen destination - there is no `--to <dir>`. `--reconcile` applies it corpus-wide: every misplaced page moves in one call, and a second run reports nothing left to do (`lint`'s `Misplaced Pages` finding is the advisory that this fixes, and its `Nested Pages` finding the hard one - see `lint`). Neither mode touches a body or a frontmatter field, and the page's title (its only identity in the wiki) never changes - only the file moves. A directory a move empties is removed along with it, so a page that was nested below its area leaves no leftover directory behind. A destination already occupied (a pre-existing duplicate-stem collision) is refused rather than silently skipped | @@ -65,9 +65,7 @@ tools/wikitool <command> --help | `log append --op ingest\|query\|lint\|create\|update\|delete\|rename\|move --title "..." [--body "..."\|--body-file path]` | Append a formatted entry to `kb/log.md` | | `log status` | Read-only: count `ingest` entries logged since the last `lint` entry - the deterministic trigger behind the Maintenance Schedule's "every 10 sources" full-lint cadence | | `lint [--json] [--markdown out.md] [--full] [--fail-on-error]` | Structural + provenance checks: broken wikilinks, dangling frontmatter references, orphan pages, index drift, schema gaps, duplicate titles, title mismatches, pages nested more than one directory below their collection (hard - the generated catalog folds these into their area silently rather than merely reading it), uncovered raw files, broken `raw_files:` refs, raw files claimed by more than one source page, unmarked provenance, citation/frontmatter drift, unbalanced generated-region markers, edges whose label is missing or not authorised by the source collection's `outbound:` (both hard once `kb_version` has reached the release that introduced labelled edges - advisory below it, so a corpus mid-migration is not refused by the check measuring it), `see-also` edges whose reverse direction already carries a specific label (advisory only - redundant rather than wrong, and never migration-gated, since no version turns the redundancy into an error), a collection past the catalog's per-area shard threshold that has no areas to shard (advisory only - sharding is automatic but per *area*, so a collection nobody gave areas keeps one table however large it grows; reported with the split its subtype field would produce, and only when that split puts every resulting area at or under the threshold, so a lopsided or small collection stays silent), source pages sitting in the `unclassified` catalog slot (advisory only - `unclassified` is the visible fallback for a genuinely unclear source, not a defect), quote-limit overages (>2 blockquoted lines/page, advisory only). Prints only the sections that found something and always writes the full report to `reports/Lint Report <date>.md` (or `--markdown`), naming the path - `--full` prints everything, `--json` prints the findings and writes nothing | -| `search ["<text>"] [--field <predicate> ...] [--kind/--subtype/--collection/--tag <v>] [--regex] [--limit N] [--sort [-]<field>] [--backend <name>] [--matches] [--json]` | Find pages in `kb/` without reading the index. Text search runs through a pluggable backend (`rg` today); `--field` predicates are evaluated on frontmatter - `f=v`, `f~substring`, `'f>=v'`, `'f:*'` (present), `'!f'` (absent), repeatable and ANDed. With no text this is a pure structured query. Results carry kind/summary/confidence so a hit can be judged without opening the page. A page whose frontmatter does not parse can match no positive predicate, so it is **named** rather than dropped: `--json` always carries an `unreadable` list of `{path, reason}` (usually empty), and the table form writes the same lines to stderr. `--regex` is applied by `rg` alone, whose engine is linear; the ranking boosts for title and summary are literal-containment only, so a non-literal pattern is ranked by match count. `rg` is killed after 30 s and reported as a failure. Read-only, and **exempt from the Iteration Budget Gate** | -| `confidence decay [--apply]` | Recompute every page's derived `confidence` as `confidence_base * (1 - 0.01/month)`, floored at 0.2; dry-run by default | -| `confidence init-base [--apply]` | One-time backfill: set `confidence_base` from the current `confidence` on pages that predate the derived-confidence model | +| `search ["<text>"] [--field <predicate> ...] [--kind/--subtype/--collection/--tag <v>] [--regex] [--limit N] [--sort [-]<field>] [--backend <name>] [--matches] [--json]` | Find pages in `kb/` without reading the index. Text search runs through a pluggable backend (`rg` today); `--field` predicates are evaluated on frontmatter - `f=v`, `f~substring`, `'f>=v'`, `'f:*'` (present), `'!f'` (absent), repeatable and ANDed. With no text this is a pure structured query. Results carry kind/summary so a hit can be judged without opening the page. A page whose frontmatter does not parse can match no positive predicate, so it is **named** rather than dropped: `--json` always carries an `unreadable` list of `{path, reason}` (usually empty), and the table form writes the same lines to stderr. `--regex` is applied by `rg` alone, whose engine is linear; the ranking boosts for title and summary are literal-containment only, so a non-literal pattern is ranked by match count. `rg` is killed after 30 s and reported as a failure. Read-only, and **exempt from the Iteration Budget Gate** | | `sources coverage [--json]` | List raw files with no source page, broken `raw_files:` references, and legacy directory/URL-only source pages | | `sources trace --raw <path>` \| `--page "<Title>"` | Trace provenance in either direction: raw file -> source page(s) -> citing pages, or page -> its sources -> their raw files | | `sources rebuild-index [--dry-run]` | Regenerate the `kb/provenance.md` reverse index (raw file -> source page -> citing pages) | @@ -96,7 +94,7 @@ never ran this step), `VERSION`, `USER.md.template`/`SOUL.md.template` plus `kb/ | `version show [--json]` | Print this instance's stack version and where it came from (development tree, or a distribution with its export date and origin). Bare `wikitool version` is an alias for this. Read-only, offline, and **exempt from the Iteration Budget Gate** | | `version check [--url U] [--timeout S] [--json]` | Ask the origin's release feed whether a newer stack exists, and whether the step crosses a compatibility boundary (`state: current\|update\|migration\|ahead`). **The only command in `wikitool` that makes a network call** - never reached implicitly from another command, needs no key, times out, and reports an unreachable feed as an error rather than as "up to date". The feed is `$WIKITOOL_UPDATE_URL`, else the release stamp's, else the built-in origin; `$WIKITOOL_UPDATE_TOKEN` is only needed if that feed is not readable anonymously. Read-only and exempt from the budget gate | | `version notes [--version X.Y.Z]` | Print one version's `CHANGES.md` entry, for use as release notes (default: this tree's `VERSION`). Read-only and exempt from the budget gate | -| `version bump --major\|--minor\|--patch --title "<...>" [--breaking "<what breaks>"] [--no-migration "<reason>"] [--dry-run]` | Raise or continue the **one running candidate** between two releases - `VERSION` gets a `-beta.N` suffix, never a second fresh number per bump. `--major/--minor/--patch` is **max-wins escalation** against the last release (patch < minor < major): a `--patch` on a MINOR candidate only advances `N`, and escalation never steps back down. Opens the matching `CHANGES.md` entry on the first bump of a candidate (heading, date, author, and a machine-managed `<!-- wikitool:bumps -->` list of every `--title` collected so far) and updates that same entry in place on every later bump of the same candidate - one entry per candidate, not one per bump. Refuses more or fewer than one part, an empty title, and a `VERSION`/newest-changelog-entry mismatch. Compatibility follows the **leftmost non-zero component** of the candidate's base, which for this stack (at `1.0.0` and up) means MAJOR: PATCH is a fix, MINOR a compatible capability, MAJOR a version that is **not a drop-in replacement** - any hand-work on update, or a downgrade that no longer works. Whether content must be migrated is a second, independent question. The bump that first escalates a candidate past the boundary requires `--breaking "<what stops working>"` and, on top of it, a migration document targeting the candidate's base or `--no-migration "<reason>"`; both lines are written once and persist over later bumps of the same candidate without being repeated, and both are refused on a bump that crosses nothing at all. Which part a change earns stays a judgment call: the command enforces that a crossing documents itself, never that the part was chosen correctly | +| `version bump --major\|--minor\|--patch --title "<...>" [--breaking "<what breaks>"] [--no-migration "<reason>"] [--migration-required] [--dry-run]` | Raise or continue the **one running candidate** between two releases - `VERSION` gets a `-beta.N` suffix, never a second fresh number per bump. `--major/--minor/--patch` is **max-wins escalation** against the last release (patch < minor < major): a `--patch` on a MINOR candidate only advances `N`, and escalation never steps back down. Opens the matching `CHANGES.md` entry on the first bump of a candidate (heading, date, author, and a machine-managed `<!-- wikitool:bumps -->` list of every `--title` collected so far) and updates that same entry in place on every later bump of the same candidate - one entry per candidate, not one per bump. Refuses more or fewer than one part, an empty title, and a `VERSION`/newest-changelog-entry mismatch. Compatibility follows the **leftmost non-zero component** of the candidate's base, which for this stack (at `1.0.0` and up) means MAJOR: PATCH is a fix, MINOR a compatible capability, MAJOR a version that is **not a drop-in replacement** - any hand-work on update, or a downgrade that no longer works. Whether content must be migrated is a second, independent question. The bump that first escalates a candidate past the boundary requires `--breaking "<what stops working>"` and, on top of it, a migration document targeting the candidate's base or `--no-migration "<reason>"`; both lines are written once and persist over later bumps of the same candidate without being repeated, and both are refused on a bump that crosses nothing at all. A later bump of the same candidate that finds out `--no-migration` was wrong after all retracts that line with `--migration-required` instead of restating `--no-migration` - refused without a migration document already targeting the new base, and without an existing `--no-migration` line to retract. Which part a change earns stays a judgment call: the command enforces that a crossing documents itself, never that the part was chosen correctly | | `version release [--title "<...>"] [--dry-run]` | Fix the running candidate: strip `VERSION`'s `-beta.N` suffix and close its `CHANGES.md` entry, ending the pre-release phase `version bump` started. Without `--title` the heading keeps whichever bump last set it; with it, the heading's title is replaced - the normal case for a candidate that collected several bump titles, since the entry wants a summarising heading rather than the most recent one. Leaves the entry's machine-managed bump-title list untouched, as the record of what happened. Commits nothing and pushes nothing (invariant 5) - the following `publish` moves `VERSION` onto `main`, which `release.yml` reacts to. Refuses when `VERSION` is already a release (no running candidate to fix), or when the changelog's newest entry does not match `VERSION` | | `migrate list [--json]` | List every migration document under `instructions/migrations/`, oldest target first, with its kind and obligation. Read-only and **exempt from the Iteration Budget Gate** | | `migrate status [--json]` | Show the migrations this instance still owes, in the order they must run: every **required** document whose `migrates_to` lies in `(kb_version, VERSION]`. `offered` documents are listed separately above the chain and never block, never count as owed, and are bounded by the applied ledger rather than by `kb_version` - taking one deliberately does not move the version, so the version cannot say whether it was taken. When a release stamp is present, also reports which shipped files this instance has since edited (from the per-file sha256 in `.wikitool-release.json`), which is what says whether an offer may be copied over or has to be reconciled by hand; without a stamp that question is reported as unanswerable rather than answered. Exits 1 only when `.wikitool-kb.json` is missing - the content's shape is a question the tool refuses to answer by guessing. Read-only and exempt from the budget gate | @@ -143,14 +141,6 @@ never ran this step), `VERSION`, `USER.md.template`/`SOUL.md.template` plus `kb/ - `lint` only reports what's mechanically verifiable. Contradictions, staleness judgment, and "what's worth writing next" remain the LLM's job; `lint` produces a markdown skeleton with a "Semantic Review" section for that. -- `confidence decay` applies a linear 1%/month reduction to `confidence_base` - since `modified`/`date`/`created`, floored at 0.2, and writes the result to - the derived `confidence` field. Keeping the undecayed anchor separate is what - makes repeated runs idempotent: decaying the stored `confidence` in place - (the pre-2026-08-13 behavior) compounded on every run, because the - elapsed-months factor kept growing while the multiplicand had already shrunk. - Pages with no `confidence_base` are skipped rather than guessed at - run - `confidence init-base --apply` once to backfill them. - **Iteration Budget Gate / Loop-Breaker** (see the root `AGENTS.md` "Gates" section): every invocation is recorded and checked in `main()` (`cli.py`) before Typer dispatches to any subcommand, so it applies uniformly without @@ -190,7 +180,7 @@ is atomic, and whether a retry is safe. | Command | Exit 1 means | Atomic? | Retry policy | |---------|--------------|---------|--------------| | `new <type>` | Duplicate page title, unknown type, invalid `--set` value, or a `raw_files` path that doesn't exist | Yes - single file write | Not transient; fix the argument and retry once. Never hand-craft the page instead | -| `touch` | Page not found; an invalid value for a field it writes; a field owned by another command (`type:`, `confidence:`, a page-ref array) or absent from the type's schema; `--add`/`--remove` on a non-array field; a `raw_files:` path that doesn't exist | Yes - single file write, and every refusal happens before it | Fix the argument and retry once. Safe to re-run as-is: `--set` and `--add` are idempotent, and `--remove` of an already-absent element succeeds while reporting it | +| `touch` | Page not found; an invalid value for a field it writes; a field owned by another command (`type:`, a page-ref array) or absent from the type's schema; `--add`/`--remove` on a non-array field; a `raw_files:` path that doesn't exist | Yes - single file write, and every refusal happens before it | Fix the argument and retry once. Safe to re-run as-is: `--set` and `--add` are idempotent, and `--remove` of an already-absent element succeeds while reporting it | | `rename` | Neither `--from` nor `--to` is a page, target title already taken, or `--from` equals `--to` | No - one write per referencing page, then the file move | Safe to retry once as-is; each page's rewrite is idempotent. Use `--dry-run` first to see the blast radius. Never fix up references by hand instead | | `rm` | Page not found, **or** other pages still reference it and `--yes` was not passed | No - one write per referencing page, then the delete | For "still referenced": show the user the inbound list, get approval, then re-run with `--yes`. Prose references it reports afterwards are an editorial fix, not a retry | | `move` | Neither or both of `--page`/`--reconcile` given, the named page not found, it has no `type:` to compute a placement from, or the destination already exists | `--page`: yes, a single file move. `--reconcile`: no - one file move per page, each idempotent | Safe to retry once as-is; a page already at its computed location is reported and left alone, and `--reconcile` only re-moves what is still misplaced. Use `--dry-run` first to see the blast radius. Never choose a directory by hand instead | @@ -204,7 +194,6 @@ is atomic, and whether a retry is safe. | `log status` | Never fails (reports 0 if `kb/log.md` is missing or empty) | Read-only | Safe to retry freely | | `lint` | Only with `--fail-on-error`: hard findings exist | Writes one report file (single atomic write) unless `--json` | Safe to retry freely, but re-run it to re-*measure*, never to re-read: the printed path holds the full report. Exit 1 means "act on the findings", not "the tool is broken" | | `search` | `rg` is not installed or did not finish within 30 s, a malformed `--field` predicate, an unknown field name, or an unknown `--backend` | Read-only | Fix the argument and retry. A timeout is a pathological pattern or an unresponsive corpus directory, not a slow answer - narrow the query or drop `--regex` rather than retrying it unchanged. An unknown field name is reported with the list of fields that do exist - it is never answered with an empty result, because that would read as "no such pages" | -| `confidence decay --apply` / `init-base --apply` | Rare I/O error mid-loop | No - one write per page | Safe to retry freely; both recompute from `confidence_base` and never compound | | `sync` | The automatic rebase hit a real conflict (git failed) | No - fetch, then at most one merge/rebase attempt, aborted cleanly on failure | For a conflict: **do not retry, do not force** - resolve manually and re-run. **Exit 42, not 1**, when the rebase-review gate needs clearance: show the user the command's full output verbatim (upstream commits, the overlapping files, their diff) and stop; re-running with `--confirm-rebase <token>` clears it, and a wrong, invented, or superseded token exits 42 again with the current state. No remote configured, or one that cannot be reached, is not a failure - reported and skipped | | `publish` | git failed, **or** `--yes`/`-y` was passed. **Exit 42, not 1**, when the Mass-Update Gate, the rebase-review gate (raised by the same reconcile `sync` performs), or the Publish-Remote Gate refuses | No - sequential git operations, but both gates run before staging | For git failures: **do not retry, do not force** - report and ask the user (the reconcile step already retried the push once on its own, if a rebase resolved the rejection). For exit 42: show the user the command's full output verbatim and stop; it names the evidence and the `--confirm <token>` or `--confirm-rebase <token>` line to re-run, and re-running without it exits 42 again. The Publish-Remote Gate is the exception with no such line: it names the push URL that would have been written to and the ones this checkout allows, and only the user resolves it | | `work new` | Neither or both of `--input`/`--key` given, `--input` outside `raw/`, a `--key` that is empty or starts with `ingest-`, or the workshop already exists | Yes - one directory with two files | A collision is not transient: resume the existing run instead, or pass `--again` if the tree itself changed. Never create a numbered variant by hand | @@ -220,7 +209,7 @@ is atomic, and whether a retry is safe. | `dist upgrade` | Missing local `VERSION`/`.wikitool-release.json`(`files`)/`.wikitool-kb.json`, a migration already outstanding against the installed machinery, a dirty working tree, a source with no `VERSION`/stamp/`files` block, a source version that is older than, equal to, or (without `--pre`) a pre-release relative to the installed one, or one or more locally changed files without `--keep-local` | **Yes for the refusal cases above - nothing is written.** Once writing starts it is a plain sequential file copy with no partial-state cleanup: an interruption mid-copy (killed process, disk full) can leave the tree part-old, part-new | For every refusal above: fix the named precondition and retry - none of them are transient. For locally changed files: reconcile them by hand and retry, or re-run with `--keep-local` to proceed and leave them untouched (repeatable - it reports the same files again on every subsequent run until they stop diverging). An interrupted write is not resumed automatically; compare the tree against the printed classification and finish or revert by hand | | `version show` / `version notes` | `VERSION` is missing or unparseable; for `notes`, no `CHANGES.md` entry names the version asked for | Read-only | Fix `VERSION`, or write the changelog entry (`version bump` writes its heading). Safe to retry | | `version check` | The feed could not be reached, answered non-JSON, or carried no `tag_name`. **Never** answers "up to date" for a question it could not ask | Read-only, no local writes | A network failure is transient - retry once, then report it. HTTP 401/403 names `$WIKITOOL_UPDATE_TOKEN`; 404 means no release exists yet or the URL points at the wrong repo | -| `version bump` | More or fewer than one of `--major/--minor/--patch`, an empty `--title`, a missing `VERSION`/`CHANGES.md`, `VERSION` and the changelog's newest entry naming different versions, an escalation to a boundary crossing without `--breaking` or with neither a migration document nor `--no-migration`, or `--breaking`/`--no-migration` on a bump that crosses nothing | No - `VERSION` then `CHANGES.md` | **Not idempotent**: a second run escalates or continues the candidate again. If the outcome is uncertain, read `VERSION` and the top of `CHANGES.md` before retrying | +| `version bump` | More or fewer than one of `--major/--minor/--patch`, an empty `--title`, a missing `VERSION`/`CHANGES.md`, `VERSION` and the changelog's newest entry naming different versions, an escalation to a boundary crossing without `--breaking` or with neither a migration document nor `--no-migration`, `--breaking`/`--no-migration` on a bump that crosses nothing, or `--migration-required` combined with `--no-migration`, on a bump with no running candidate, with no `--no-migration` line to retract, or without a migration document already targeting the new base | No - `VERSION` then `CHANGES.md` | **Not idempotent**: a second run escalates or continues the candidate again. If the outcome is uncertain, read `VERSION` and the top of `CHANGES.md` before retrying | | `version release` | A missing `VERSION`/`CHANGES.md`, `VERSION` already a release (no running candidate), or `VERSION` and the changelog's newest entry naming different versions | No - `VERSION` then `CHANGES.md` | **Not idempotent**: a second run fails outright once the suffix is gone. If the outcome is uncertain, read `VERSION` before retrying - a release-shaped `VERSION` means it already ran | | `links show` | Page not found | Read-only | Check the exact title with `search`; a wikilink target is not always the page's stem | | `migrate list` / `migrate status` | `list` never fails; `status` exits 1 when `.wikitool-kb.json` is missing or unreadable, or `VERSION` is | Read-only | For a missing declaration: run `migrate baseline <version>` once, then retry. Safe to retry freely otherwise | @@ -247,7 +236,6 @@ Run by the LLM through the skills, on this cadence: | Publish | After any change worth persisting | `publish --message "<op>: <desc>"` | | Full lint | Every 10 sources (checked via `log status`), or on request | `lint`, then carry the semantic findings into `kb/log.md` via `log append --op lint` - the report itself is gitignored | | Raw coverage check | Every 10 sources | `sources coverage` | -| Confidence decay | Every 30 days | `confidence decay --apply` | | Docs/instruction verification | After changing the CLI, a contract, or an instruction | `docs verify`, `instructions verify` | | Budget check | Any time a session feels long | `budget status` | | Retention review | Every 90 days | Manual | diff --git a/tools/README.md b/tools/README.md index ce3ed0c..5e3f625 100644 --- a/tools/README.md +++ b/tools/README.md @@ -108,7 +108,7 @@ belongs there. **Deterministic by default.** Anything an LLM would otherwise re-derive - frontmatter, index statistics, cross-reference bookkeeping, log formatting, -confidence arithmetic - is computed here so it comes out the same every time. +version arithmetic - is computed here so it comes out the same every time. **Gates are code, not prompts.** The Mass-Update Gate (`git_publish.py`) and the Iteration Budget Gate (`run_budget.py`) refuse in-process, because a diff --git a/tools/chemenu/api.py b/tools/chemenu/api.py index 914cde5..6384fb7 100644 --- a/tools/chemenu/api.py +++ b/tools/chemenu/api.py @@ -127,7 +127,7 @@ class Corpus: """`wikitool search --json`, as a value. `predicates` takes the raw `--field` strings, so the CLI and this share - one parser and cannot drift on what `confidence<0.6` means. + one parser and cannot drift on what `entity_type=system` means. """ raw = list(predicates) if not text and not raw: diff --git a/tools/chemenu/cli.py b/tools/chemenu/cli.py index 7fb6548..12aa3a6 100644 --- a/tools/chemenu/cli.py +++ b/tools/chemenu/cli.py @@ -12,7 +12,6 @@ try: from chemenu.commands import ( _util, cite_cmd, - confidence_decay, dist_cmd, doctor, docs_verify, @@ -60,7 +59,6 @@ app.add_typer(cite_cmd.app, name="cite") app.add_typer(links_cmd.app, name="links") app.add_typer(index_build.app, name="index") app.add_typer(log_append.app, name="log") -app.add_typer(confidence_decay.app, name="confidence") app.add_typer(provenance_cmd.app, name="sources") app.add_typer(raw_cmd.app, name="raw") app.add_typer(instructions_cmd.app, name="instructions") diff --git a/tools/chemenu/commands/confidence_decay.py b/tools/chemenu/commands/confidence_decay.py deleted file mode 100644 index 7a18203..0000000 --- a/tools/chemenu/commands/confidence_decay.py +++ /dev/null @@ -1,169 +0,0 @@ -"""Apply the confidence decay formula defined in the wiki contract's -"Confidence Scoring" section: confidence decays at 1% per month since last -confirmation (the page's `modified` / `date` / `created` field), floored at 0.2. - -This is pure arithmetic - previously left to the LLM's judgment even though -the contract specifies it exactly. Dry-run by default; `--apply` writes changes. - -`confidence` is a *derived* field: it is always recomputed as -`confidence_base * (1 - 0.01 * months)`, never from its own previous value. -Keeping the undecayed anchor in `confidence_base` is what makes repeated runs -idempotent - decaying the stored `confidence` in place (the pre-2026-08-13 -behavior) compounded on every run, because the elapsed-months factor kept -growing while the multiplicand had already shrunk. - -Pages with `concept_type: decision` are skipped structurally, not as an -interim measure. The formula models staleness - a claim that nobody has -re-checked in a while becomes less trustworthy - and a decision is not a -claim about the world that time can falsify. What retires a decision is a -later decision superseding it, never elapsed months on its own; that is a -category the decay formula does not have a term for, so it does not apply -one. -""" -from __future__ import annotations - -import datetime -from typing import Optional - -import typer - -from chemenu import config -from chemenu.commands._util import success -from chemenu.frontmatter_io import write_page -from chemenu.kb_scan import load_kb_pages - -app = typer.Typer(help="Apply confidence decay per the wiki contract's Confidence Scoring formula.") - -DECAY_RATE_PER_MONTH = 0.01 -FLOOR = 0.2 -DAYS_PER_MONTH = 30.44 - - -def _parse_date(value) -> Optional[datetime.date]: - if isinstance(value, datetime.datetime): - return value.date() - if isinstance(value, datetime.date): - return value - if isinstance(value, str): - try: - return datetime.date.fromisoformat(value) - except ValueError: - return None - return None - - -def compute_decay(confidence: float, last_confirmed: datetime.date, today: datetime.date) -> float: - months = max(0.0, (today - last_confirmed).days / DAYS_PER_MONTH) - decayed = confidence * (1 - DECAY_RATE_PER_MONTH * months) - return round(max(FLOOR, decayed), 2) - - -def _last_confirmed(frontmatter: dict) -> Optional[datetime.date]: - return ( - _parse_date(frontmatter.get("modified")) - or _parse_date(frontmatter.get("date")) - or _parse_date(frontmatter.get("created")) - ) - - -@app.command("init-base") -def confidence_init_base( - apply: bool = typer.Option(False, "--apply", help="Write changes; default is dry-run (preview only)"), -): - """Backfill `confidence_base` from the current `confidence` on pages that - don't have one yet. - - Needed once, when a wiki predates the derived-`confidence` model. Pages - already carrying a base are left untouched, so this is safe to re-run. - """ - pages = load_kb_pages(config.KB_DIR) - changes = [] - - for title, page in sorted(pages.items()): - confidence = page.frontmatter.get("confidence") - if confidence is None or page.frontmatter.get("confidence_base") is not None: - continue - changes.append((title, page, float(confidence))) - - if not changes: - success("Every page with a confidence already has a confidence_base.") - return - - for title, page, base in changes: - typer.echo(f"{title}: confidence_base <- {base:.2f}") - if apply: - _set_after(page.frontmatter, "confidence", "confidence_base", round(base, 2)) - write_page(page.path, page.frontmatter, page.body) - - if apply: - success(f"Set confidence_base on {len(changes)} page(s).") - else: - typer.echo(f"\n{len(changes)} page(s) would change. Re-run with --apply to write.") - - -def _set_after(frontmatter: dict, after_key: str, key: str, value) -> None: - """Insert `key` immediately after `after_key`, preserving frontmatter order - (write_page serializes in dict insertion order, and the schemas list - confidence_base right after confidence).""" - if key in frontmatter or after_key not in frontmatter: - frontmatter[key] = value - return - items = list(frontmatter.items()) - frontmatter.clear() - for existing_key, existing_value in items: - frontmatter[existing_key] = existing_value - if existing_key == after_key: - frontmatter[key] = value - - -@app.command("decay") -def confidence_decay( - apply: bool = typer.Option(False, "--apply", help="Write changes; default is dry-run (preview only)"), -): - pages = load_kb_pages(config.KB_DIR) - today = datetime.date.today() - changes = [] - missing_base = [] - - for title, page in sorted(pages.items()): - if page.frontmatter.get("concept_type") == "decision": - continue - confidence = page.frontmatter.get("confidence") - if confidence is None: - continue - base = page.frontmatter.get("confidence_base") - if base is None: - missing_base.append(title) - continue - last_confirmed = _last_confirmed(page.frontmatter) - if last_confirmed is None: - continue - new_confidence = compute_decay(float(base), last_confirmed, today) - if abs(new_confidence - round(float(confidence), 2)) >= 0.01: - changes.append((title, page, float(confidence), new_confidence)) - - if missing_base: - typer.echo( - f"Skipped {len(missing_base)} page(s) with a confidence but no confidence_base " - "- run `wikitool confidence init-base --apply` first:" - ) - for title in missing_base[:10]: - typer.echo(f" - {title}") - if len(missing_base) > 10: - typer.echo(f" ... and {len(missing_base) - 10} more") - typer.echo("") - - if not changes: - success("No confidence values need decaying.") - return - - for title, page, old, new in changes: - typer.echo(f"{title}: {old:.2f} -> {new:.2f}") - if apply: - page.frontmatter["confidence"] = new - write_page(page.path, page.frontmatter, page.body) - - if apply: - success(f"Updated confidence on {len(changes)} page(s).") - else: - typer.echo(f"\n{len(changes)} page(s) would change. Re-run with --apply to write.") diff --git a/tools/chemenu/commands/docs_verify.py b/tools/chemenu/commands/docs_verify.py index a65b28b..63d99e5 100644 --- a/tools/chemenu/commands/docs_verify.py +++ b/tools/chemenu/commands/docs_verify.py @@ -209,7 +209,7 @@ def check_cli_readme() -> list[str]: table, and every command documented there must exist. The reverse check matches a documented cell against the full registered - command path (e.g. `xref add`, `confidence init-base`), not just its first + command path (e.g. `xref add`, `migrate verify`), not just its first token - checking only the top-level word would let a typo'd or invented subcommand (`xref frobnicate`) sit undetected next to a real command group (`xref`) forever. diff --git a/tools/chemenu/commands/doctor.py b/tools/chemenu/commands/doctor.py index 6decc75..e63cd1c 100644 --- a/tools/chemenu/commands/doctor.py +++ b/tools/chemenu/commands/doctor.py @@ -218,7 +218,7 @@ def check_conventions() -> Check: `kb/CONVENTIONS.md` carries the decisions `kb/CONTRACT.md` deliberately no longer makes: the KB language and the headings its two generated regions - render under, the tone examples, the confidence rubric, the naming forms. + render under, the tone examples, the hedging rule, the naming forms. `FAIL` rather than `WARN` because those decisions bind every page, and because it has the same two failure modes the personalization pair has: the diff --git a/tools/chemenu/commands/index_build.py b/tools/chemenu/commands/index_build.py index 3e14ea6..3abba04 100644 --- a/tools/chemenu/commands/index_build.py +++ b/tools/chemenu/commands/index_build.py @@ -132,7 +132,7 @@ def build_index_map(collections: list[Collection]) -> str: "To *find* a page, search instead of reading this file:", "", '- `tools/wikitool search "<text>"` - ranked text search, with summaries', - "- `tools/wikitool search --field entity_type=system --field 'confidence<0.6'`" + "- `tools/wikitool search --field entity_type=system --field '!sources'`" " - structured query over frontmatter", "", "The page tables live in a generated `INDEX.md` inside each collection, linked below.", diff --git a/tools/chemenu/commands/new_page.py b/tools/chemenu/commands/new_page.py index 13a9484..0e32f55 100644 --- a/tools/chemenu/commands/new_page.py +++ b/tools/chemenu/commands/new_page.py @@ -77,8 +77,8 @@ def _build_frontmatter( schema's own `default:` where declared, an empty list for arrays), or are omitted entirely if optional with no sensible default (e.g. `source_url`). This is what lets frontmatter shape - and scaffold-time - defaults like `provenance: general` or `confidence: 0.5` - follow the - schema instead of being hand-declared per CLI command. + defaults like `provenance: general` - follow the schema instead of being + hand-declared per CLI command. """ frontmatter: Dict[str, Any] = {"type": type_path} for field_name, field_schema in (schema or {}).get("properties", {}).items(): diff --git a/tools/chemenu/commands/search.py b/tools/chemenu/commands/search.py index d2e4838..4bda04d 100644 --- a/tools/chemenu/commands/search.py +++ b/tools/chemenu/commands/search.py @@ -11,7 +11,7 @@ Two halves, deliberately kept separate: `chemenu/search/`. - Frontmatter predicates (`--field`) are evaluated here, in-process, on the structured YAML rather than on its rendering. With no text at all this is a - pure structured query, which is how "systems below 0.6 confidence, oldest + pure structured query, which is how "systems with no sources, oldest first" is asked without a second command. Scope is `kb/` only. `instructions/` is discovered through @@ -101,7 +101,7 @@ def search_command( ), limit: int = typer.Option(20, "--limit", help="Maximum number of results. 0 for no limit."), sort: str = typer.Option( - None, "--sort", help="Sort by a result field; prefix with '-' to reverse, e.g. -confidence." + None, "--sort", help="Sort by a result field; prefix with '-' to reverse, e.g. -modified." ), backend: str = typer.Option( None, diff --git a/tools/chemenu/commands/touch.py b/tools/chemenu/commands/touch.py index 8efb1f6..c2eda29 100644 --- a/tools/chemenu/commands/touch.py +++ b/tools/chemenu/commands/touch.py @@ -1,12 +1,12 @@ """`wikitool touch` - update the self-describing frontmatter fields of a page. -`modified:`, `summary:`, `provenance:` and `confidence_base:` describe the page -itself rather than its relationships, so they were the one part of frontmatter -the skills still told the LLM to edit by hand - a carve-out in the otherwise -absolute "never hand-write frontmatter" rule. Bumping a date and rewriting a -one-line summary are mechanical, so they belong here: the field name is chosen -from the type's own schema (`modified` for entity/concept, `date` for source), -and the result is schema-validated before it is written. +`modified:`, `summary:` and `provenance:` describe the page itself rather than +its relationships, so they were the one part of frontmatter the skills still +told the LLM to edit by hand - a carve-out in the otherwise absolute "never +hand-write frontmatter" rule. Bumping a date and rewriting a one-line summary +are mechanical, so they belong here: the field name is chosen from the type's +own schema (`modified` for entity/concept, `date` for source), and the result +is schema-validated before it is written. Only `modified:` is bumped automatically. A source's `date:` is the publication date of the material itself, not a record of when we last edited the page, so it @@ -49,10 +49,6 @@ UNSETTABLE = { "changing it changes the page's schema *and* the directory it belongs in - " "see instructions/page-lifecycle.md" ), - "confidence": ( - "derived, not authored: set `--confidence-base` and run " - "`wikitool confidence decay --apply` to recompute it" - ), "related": "page-reference field - use `wikitool xref add` / `xref remove`", "sources": ( "page-reference field - written from the other side by " @@ -193,12 +189,6 @@ def touch_command( provenance: Optional[str] = typer.Option( None, "--provenance", help="Replace the page's provenance marker (sourced|general|mixed)" ), - confidence_base: Optional[float] = typer.Option( - None, - "--confidence-base", - help="Re-assess the page's undecayed confidence (0.0-1.0). `confidence` itself is derived - " - "run `wikitool confidence decay --apply` afterwards to recompute it.", - ), date: Optional[str] = typer.Option( None, "--date", help="Date to record (YYYY-MM-DD). `modified:` defaults to today; a source's " @@ -230,9 +220,9 @@ def touch_command( ): """Bump a page's `modified:` date and optionally rewrite its other frontmatter fields. - `--summary`/`--provenance`/`--confidence-base` are shorthands for the three - fields worth their own flag; `--set`/`--add`/`--remove` reach every other - field the page's type declares. Before they existed, a field `new` wrote + `--summary`/`--provenance` are shorthands for the two fields worth their + own flag; `--set`/`--add`/`--remove` reach every other field the page's + type declares. Before they existed, a field `new` wrote once - `tags:`, `raw_files:` - could never be corrected: `touch` did not know it, hand-editing frontmatter is what the tool exists to prevent, and deleting the page to recreate it breaks every reference already pointing at @@ -291,12 +281,6 @@ def touch_command( frontmatter["provenance"] = provenance touched.add("provenance") changes.append(f"provenance: {page.frontmatter.get('provenance')} -> {provenance}") - if confidence_base is not None: - frontmatter["confidence_base"] = round(confidence_base, 2) - touched.add("confidence_base") - changes.append( - f"confidence_base: {page.frontmatter.get('confidence_base')} -> {round(confidence_base, 2)}" - ) # --set/--add/--remove last, so an explicit field always wins over the # shorthand flags rather than depending on option order. diff --git a/tools/chemenu/commands/version_cmd.py b/tools/chemenu/commands/version_cmd.py index 912da4e..4b3db2d 100644 --- a/tools/chemenu/commands/version_cmd.py +++ b/tools/chemenu/commands/version_cmd.py @@ -203,6 +203,13 @@ def bump_command( "--no-migration", help="Why the escalation to a boundary crossing needs no content migration (recorded in CHANGES.md)", ), + migration_required: bool = typer.Option( + False, + "--migration-required", + help="Retract this candidate's earlier --no-migration line: a migration is needed after all. " + "Requires a migration document already targeting the new base, and refuses when the entry " + "carries no --no-migration line to retract.", + ), dry_run: bool = typer.Option(False, "--dry-run", help="Report the change without writing"), ): """Raise or continue the running candidate, and open or update its @@ -221,7 +228,13 @@ def bump_command( migration document for the new base or `--no-migration "<reason>"`. Both lines are written into the entry once and then persist across every later bump at the same stage: a follow-up bump need not repeat them, and passing - either on a bump that crosses nothing at all is refused.""" + either on a bump that crosses nothing at all is refused. + + A later bump of the same candidate that finds out `--no-migration` was + wrong after all retracts it with `--migration-required` - write the + migration document first, then re-run with this flag instead of + `--no-migration`. There is no other way to take the line back: it is + machine-written, and invariant 1 forbids hand-editing it.""" selected = [name for name, chosen in (("major", major), ("minor", minor), ("patch", patch)) if chosen] if len(selected) != 1: fail("Pass exactly one of --major / --minor / --patch") @@ -299,6 +312,34 @@ def bump_command( ) return + if migration_required and no_migration: + fail("--migration-required and --no-migration contradict each other on the same bump.") + return + if migration_required and not current.is_prerelease: + fail( + "--migration-required only makes sense on a bump that continues an already-open " + "candidate - there is no running candidate here to retract a no-migration line from." + ) + return + if migration_required: + current_section = version_mod.changes_section(text, current) or "" + if version_mod.MIGRATION_NONE_MARKER not in current_section: + fail( + f"{current}'s {version_mod.CHANGES_FILENAME} entry carries no " + f"`{version_mod.MIGRATION_NONE_MARKER}` line to retract - nothing to do." + ) + return + from chemenu import kb_state + + if not any(m.target == new_version.base for m in kb_state.load_migrations()): + fail( + f"--migration-required retracts the no-migration line, so a migration document must " + f"target {new_version.base} first - write one under " + f"{rel_path(kb_state.migrations_dir())}/{new_version.base}-<slug>.md " + f"(see instructions/migrate-corpus.md), then re-run with --migration-required." + ) + return + if dry_run: success(f"Dry run: {current} -> {new_version}{boundary}. Nothing written.") return @@ -309,6 +350,7 @@ def bump_command( text, new_version, today_iso(), title.strip(), author, no_migration_reason=no_migration.strip() if no_migration else None, breaking_reason=breaking.strip() if breaking else None, + migration_required=migration_required, ), encoding="utf-8", ) diff --git a/tools/chemenu/conventions.py b/tools/chemenu/conventions.py index f12394b..67c61f7 100644 --- a/tools/chemenu/conventions.py +++ b/tools/chemenu/conventions.py @@ -2,12 +2,12 @@ `kb/CONTRACT.md` and this file answer two different questions. The contract holds what the code enforces - what a collection is, which files are generated, -how `provenance:` and `confidence_base` work - and is identical in every -instance, so `dist export` ships it verbatim. `kb/CONVENTIONS.md` holds what -each instance decides for itself: the language its pages are written in, the -relationship-label vocabulary, the tone examples, the confidence rubric, the -ADR prefix. The distribution ships only `kb/CONVENTIONS.md.template`, exactly -the split `USER.md`/`SOUL.md` already use one directory up. +how `provenance:` works - and is identical in every instance, so `dist export` +ships it verbatim. `kb/CONVENTIONS.md` holds what each instance decides for +itself: the language its pages are written in, the relationship-label +vocabulary, the tone examples, the hedging rule, the ADR prefix. The +distribution ships only `kb/CONVENTIONS.md.template`, exactly the split +`USER.md`/`SOUL.md` already use one directory up. Only one part of it is machine-read, and it is the part that used to be Python: the three section headings `xref add` and `cite add` write. While diff --git a/tools/chemenu/corpus_diff.py b/tools/chemenu/corpus_diff.py index d5a1be5..e6d0469 100644 --- a/tools/chemenu/corpus_diff.py +++ b/tools/chemenu/corpus_diff.py @@ -41,7 +41,6 @@ STRUCTURAL_FIELDS = ( "type", "created", "date", - "confidence_base", "provenance", "source_type", "source_language", diff --git a/tools/chemenu/frontmatter_io.py b/tools/chemenu/frontmatter_io.py index 0bd1aa8..44ada65 100644 --- a/tools/chemenu/frontmatter_io.py +++ b/tools/chemenu/frontmatter_io.py @@ -1,6 +1,6 @@ """Read/write markdown files with YAML frontmatter, matching the formatting conventions already used across wiki/ (inline flow-style lists, unquoted -dates, two-decimal confidence values). +dates). We deliberately avoid a generic yaml.dump() for the frontmatter block because PyYAML's default block-style output does not match the existing convention @@ -104,10 +104,10 @@ def read_page_with_error(path: Path) -> tuple[dict[str, Any], str, str | None]: permissive handed back instead of dropped. A page whose YAML is broken reads as `{}`, and a `{}` page then has no - `confidence` and no `kind`: it drops out of `--field confidence<0.6` - - precisely the query meant to find pages in bad shape - while looking to the - caller like a page that simply did not match. Returning the reason is what - lets a caller say so instead of losing the page quietly. + `sources` and no `kind`: it drops out of `--field '!sources'` - precisely + the query meant to find pages in bad shape - while looking to the caller + like a page that simply did not match. Returning the reason is what lets a + caller say so instead of losing the page quietly. """ text = path.read_text(encoding="utf-8") match = FRONTMATTER_RE.match(text) @@ -168,9 +168,13 @@ def _format_scalar(value: Any, flow: bool = False) -> str: return '""' if isinstance(value, bool): return "true" if value else "false" - if isinstance(value, float): - return f"{value:.2f}" - if isinstance(value, int): + if isinstance(value, (int, float)): + # Bare, not routed through the string-quoting logic below: that logic + # asks "would this text read back as the same *string*", which is the + # wrong question for a value that was never a string - a real float + # like 0.9 would fail that probe (it reads back as a float) and get + # wrongly quoted into the string "0.9", silently changing its type on + # the next read. return str(value) if isinstance(value, (datetime.date, datetime.datetime)): return value.isoformat() diff --git a/tools/chemenu/lint_core.py b/tools/chemenu/lint_core.py index 674ba17..0fc6920 100644 --- a/tools/chemenu/lint_core.py +++ b/tools/chemenu/lint_core.py @@ -15,7 +15,6 @@ from __future__ import annotations from datetime import date from pathlib import Path -from typing import Optional from collections import Counter @@ -144,59 +143,6 @@ def unclassified_source_pages(pages: dict[str, Page]) -> list[dict]: ] -# Capture-field ceilings (Gitea #67, kb/CONTRACT.md § "Confidence against -# source standing"): the weakest `authority`/`fidelity` among a page's cited -# sources bounds how high its `confidence_base` may honestly sit. Stack -# vocabulary, not instance configuration - `fidelity`/`authority` are defined -# by `raw/CONTRACT.md`, not by `kb/CONVENTIONS.md`. `unknown` and every axis -# value not listed here carry no ceiling: a backfilled "we don't know" is not -# a claim about the source, and `normative`/`verbatim`/`published` are simply -# not weaker than hand-set confidence gets to be. -_AUTHORITY_CEILING = {"reporting": 0.8, "opinion": 0.6} -_FIDELITY_CEILING = {"secondhand": 0.7, "nontextual": 0.7} - - -def _capture_ceiling(source_pages: list[Page]) -> Optional[float]: - """The tightest ceiling implied by `source_pages`' capture fields, or - None if none of them carry a value with a ceiling at all.""" - ceilings = [ - ceiling - for src in source_pages - for field_map, value in ( - (_AUTHORITY_CEILING, src.frontmatter.get("authority")), - (_FIDELITY_CEILING, src.frontmatter.get("fidelity")), - ) - if (ceiling := field_map.get(value)) is not None - ] - return min(ceilings) if ceilings else None - - -def confidence_exceeds_source_standing(pages: dict[str, Page]) -> list[dict]: - """Pages whose `confidence_base` sits above what their cited sources' - capture standing can honestly carry. - - Advisory, not a formula (kb/CONTRACT.md § "Confidence against source - standing" has the reasoning): `confidence_base` stays a human judgment, - and authority is a ceiling a page may sit under by independent - verification, not a value a formula could compute outright. - """ - findings: list[dict] = [] - for title, page in sorted(pages.items()): - if page.kind not in ("entity", "concept"): - continue - confidence_base = page.frontmatter.get("confidence_base") - source_titles = page.frontmatter.get("sources") or [] - if confidence_base is None or not source_titles: - continue - source_pages = [ - pages[t] for t in source_titles if t in pages and pages[t].kind == "source" - ] - ceiling = _capture_ceiling(source_pages) - if ceiling is not None and confidence_base > ceiling: - findings.append({"page": title, "confidence_base": confidence_base, "ceiling": ceiling}) - return findings - - def nested_pages(kb_dir: Path, pages: dict[str, Page]) -> list[dict]: """Report form of `find_nested_pages`: `{"page", "at", "depth"}` per finding. @@ -545,7 +491,6 @@ def run_lint(kb_dir: Path) -> dict: "nested_pages": nested, "unsharded_collections": unsharded_collections(kb_dir, pages), "unclassified_source_pages": unclassified_source_pages(pages), - "confidence_exceeds_source_standing": confidence_exceeds_source_standing(pages), "uncovered_raw_files": find_uncovered_raw_files(config.RAW_DIR, pages), "broken_raw_refs": find_broken_raw_refs(pages), "duplicate_raw_file_owners": find_duplicate_raw_file_owners(pages), @@ -645,13 +590,6 @@ def render_markdown(report: dict) -> str: lambda i: f"[[{i['page']}]] - `wikitool touch --set source_type=<value>` once its " "category is known", ) - _section( - lines, "Confidence Above Source Standing (ceiling, not a formula) - recommendation, not an error", - report.get("confidence_exceeds_source_standing", []), - lambda i: f"[[{i['page']}]] confidence_base={i['confidence_base']} exceeds the " - f"{i['ceiling']} ceiling its cited sources' fidelity/authority carry - " - "kb/CONTRACT.md § \"Confidence against source standing\"", - ) _section( lines, "Uncovered Raw Files (no source page)", report["uncovered_raw_files"], lambda i: f"`{i}`", @@ -819,13 +757,6 @@ def default_report_path(report: dict) -> Path: # would penalise the honest "I don't know yet" that the slot exists to allow, # where the old silent `default: notes` hid the same uncertainty for free. # -# `confidence_exceeds_source_standing` is advisory by construction, like -# `unsharded_collections` above: `confidence_base` stays a hand-set judgment -# call (kb/CONTRACT.md § Confidence), and a source's capture standing is a -# ceiling a page may sit under by independent verification, not a value a -# formula could compute outright - see kb/CONTRACT.md § "Confidence against -# source standing" (Gitea #67). -# # `malformed_edges` and `unbalanced_markers` are hard from the start: neither # describes an unconverted page, only a broken one. # diff --git a/tools/chemenu/mcp/server.py b/tools/chemenu/mcp/server.py index 303ea4c..ba642d4 100644 --- a/tools/chemenu/mcp/server.py +++ b/tools/chemenu/mcp/server.py @@ -125,9 +125,9 @@ def build_server( name="search", description=( "Find pages in kb/ by text, by frontmatter, or by both. Returns " - "title, path, kind, summary and confidence per hit, so a result can " - "be judged without fetching the page. Prefer this over listing " - "files: the answer is a few hundred tokens instead of a whole index." + "title, path, kind and summary per hit, so a result can be judged " + "without fetching the page. Prefer this over listing files: the " + "answer is a few hundred tokens instead of a whole index." ), ) def search( @@ -140,9 +140,9 @@ def build_server( """Search the wiki. `predicates` are frontmatter filters in the CLI's own `--field` syntax, - ANDed: `confidence<0.6`, `entity_type=system`, `tags~k8s`, `source_url:*` - (present), `!source_url` (absent). With no `query` this is a pure - structured query over frontmatter. + ANDed: `entity_type=system`, `tags~k8s`, `source_url:*` (present), + `!source_url` (absent). With no `query` this is a pure structured + query over frontmatter. `regex` applies the pattern with ripgrep's linear engine. It is off by default, so an accidental `.*` is a literal. diff --git a/tools/chemenu/page.py b/tools/chemenu/page.py index bdd0452..d03d6d5 100644 --- a/tools/chemenu/page.py +++ b/tools/chemenu/page.py @@ -19,8 +19,8 @@ class Page: # Why the frontmatter above is empty, when it is empty for a reason. A page # whose YAML does not parse reads back as `{}`, and a `{}` page has no - # `confidence` and no `kind`: it then drops out of `--field confidence<0.6` - # - the query whose whole purpose is to find pages in bad shape - looking + # `sources` and no `kind`: it then drops out of `--field '!sources'` - the + # query whose whole purpose is to find pages in bad shape - looking # exactly like a page that did not match. Loaders that know the reason put # it here so a caller can report the page instead of losing it. frontmatter_error: Optional[str] = None diff --git a/tools/chemenu/search/base.py b/tools/chemenu/search/base.py index 89579f4..d68a62a 100644 --- a/tools/chemenu/search/base.py +++ b/tools/chemenu/search/base.py @@ -2,8 +2,8 @@ A backend answers the *text* half of a query and nothing else. Frontmatter predicates are applied afterwards, in-process, by `filters.py` - so a new -backend never has to reimplement `confidence>=0.8`, and filtering behaves -identically no matter who found the page. +backend never has to reimplement `modified>=2026-01-01`, and filtering +behaves identically no matter who found the page. """ from __future__ import annotations diff --git a/tools/chemenu/search/filters.py b/tools/chemenu/search/filters.py index 432b631..4e571e0 100644 --- a/tools/chemenu/search/filters.py +++ b/tools/chemenu/search/filters.py @@ -2,10 +2,10 @@ Predicates run in-process against `Page` objects rather than being pushed into the backend. Two reasons: every backend gets the same filter semantics for -free, and the values being filtered on (`confidence`, `modified`, `tags`) are +free, and the values being filtered on (`modified`, `tags`, `provenance`) are structured YAML, not text - a lexical backend can only ever match their -*rendering*, which is how `confidence: 0.8` starts matching a query for `0.8` -in a page's body. +*rendering*, which is how `modified: 2026-08-01` starts matching a query for +`2026-08-01` in a page's body. """ from __future__ import annotations @@ -18,8 +18,8 @@ from chemenu.errors import ValidationError from chemenu.page import Page from chemenu.search.types import Predicate -# Longest first: `>=` must be tried before `>`, or `confidence>=0.8` parses as -# field `confidence` op `>` value `=0.8`. +# Longest first: `>=` must be tried before `>`, or `modified>=2026-08-01` +# parses as field `modified` op `>` value `=2026-08-01`. _COMPARISON_OPS = (">=", "<=", ">", "<", "~", "=") # Fields that are not in the frontmatter but are what an agent actually asks diff --git a/tools/chemenu/search/ripgrep.py b/tools/chemenu/search/ripgrep.py index dfb5035..d166836 100644 --- a/tools/chemenu/search/ripgrep.py +++ b/tools/chemenu/search/ripgrep.py @@ -215,7 +215,6 @@ def build_hit( tags = page.frontmatter.get("tags") or [] modified = page.frontmatter.get("modified") or page.frontmatter.get("date") - confidence = page.frontmatter.get("confidence") return SearchHit( title=page.title, @@ -225,7 +224,6 @@ def build_hit( subtype=page.subtype, summary=summary, tags=[str(t) for t in tags] if isinstance(tags, (list, tuple)) else [str(tags)], - confidence=float(confidence) if isinstance(confidence, (int, float)) else None, modified=str(modified) if modified else None, score=score, backend=backend, diff --git a/tools/chemenu/search/service.py b/tools/chemenu/search/service.py index d0a8382..324f10c 100644 --- a/tools/chemenu/search/service.py +++ b/tools/chemenu/search/service.py @@ -52,11 +52,12 @@ def load_pages_by_path(kb_dir: Path | None = None, root: Path | None = None) -> def unreadable_pages(pages: dict[str, Page]) -> list[dict[str, str]]: """The pages whose frontmatter could not be used, as `{path, reason}`. - Reported rather than swallowed. Such a page has no `confidence` and no - `kind`, so it silently drops out of every positive `--field` predicate - - including the low-confidence sweep that exists to find pages in exactly - that state. Saying nothing makes it look like a page that did not match; - an empty block is excluded, because a page can legitimately carry one. + Reported rather than swallowed. Such a page has no `kind` and no readable + frontmatter at all, so it silently drops out of every positive `--field` + predicate - including the sweeps that exist to find pages in exactly that + state (`!sources`, `provenance=general`). Saying nothing makes it look + like a page that did not match; an empty block is excluded, because a + page can legitimately carry one. """ return [ {"path": key, "reason": page.frontmatter_error} @@ -77,7 +78,7 @@ def _sort_key(hit: SearchHit, field: str): def sort_hits(hits: list[SearchHit], sort: str | None) -> list[SearchHit]: - """Sort by a hit field. A leading `-` reverses, e.g. `--sort -confidence`.""" + """Sort by a hit field. A leading `-` reverses, e.g. `--sort -modified`.""" if not sort: return hits descending = sort.startswith("-") diff --git a/tools/chemenu/search/types.py b/tools/chemenu/search/types.py index 1f549a6..590e28f 100644 --- a/tools/chemenu/search/types.py +++ b/tools/chemenu/search/types.py @@ -7,7 +7,7 @@ from typing import Any, Optional @dataclass(frozen=True) class Predicate: - """One frontmatter condition, e.g. `entity_type=system` or `confidence>=0.8`.""" + """One frontmatter condition, e.g. `entity_type=system` or `modified>=2026-01-01`.""" field: str op: str # one of: = ~ >= <= > < exists absent @@ -24,8 +24,8 @@ class Predicate: @dataclass class SearchQuery: """A search request. `text` is optional: with no text this is a pure - structured query over frontmatter, which is how "every system with - confidence below 0.6" is asked without inventing a second command.""" + structured query over frontmatter, which is how "every system with no + sources" is asked without inventing a second command.""" text: Optional[str] = None predicates: tuple[Predicate, ...] = () @@ -58,7 +58,6 @@ class SearchHit: subtype: Optional[str] = None summary: str = "" tags: list[str] = field(default_factory=list) - confidence: Optional[float] = None modified: Optional[str] = None score: float = 0.0 backend: str = "" @@ -73,7 +72,6 @@ class SearchHit: "subtype": self.subtype, "summary": self.summary, "tags": self.tags, - "confidence": self.confidence, "modified": self.modified, "score": round(self.score, 3), "backend": self.backend, diff --git a/tools/chemenu/tests/conftest.py b/tools/chemenu/tests/conftest.py index 82d9f34..4f832b7 100644 --- a/tools/chemenu/tests/conftest.py +++ b/tools/chemenu/tests/conftest.py @@ -278,7 +278,7 @@ def kb_dir(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> Path: { "type": "types/entity.md", "entity_type": "system", "tags": ["server"], "created": "2026-07-31", "modified": "2026-07-31", - "related": ["Borealis"], "sources": [], "confidence": 0.9, + "related": ["Borealis"], "sources": [], "summary": "Server hosting DocStore with ZFS storage", }, "\n# aurora\n\n## Description\n\nHosts things.\n\n## Relationships\n\n- **Related to:** [[Borealis]]\n\n## See Also\n\n- [[Borealis]]\n", @@ -288,7 +288,7 @@ def kb_dir(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> Path: { "type": "types/entity.md", "entity_type": "system", "tags": ["workstation"], "created": "2026-08-02", "modified": "2026-08-02", - "related": ["aurora"], "sources": [], "confidence": 0.9, + "related": ["aurora"], "sources": [], }, "\n# Borealis\n\n## Description\n\nA workstation.\n\n## Relationships\n\n- **Related to:** [[aurora]]\n", ) @@ -297,7 +297,7 @@ def kb_dir(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> Path: { "type": "types/entity.md", "entity_type": "tool", "tags": [], "created": "2026-07-25", "modified": "2026-07-25", - "related": [], "sources": [], "confidence": 0.8, + "related": [], "sources": [], }, "\n# gdeploy\n\n## Description\n\nDeploy tool.\n", ) @@ -306,7 +306,7 @@ def kb_dir(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> Path: { "type": "types/concept.md", "concept_type": "protocol", "tags": [], "created": "2026-07-25", "modified": "2026-07-25", - "related": [], "sources": [], "confidence": 0.7, + "related": [], "sources": [], }, "\n# Modbus\n\n## Definition\n\nIndustrial protocol.\n", ) diff --git a/tools/chemenu/tests/test_api.py b/tools/chemenu/tests/test_api.py index 59d1eeb..3aa0235 100644 --- a/tools/chemenu/tests/test_api.py +++ b/tools/chemenu/tests/test_api.py @@ -33,7 +33,7 @@ def foreign_corpus(tmp_path: Path) -> Path: kb.mkdir(parents=True) (root / "kb" / "entities" / "COLLECTION.md").write_text("# entities\n", encoding="utf-8") (kb / "Peregrine.md").write_text( - "---\ntype: types/entity.md\nentity_type: system\nconfidence: 0.42\n" + "---\ntype: types/entity.md\nentity_type: system\n" "summary: A system that exists only in this fixture.\n---\n\n" "# Peregrine\n\nPeregrine is the fixture's own system.\n", encoding="utf-8", @@ -81,7 +81,7 @@ def test_no_path_of_this_checkout_is_read_while_a_foreign_root_is_set(foreign_co monkey.setattr(Path, "rglob", watched_rglob) try: Corpus(foreign_corpus).search("Peregrine") - Corpus(foreign_corpus).search(predicates=["confidence<0.6"]) + Corpus(foreign_corpus).search(predicates=["entity_type=system"]) finally: monkey.undo() diff --git a/tools/chemenu/tests/test_confidence_decay.py b/tools/chemenu/tests/test_confidence_decay.py deleted file mode 100644 index 84cdab4..0000000 --- a/tools/chemenu/tests/test_confidence_decay.py +++ /dev/null @@ -1,89 +0,0 @@ -import datetime - -import pytest - -from chemenu import config -from chemenu.commands import confidence_decay -from chemenu.commands.confidence_decay import FLOOR, compute_decay -from chemenu.frontmatter_io import read_page, write_page - - -def test_no_decay_at_zero_months(): - today = datetime.date(2026, 8, 2) - assert compute_decay(0.9, today, today) == 0.9 - - -def test_decay_after_ten_months(): - today = datetime.date(2026, 8, 2) - last_confirmed = datetime.date(2025, 10, 2) # ~10 months earlier - result = compute_decay(0.9, last_confirmed, today) - # 0.9 * (1 - 0.01 * ~10) ~= 0.9 * 0.90 = 0.81 - assert 0.80 <= result <= 0.82 - - -def test_decay_floors_at_0_2(): - today = datetime.date(2026, 8, 2) - long_ago = datetime.date(2015, 1, 1) - result = compute_decay(0.5, long_ago, today) - assert result == FLOOR - - -@pytest.fixture -def decay_wiki(kb_dir, monkeypatch): - monkeypatch.setattr(config, "KB_DIR", kb_dir) - return kb_dir - - -def test_init_base_backfills_from_current_confidence(decay_wiki): - confidence_decay.confidence_init_base(apply=True) - frontmatter, _ = read_page(decay_wiki / "entities/systems/aurora.md") - assert frontmatter["confidence_base"] == 0.9 - # Written next to `confidence`, keeping the schema's field order. - keys = list(frontmatter) - assert keys.index("confidence_base") == keys.index("confidence") + 1 - - -def test_init_base_is_idempotent(decay_wiki): - confidence_decay.confidence_init_base(apply=True) - before = (decay_wiki / "entities/systems/aurora.md").read_text(encoding="utf-8") - confidence_decay.confidence_init_base(apply=True) - assert (decay_wiki / "entities/systems/aurora.md").read_text(encoding="utf-8") == before - - -def test_decay_is_idempotent_across_runs(decay_wiki): - """The regression that motivated `confidence_base`: decaying the stored - `confidence` in place compounded on every run, because the elapsed-months - factor kept growing while the multiplicand had already shrunk.""" - confidence_decay.confidence_init_base(apply=True) - confidence_decay.confidence_decay(apply=True) - after_first = (decay_wiki / "entities/systems/aurora.md").read_text(encoding="utf-8") - confidence_decay.confidence_decay(apply=True) - confidence_decay.confidence_decay(apply=True) - assert (decay_wiki / "entities/systems/aurora.md").read_text(encoding="utf-8") == after_first - - -def test_decay_skips_pages_without_a_base(decay_wiki): - """Falling back to the stored `confidence` would silently reintroduce the - compounding bug, so pages without a base are skipped instead.""" - confidence_decay.confidence_decay(apply=True) - frontmatter, _ = read_page(decay_wiki / "entities/systems/aurora.md") - assert frontmatter["confidence"] == 0.9 - - -def test_decay_skips_decision_pages(decay_wiki): - """A decision is not falsified by elapsed time, only by a later decision - superseding it - `concept_type: decision` is a categorical skip, not - something an old `modified` date should ever decay (Gitea #38).""" - decision_path = decay_wiki / "concepts" / "some-decision.md" - write_page( - decision_path, - { - "type": "types/concept.md", "concept_type": "decision", - "tags": [], "created": "2015-01-01", "modified": "2015-01-01", - "related": [], "sources": [], "confidence": 0.9, "confidence_base": 0.9, - }, - "\n# some-decision\n", - ) - confidence_decay.confidence_decay(apply=True) - frontmatter, _ = read_page(decision_path) - assert frontmatter["confidence"] == 0.9 diff --git a/tools/chemenu/tests/test_corpus_diff.py b/tools/chemenu/tests/test_corpus_diff.py index 3ff77ce..3fd1cb3 100644 --- a/tools/chemenu/tests/test_corpus_diff.py +++ b/tools/chemenu/tests/test_corpus_diff.py @@ -30,7 +30,6 @@ def page(body: str, **frontmatter) -> Page: "entity_type": "system", "created": "2026-07-31", "provenance": "sourced", - "confidence_base": 0.9, "related": ["Borealis"], "sources": ["Source - Aurora"], } diff --git a/tools/chemenu/tests/test_docs_verify.py b/tools/chemenu/tests/test_docs_verify.py index ef9a6d5..7db91bf 100644 --- a/tools/chemenu/tests/test_docs_verify.py +++ b/tools/chemenu/tests/test_docs_verify.py @@ -16,7 +16,7 @@ def test_registered_commands_include_groups_and_top_level(): assert "new" in commands assert "touch" in commands assert "xref add" in commands - assert "confidence init-base" in commands + assert "migrate verify" in commands assert "docs verify" in commands diff --git a/tools/chemenu/tests/test_frontmatter_io.py b/tools/chemenu/tests/test_frontmatter_io.py index 96ba95f..b880207 100644 --- a/tools/chemenu/tests/test_frontmatter_io.py +++ b/tools/chemenu/tests/test_frontmatter_io.py @@ -94,7 +94,15 @@ def test_scalar_quoting_is_unchanged_by_the_flow_fix(tmp_path): up a diff on its next touch.""" assert dump_frontmatter({"year": "1945"}) == "year: '1945'" assert dump_frontmatter({"summary": "He said hi"}) == "summary: He said hi" - assert dump_frontmatter({"confidence": 0.85}) == "confidence: 0.85" + + +def test_a_real_float_is_written_bare_not_quoted(): + """A float is not a string that happens to look numeric - the opposite of + what `year: '1945'` above tests. Routing it through the string-quoting + logic would ask "does '0.9' read back as the string '0.9'", which is + false (it reads back as the float 0.9), so it would get wrongly quoted - + silently turning the value into a string on the next read.""" + assert dump_frontmatter({"weight": 0.9}) == "weight: 0.9" # --- Read-path limits (Gitea #33) ------------------------------------------- diff --git a/tools/chemenu/tests/test_index_build.py b/tools/chemenu/tests/test_index_build.py index c91d537..5aa574e 100644 --- a/tools/chemenu/tests/test_index_build.py +++ b/tools/chemenu/tests/test_index_build.py @@ -235,7 +235,7 @@ def test_rebuild_warns_about_a_nested_page_without_failing(kb_dir, capsys): kb_dir / "entities/projects/someowner/nested-tool.md", {"type": "types/entity.md", "entity_type": "project", "tags": [], "created": "2026-07-25", "modified": "2026-07-25", - "related": [], "sources": [], "confidence": 0.8}, + "related": [], "sources": []}, "\n# nested-tool\n", ) index_rebuild(dry_run=False) diff --git a/tools/chemenu/tests/test_kb_scan.py b/tools/chemenu/tests/test_kb_scan.py index 927d834..373bcec 100644 --- a/tools/chemenu/tests/test_kb_scan.py +++ b/tools/chemenu/tests/test_kb_scan.py @@ -51,7 +51,7 @@ def test_find_nested_pages_flags_a_page_below_its_area(kb_dir): kb_dir / "entities/projects/someowner/nested-tool.md", {"type": "types/entity.md", "entity_type": "project", "tags": [], "created": "2026-07-25", "modified": "2026-07-25", - "related": [], "sources": [], "confidence": 0.8}, + "related": [], "sources": []}, "\n# nested-tool\n", ) pages = load_kb_pages(kb_dir) diff --git a/tools/chemenu/tests/test_lint.py b/tools/chemenu/tests/test_lint.py index 4b3573e..af9dcb2 100644 --- a/tools/chemenu/tests/test_lint.py +++ b/tools/chemenu/tests/test_lint.py @@ -56,7 +56,7 @@ def test_lint_detects_broken_wikilink(kb_dir): write_page( path, {"type": "types/entity.md", "entity_type": "tool", "tags": [], "created": "2026-07-25", - "modified": "2026-07-25", "related": [], "sources": [], "confidence": 0.8}, + "modified": "2026-07-25", "related": [], "sources": []}, "\n# gdeploy\n\n## Description\n\nSee [[Nonexistent Page]] for details.\n", ) report = run_lint(kb_dir) @@ -74,7 +74,7 @@ def test_lint_detects_dangling_related_ref(kb_dir): write_page( kb_dir / "entities/tools/gdeploy.md", {"type": "types/entity.md", "entity_type": "tool", "tags": [], "created": "2026-07-25", - "modified": "2026-07-25", "related": ["Renamed Away"], "sources": [], "confidence": 0.8}, + "modified": "2026-07-25", "related": ["Renamed Away"], "sources": []}, "\n# gdeploy\n\n## Description\n\nDeploy tool.\n", ) report = run_lint(kb_dir) @@ -88,8 +88,7 @@ def test_lint_detects_url_pasted_into_sources(kb_dir): write_page( kb_dir / "entities/tools/gdeploy.md", {"type": "types/entity.md", "entity_type": "tool", "tags": [], "created": "2026-07-25", - "modified": "2026-07-25", "related": [], "sources": ["https://example.com/x/"], - "confidence": 0.8}, + "modified": "2026-07-25", "related": [], "sources": ["https://example.com/x/"]}, "\n# gdeploy\n\n## Description\n\nDeploy tool.\n", ) targets = {i["target"] for i in run_lint(kb_dir)["dangling_frontmatter_refs"]} @@ -118,8 +117,7 @@ def test_lint_ignores_tags_and_raw_files_as_page_refs(kb_dir): write_page( kb_dir / "entities/tools/gdeploy.md", {"type": "types/entity.md", "entity_type": "tool", "tags": ["not-a-page"], - "created": "2026-07-25", "modified": "2026-07-25", "related": [], "sources": [], - "confidence": 0.8}, + "created": "2026-07-25", "modified": "2026-07-25", "related": [], "sources": []}, "\n# gdeploy\n\n## Description\n\nDeploy tool.\n", ) targets = {i["target"] for i in run_lint(kb_dir)["dangling_frontmatter_refs"]} @@ -130,7 +128,7 @@ def test_lint_detects_orphan_page(kb_dir): write_page( kb_dir / "entities/tools/isolated.md", {"type": "types/entity.md", "entity_type": "tool", "tags": [], "created": "2026-07-25", - "modified": "2026-07-25", "related": [], "sources": [], "confidence": 0.8}, + "modified": "2026-07-25", "related": [], "sources": []}, "\n# isolated\n\n## Description\n\nNothing links here.\n", ) report = run_lint(kb_dir) @@ -144,7 +142,7 @@ def test_lint_detects_missing_frontmatter_fields(kb_dir): """Missing-field detection now comes solely from the type's schema (its `required:` list), not a separately hand-maintained REQUIRED_FIELDS dict - so only fields the schema actually requires (created/modified/provenance/ - summary) are flagged, not schema-optional ones like tags/confidence.""" + summary) are flagged, not schema-optional ones like tags.""" write_page( kb_dir / "entities/tools/incomplete.md", {"type": "types/entity.md", "entity_type": "tool"}, @@ -160,7 +158,7 @@ def test_lint_detects_duplicate_titles(kb_dir): write_page( kb_dir / "concepts/gdeploy.md", {"type": "types/concept.md", "concept_type": "pattern", "tags": [], "created": "2026-07-25", - "modified": "2026-07-25", "related": [], "sources": [], "confidence": 0.5}, + "modified": "2026-07-25", "related": [], "sources": []}, "\n# gdeploy\n\nDuplicate stem with the tool page.\n", ) report = run_lint(kb_dir) @@ -172,7 +170,7 @@ def test_lint_detects_title_mismatch(kb_dir): write_page( kb_dir / "entities/tools/mismatched.md", {"type": "types/entity.md", "entity_type": "tool", "tags": [], "created": "2026-07-25", - "modified": "2026-07-25", "related": [], "sources": [], "confidence": 0.8}, + "modified": "2026-07-25", "related": [], "sources": []}, "\n# Totally Different Title\n", ) report = run_lint(kb_dir) @@ -190,7 +188,7 @@ def test_lint_detects_a_misplaced_page(kb_dir): write_page( kb_dir / "entities/systems/misplaced-tool.md", {"type": "types/entity.md", "entity_type": "tool", "tags": [], "created": "2026-07-25", - "modified": "2026-07-25", "related": [], "sources": [], "confidence": 0.8}, + "modified": "2026-07-25", "related": [], "sources": []}, "\n# misplaced-tool\n", ) report = run_lint(kb_dir) @@ -223,7 +221,7 @@ def test_lint_detects_a_nested_page_as_a_hard_error(kb_dir): write_page( kb_dir / "entities/projects/someowner/nested-tool.md", {"type": "types/entity.md", "entity_type": "project", "tags": [], "created": "2026-07-25", - "modified": "2026-07-25", "related": [], "sources": [], "confidence": 0.8}, + "modified": "2026-07-25", "related": [], "sources": []}, "\n# nested-tool\n", ) report = run_lint(kb_dir) @@ -411,7 +409,7 @@ def test_lint_flags_legacy_citation_marker_as_hard_error(kb_dir): write_page( kb_dir / "concepts/protocols/Modbus.md", {"type": "types/concept.md", "concept_type": "protocol", "tags": [], "created": "2026-07-25", - "modified": "2026-07-25", "related": [], "sources": ["Source - Aurora"], "confidence": 0.7}, + "modified": "2026-07-25", "related": [], "sources": ["Source - Aurora"]}, "\n# Modbus\n\n## Definition\n\nUses port 502 ^[[Source - Aurora]].\n", ) report = run_lint(kb_dir) @@ -423,7 +421,7 @@ def test_lint_flags_undefined_footnote_ref_as_hard_error(kb_dir): write_page( kb_dir / "concepts/protocols/Modbus.md", {"type": "types/concept.md", "concept_type": "protocol", "tags": [], "created": "2026-07-25", - "modified": "2026-07-25", "related": [], "sources": [], "confidence": 0.7}, + "modified": "2026-07-25", "related": [], "sources": []}, "\n# Modbus\n\n## Definition\n\nUses port 502 [^s-ghost].\n", ) report = run_lint(kb_dir) @@ -437,7 +435,7 @@ def test_lint_flags_orphan_footnote_def_as_hard_error(kb_dir): write_page( kb_dir / "concepts/protocols/Modbus.md", {"type": "types/concept.md", "concept_type": "protocol", "tags": [], "created": "2026-07-25", - "modified": "2026-07-25", "related": [], "sources": ["Source - Aurora"], "confidence": 0.7}, + "modified": "2026-07-25", "related": [], "sources": ["Source - Aurora"]}, f"\n# Modbus\n\n## Definition\n\nIndustrial protocol, no citation here.\n\n{block}", ) report = run_lint(kb_dir) @@ -451,7 +449,7 @@ def test_lint_clean_footnote_citation_has_no_hard_errors(kb_dir): write_page( kb_dir / "concepts/protocols/Modbus.md", {"type": "types/concept.md", "concept_type": "protocol", "tags": [], "created": "2026-07-25", - "modified": "2026-07-25", "related": [], "sources": ["Source - Aurora"], "confidence": 0.7}, + "modified": "2026-07-25", "related": [], "sources": ["Source - Aurora"]}, f"\n# Modbus\n\n## Definition\n\nUses port 502 [^{cid}].\n\n{block}", ) report = run_lint(kb_dir) @@ -464,7 +462,7 @@ def test_lint_detects_quote_limit_violation(kb_dir): write_page( kb_dir / "entities/tools/quotey.md", {"type": "types/entity.md", "entity_type": "tool", "tags": [], "created": "2026-07-25", - "modified": "2026-07-25", "related": [], "sources": [], "confidence": 0.8}, + "modified": "2026-07-25", "related": [], "sources": []}, "\n# quotey\n\n> First quote\n\n> Second quote\n\n> Third quote\n", ) report = run_lint(kb_dir) @@ -487,7 +485,7 @@ def test_lint_flags_invalid_type_path(kb_dir): write_page( kb_dir / "entities/tools/bad-type.md", {"type": "not-a-path", "entity_type": "tool", "tags": [], "created": "2026-07-25", - "modified": "2026-07-25", "related": [], "sources": [], "confidence": 0.8}, + "modified": "2026-07-25", "related": [], "sources": []}, "\n# bad-type\n", ) report = run_lint(kb_dir) @@ -499,7 +497,7 @@ def test_lint_flags_unresolvable_type_path(kb_dir): write_page( kb_dir / "entities/tools/unresolvable-type.md", {"type": "types/does-not-exist.md", "entity_type": "tool", "tags": [], "created": "2026-07-25", - "modified": "2026-07-25", "related": [], "sources": [], "confidence": 0.8}, + "modified": "2026-07-25", "related": [], "sources": []}, "\n# unresolvable-type\n", ) report = run_lint(kb_dir) @@ -513,7 +511,7 @@ def test_lint_flags_schema_validation_error(kb_dir): { "type": "types/entity.md", "entity_type": "not-a-real-entity-type", "tags": [], "created": "2026-07-25", "modified": "2026-07-25", "related": [], "sources": [], - "confidence": 0.8, "provenance": "general", "summary": "x", + "provenance": "general", "summary": "x", }, "\n# bad-schema\n", ) @@ -538,7 +536,7 @@ def test_render_summary_keeps_sections_that_found_something(kb_dir): write_page( kb_dir / "entities/tools/dangling.md", {"type": "types/entity.md", "entity_type": "tool", "tags": [], "created": "2026-07-25", - "modified": "2026-07-25", "related": [], "sources": [], "confidence": 0.8}, + "modified": "2026-07-25", "related": [], "sources": []}, "\n# dangling\n\nPoints at [[No Such Page]].\n", ) summary = render_summary(run_lint(kb_dir)) @@ -609,8 +607,7 @@ def test_lint_ignores_citation_syntax_shown_as_code(kb_dir): write_page( kb_dir / "concepts/Citation Mechanism.md", {"type": "types/concept.md", "concept_type": "protocol", "tags": [], "created": "2026-08-31", - "modified": "2026-08-31", "related": [], "sources": [], "confidence": 0.8, - "provenance": "general", "summary": "Notation shown as code, not used."}, + "modified": "2026-08-31", "related": [], "sources": [], "provenance": "general", "summary": "Notation shown as code, not used."}, "\n# Citation Mechanism\n\n## Definition\n\n" "`cite add` prints a `[^cite-id]` marker to paste at the fact, and upserts\n" "its definition into the trailing block:\n\n" @@ -629,8 +626,7 @@ def test_lint_still_sees_a_real_citation_beside_a_mentioned_one(kb_dir): write_page( kb_dir / "concepts/Mixed Citation.md", {"type": "types/concept.md", "concept_type": "protocol", "tags": [], "created": "2026-08-31", - "modified": "2026-08-31", "related": [], "sources": ["Source - Aurora"], "confidence": 0.8, - "provenance": "sourced", "summary": "A real citation beside a mentioned one."}, + "modified": "2026-08-31", "related": [], "sources": ["Source - Aurora"], "provenance": "sourced", "summary": "A real citation beside a mentioned one."}, f"\n# Mixed Citation\n\n## Definition\n\nThe marker `[^s-mentioned]` is written like " f"this one [^{cid}].\n\n{block}", ) @@ -647,8 +643,7 @@ def test_lint_ignores_wikilink_examples_in_code(kb_dir): write_page( kb_dir / "concepts/Wikilink Syntax.md", {"type": "types/concept.md", "concept_type": "protocol", "tags": [], "created": "2026-08-31", - "modified": "2026-08-31", "related": [], "sources": [], "confidence": 0.8, - "provenance": "general", "summary": "Notation shown as code, not used."}, + "modified": "2026-08-31", "related": [], "sources": [], "provenance": "general", "summary": "Notation shown as code, not used."}, "\n# Wikilink Syntax\n\n## Definition\n\nA link is written `[[Page Title]]`:\n\n" "```markdown\nSee [[Some Page That Does Not Exist]] for details.\n```\n", ) @@ -663,8 +658,7 @@ def test_lint_counts_a_wrapped_quote_once(kb_dir): write_page( kb_dir / "entities/tools/wrapped.md", {"type": "types/entity.md", "entity_type": "tool", "tags": [], "created": "2026-08-31", - "modified": "2026-08-31", "related": [], "sources": [], "confidence": 0.8, - "provenance": "general", "summary": "One wrapped quotation."}, + "modified": "2026-08-31", "related": [], "sources": [], "provenance": "general", "summary": "One wrapped quotation."}, "\n# wrapped\n\n> One quotation, wrapped across four lines,\n> which is how the rest of\n" "> this repository wraps its prose, and\n> therefore not four quotations.\n", ) @@ -678,8 +672,7 @@ def test_lint_counts_separated_quotes_separately(kb_dir): write_page( kb_dir / "entities/tools/blocky.md", {"type": "types/entity.md", "entity_type": "tool", "tags": [], "created": "2026-08-31", - "modified": "2026-08-31", "related": [], "sources": [], "confidence": 0.8, - "provenance": "general", "summary": "Three quotations, two wrapped."}, + "modified": "2026-08-31", "related": [], "sources": [], "provenance": "general", "summary": "Three quotations, two wrapped."}, "\n# blocky\n\n> First quote, wrapped\n> over two lines.\n\n> Second quote.\n\n" "> Third quote, also\n> wrapped.\n", ) @@ -694,8 +687,7 @@ def test_lint_does_not_count_a_shell_prompt_as_a_quote(kb_dir): write_page( kb_dir / "entities/tools/shelly.md", {"type": "types/entity.md", "entity_type": "tool", "tags": [], "created": "2026-08-31", - "modified": "2026-08-31", "related": [], "sources": [], "confidence": 0.8, - "provenance": "general", "summary": "A shell transcript, not a quotation."}, + "modified": "2026-08-31", "related": [], "sources": [], "provenance": "general", "summary": "A shell transcript, not a quotation."}, "\n# shelly\n\n```bash\n> line one\n\n> line two\n\n> line three\n```\n", ) report = run_lint(kb_dir) @@ -717,8 +709,7 @@ def _page_with_an_unlabelled_edge(kb_dir): write_page( kb_dir / "entities/tools/bare-edge.md", {"type": "types/entity.md", "entity_type": "tool", "tags": [], "created": "2026-09-03", - "modified": "2026-09-03", "related": ["Modbus"], "sources": [], "confidence": 0.8, - "provenance": "general", "summary": "One edge whose label was never declared."}, + "modified": "2026-09-03", "related": ["Modbus"], "sources": [], "provenance": "general", "summary": "One edge whose label was never declared."}, "\n# bare-edge\n\nAn edge without a label.\n", ) @@ -756,7 +747,7 @@ def test_unauthorised_label_is_hard_at_kb_version_4(kb_dir): kb_dir / "entities/tools/off-menu.md", {"type": "types/entity.md", "entity_type": "tool", "tags": [], "created": "2026-09-03", "modified": "2026-09-03", "related": [{"contradicts": "Modbus"}], "sources": [], - "confidence": 0.8, "provenance": "general", "summary": "A label off this menu."}, + "provenance": "general", "summary": "A label off this menu."}, "\n# off-menu\n\nA label the source collection never authorised.\n", ) kb_state.write_kb_state(Version(4, 0, 0), []) @@ -782,7 +773,7 @@ def test_unauthorised_label_is_judged_in_a_tree_that_is_not_the_configured_kb( kb_dir / "entities/tools/off-menu.md", {"type": "types/entity.md", "entity_type": "tool", "tags": [], "created": "2026-09-03", "modified": "2026-09-03", "related": [{"contradicts": "Modbus"}], "sources": [], - "confidence": 0.8, "provenance": "general", "summary": "A label off this menu."}, + "provenance": "general", "summary": "A label off this menu."}, "\n# off-menu\n\nA label the source collection never authorised.\n", ) elsewhere = tmp_path / "elsewhere" @@ -822,7 +813,7 @@ def _pair(kb_dir, forward, backward): {"type": "types/entity.md", "entity_type": "tool", "tags": [], "created": "2026-09-04", "modified": "2026-09-04", "related": [] if edge is None else [{edge: other}], - "sources": [], "confidence": 0.8, "provenance": "general", + "sources": [], "provenance": "general", "summary": f"One half of a pair, asserting {edge} about the other."}, f"\n# {name}\n\nHalf a pair.\n", ) @@ -892,128 +883,3 @@ def test_redundant_see_also_reaches_the_rendered_report_and_the_summary(kb_dir): summary = render_summary(report) assert "Redundant see-also" in summary assert "[[nearside]]" in summary and "depends-on" in summary - - -# --- Confidence against source standing (Gitea #67) -------------------------- - - -def _write_capped_source(kb_dir, title, *, fidelity=None, authority=None, raw_path=None): - """A distinct, never-colliding raw_files: path per title by default - the - fixture's own 'Source - Aurora' already claims raw/notes/Aurora.md, and - two of these in one test must not claim the same path either.""" - if raw_path is None: - raw_path = f"raw/notes/{title.replace(' ', '-')}.md" - frontmatter = { - "type": "types/source.md", "source_type": "notes", "author": "Torben", - "raw_files": [raw_path], "date": "2026-09-01", - "tags": [], "entities": [], "concepts": [], "summary": "Test source.", - } - if fidelity is not None: - frontmatter["fidelity"] = fidelity - if authority is not None: - frontmatter["authority"] = authority - write_page(kb_dir / "sources" / f"{title}.md", frontmatter, f"\n# {title}\n\n## Summary\n\nTest.\n") - - -def test_confidence_exceeds_source_standing_flags_a_high_confidence_opinion_source(kb_dir): - _write_capped_source(kb_dir, "Source - Weak", fidelity="secondhand", authority="opinion") - write_page( - kb_dir / "concepts/protocols/Modbus.md", - {"type": "types/concept.md", "concept_type": "protocol", "tags": [], "created": "2026-07-25", - "modified": "2026-07-25", "related": [], "sources": ["Source - Weak"], - "confidence": 0.9, "confidence_base": 0.9}, - "\n# Modbus\n\n## Definition\n\nx.\n", - ) - report = run_lint(kb_dir) - assert {"page": "Modbus", "confidence_base": 0.9, "ceiling": 0.6} in report["confidence_exceeds_source_standing"] - # Advisory, not a hard error - unlike the fixture's own baseline issues, - # this finding on its own must never appear in `hard_error_keys()`. - assert "confidence_exceeds_source_standing" not in HARD_ERROR_KEYS - - -def test_confidence_exceeds_source_standing_is_silent_at_or_under_the_ceiling(kb_dir): - _write_capped_source(kb_dir, "Source - Weak", fidelity="secondhand", authority="opinion") - write_page( - kb_dir / "concepts/protocols/Modbus.md", - {"type": "types/concept.md", "concept_type": "protocol", "tags": [], "created": "2026-07-25", - "modified": "2026-07-25", "related": [], "sources": ["Source - Weak"], - "confidence": 0.6, "confidence_base": 0.6}, - "\n# Modbus\n\n## Definition\n\nx.\n", - ) - report = run_lint(kb_dir) - assert report["confidence_exceeds_source_standing"] == [] - - -def test_confidence_exceeds_source_standing_is_silent_on_normative_verbatim_sources(kb_dir): - """`normative`/`verbatim` carry no ceiling at all - a page may sit as - confident as its own hand-set judgment allows.""" - _write_capped_source(kb_dir, "Source - Strong", fidelity="verbatim", authority="normative") - write_page( - kb_dir / "concepts/protocols/Modbus.md", - {"type": "types/concept.md", "concept_type": "protocol", "tags": [], "created": "2026-07-25", - "modified": "2026-07-25", "related": [], "sources": ["Source - Strong"], - "confidence": 0.99, "confidence_base": 0.99}, - "\n# Modbus\n\n## Definition\n\nx.\n", - ) - report = run_lint(kb_dir) - assert report["confidence_exceeds_source_standing"] == [] - - -def test_confidence_exceeds_source_standing_is_silent_when_capture_fields_are_unknown(kb_dir): - """A backfilled `unknown` is not a claim about the source - firing on it - would report every page citing a pre-#67 source at once.""" - _write_capped_source(kb_dir, "Source - Backfilled", fidelity="unknown", authority="unknown") - write_page( - kb_dir / "concepts/protocols/Modbus.md", - {"type": "types/concept.md", "concept_type": "protocol", "tags": [], "created": "2026-07-25", - "modified": "2026-07-25", "related": [], "sources": ["Source - Backfilled"], - "confidence": 0.99, "confidence_base": 0.99}, - "\n# Modbus\n\n## Definition\n\nx.\n", - ) - report = run_lint(kb_dir) - assert report["confidence_exceeds_source_standing"] == [] - - -def test_confidence_exceeds_source_standing_is_silent_without_capture_fields_at_all(kb_dir): - """A source page predating Gitea #67 carries neither field yet - same - silence as the explicit `unknown` case, not a finding by omission.""" - _write_capped_source(kb_dir, "Source - Predates 67") - write_page( - kb_dir / "concepts/protocols/Modbus.md", - {"type": "types/concept.md", "concept_type": "protocol", "tags": [], "created": "2026-07-25", - "modified": "2026-07-25", "related": [], "sources": ["Source - Predates 67"], - "confidence": 0.99, "confidence_base": 0.99}, - "\n# Modbus\n\n## Definition\n\nx.\n", - ) - report = run_lint(kb_dir) - assert report["confidence_exceeds_source_standing"] == [] - - -def test_confidence_exceeds_source_standing_takes_the_tightest_ceiling_among_several_sources(kb_dir): - _write_capped_source(kb_dir, "Source - A", fidelity="published", authority="reporting") - _write_capped_source(kb_dir, "Source - B", fidelity="secondhand", authority="opinion") - write_page( - kb_dir / "concepts/protocols/Modbus.md", - {"type": "types/concept.md", "concept_type": "protocol", "tags": [], "created": "2026-07-25", - "modified": "2026-07-25", "related": [], "sources": ["Source - A", "Source - B"], - "confidence": 0.7, "confidence_base": 0.7}, - "\n# Modbus\n\n## Definition\n\nx.\n", - ) - report = run_lint(kb_dir) - assert {"page": "Modbus", "confidence_base": 0.7, "ceiling": 0.6} in report["confidence_exceeds_source_standing"] - - -def test_confidence_exceeds_source_standing_reaches_the_rendered_report_and_the_summary(kb_dir): - _write_capped_source(kb_dir, "Source - Weak", fidelity="secondhand", authority="opinion") - write_page( - kb_dir / "concepts/protocols/Modbus.md", - {"type": "types/concept.md", "concept_type": "protocol", "tags": [], "created": "2026-07-25", - "modified": "2026-07-25", "related": [], "sources": ["Source - Weak"], - "confidence": 0.9, "confidence_base": 0.9}, - "\n# Modbus\n\n## Definition\n\nx.\n", - ) - report = run_lint(kb_dir) - assert "Confidence Above Source Standing" in render_markdown(report) - summary = render_summary(report) - assert "Confidence Above Source Standing" in summary - assert "[[Modbus]]" in summary diff --git a/tools/chemenu/tests/test_mcp_server.py b/tools/chemenu/tests/test_mcp_server.py index d56a878..d0f0583 100644 --- a/tools/chemenu/tests/test_mcp_server.py +++ b/tools/chemenu/tests/test_mcp_server.py @@ -51,7 +51,7 @@ def corpus(tmp_path: Path) -> Path: shutil.copytree(config._PACKAGE_ROOT / "types", root / "types") (root / "kb" / "entities" / "COLLECTION.md").write_text("# entities\n", encoding="utf-8") (entities / "Kingfisher.md").write_text( - "---\ntype: types/entity.md\nentity_type: system\nconfidence: 0.55\n" + "---\ntype: types/entity.md\nentity_type: system\n" "summary: The fixture's own system.\n---\n\n" "# Kingfisher\n\nKingfisher is the system this fixture is about.\n", encoding="utf-8", @@ -100,7 +100,7 @@ def test_no_tool_writes_anything_into_the_corpus_or_git(corpus): ).stdout _call(server, "search", {"query": "Kingfisher"}) - _call(server, "search", {"predicates": ["confidence<0.6"]}) + _call(server, "search", {"predicates": ["entity_type=system"]}) _call(server, "types") _call(server, "describe_type", {"name": "entity"}) _call(server, "lint") diff --git a/tools/chemenu/tests/test_new_page.py b/tools/chemenu/tests/test_new_page.py index adef468..29f6aba 100644 --- a/tools/chemenu/tests/test_new_page.py +++ b/tools/chemenu/tests/test_new_page.py @@ -63,7 +63,7 @@ def test_new_entity_creates_page_with_expected_frontmatter(monkeypatch, kb_dir): result = _invoke_new(monkeypatch, kb_dir, [ "new", "entity", "--name", "gateway.example.net", "--set", "entity_type=system", "--set", "tags=gateway,firewall", - "--set", "related=Borealis", "--set", "confidence=0.9", + "--set", "related=Borealis", "--set", "provenance=general", ]) assert result.exit_code == 0, result.output @@ -74,7 +74,6 @@ def test_new_entity_creates_page_with_expected_frontmatter(monkeypatch, kb_dir): assert fm["entity_type"] == "system" assert fm["tags"] == ["gateway", "firewall"] assert fm["related"] == ["Borealis"] - assert fm["confidence"] == 0.9 assert "# gateway.example.net" in body @@ -95,16 +94,14 @@ def test_a_scaffolded_body_carries_no_tool_owned_region(monkeypatch, kb_dir): def test_new_entity_applies_schema_declared_defaults(monkeypatch, kb_dir): - """provenance and confidence are no longer Typer flag defaults - they - come from the schema's own `default:`, so omitting them still yields a - valid page.""" + """provenance is no longer a Typer flag default - it comes from the + schema's own `default:`, so omitting it still yields a valid page.""" result = _invoke_new(monkeypatch, kb_dir, [ "new", "entity", "--name", "Defaulted", "--set", "entity_type=tool", ]) assert result.exit_code == 0, result.output fm, _body = read_page(kb_dir / "entities/tools/Defaulted.md") assert fm["provenance"] == "general" - assert fm["confidence"] == 0.5 def test_new_entity_rejects_name_collision(monkeypatch, kb_dir): @@ -370,13 +367,13 @@ def test_new_comparison_rejects_single_entity(monkeypatch, kb_dir): def test_repeated_set_appends_for_array_fields(): """The separator-free way to pass an element containing a comma. The schema type decides: only array fields append.""" - schema = {"properties": {"raw_files": {"type": "array"}, "confidence": {"type": "number"}}} + schema = {"properties": {"raw_files": {"type": "array"}, "weight": {"type": "number"}}} parsed = parse_set_fields( - ["raw_files=raw/a.md", "raw_files=raw/b, with comma.md", "confidence=0.5", "confidence=0.9"], + ["raw_files=raw/a.md", "raw_files=raw/b, with comma.md", "weight=0.5", "weight=0.9"], schema, ) assert parsed["raw_files"] == ["raw/a.md", "raw/b", "with comma.md"] - assert parsed["confidence"] == 0.9 + assert parsed["weight"] == 0.9 def test_repeated_set_with_escaped_comma_keeps_one_element(): diff --git a/tools/chemenu/tests/test_page_ops.py b/tools/chemenu/tests/test_page_ops.py index 6a5d613..d72642c 100644 --- a/tools/chemenu/tests/test_page_ops.py +++ b/tools/chemenu/tests/test_page_ops.py @@ -86,7 +86,7 @@ def test_rename_refreshes_stale_slug_derived_cite_id(patched_wiki): { "type": "types/concept.md", "concept_type": "protocol", "tags": [], "created": "2026-07-25", "modified": "2026-07-25", - "related": [], "sources": [], "confidence": 0.7, + "related": [], "sources": [], }, f"\n# uses-borealis\n\nRuns on it [^{old_id}].\n\n## Footnotes\n\n[^{old_id}]: [[Borealis]]\n", ) @@ -138,7 +138,7 @@ def test_rename_repoints_references_to_an_existing_page(patched_wiki): patched_wiki / "entities/tools/gdeploy.md", {"type": "types/entity.md", "entity_type": "tool", "tags": [], "created": "2026-07-25", "modified": "2026-07-25", - "related": ["borealis"], "sources": [], "confidence": 0.8}, + "related": ["borealis"], "sources": []}, "\n# gdeploy\n\n## See Also\n\n- [[borealis]]\n", ) page_ops.rename_command(old="borealis", new="Borealis", dry_run=False) @@ -154,7 +154,7 @@ def test_rename_reference_only_mode_requires_the_target_to_exist(patched_wiki): patched_wiki / "entities/tools/gdeploy.md", {"type": "types/entity.md", "entity_type": "tool", "tags": [], "created": "2026-07-25", "modified": "2026-07-25", - "related": ["ghost"], "sources": [], "confidence": 0.8}, + "related": ["ghost"], "sources": []}, "\n# gdeploy\n", ) with pytest.raises(typer.Exit): @@ -178,7 +178,7 @@ def test_rename_fixes_a_dangling_source_reference(patched_wiki): patched_wiki / "entities/tools/gdeploy.md", {"type": "types/entity.md", "entity_type": "tool", "tags": [], "created": "2026-07-25", "modified": "2026-07-25", "related": [], - "sources": ["Source - Aurora"], "confidence": 0.8}, + "sources": ["Source - Aurora"]}, "\n# gdeploy\n\n## Description\n\nDeploy tool.\n", ) page_ops.rename_command(old="Source - Aurora", new="Source - Aurora Notes", dry_run=False) @@ -246,7 +246,7 @@ def test_rm_of_unreferenced_page_needs_no_confirmation(patched_wiki): patched_wiki / "entities/tools/isolated.md", {"type": "types/entity.md", "entity_type": "tool", "tags": [], "created": "2026-07-25", "modified": "2026-07-25", "related": [], - "sources": [], "confidence": 0.8}, + "sources": []}, "\n# isolated\n\n## Description\n\nNothing links here.\n", ) page_ops.rm_command(page_title="isolated", yes=False, dry_run=False) @@ -260,7 +260,7 @@ def test_rm_leaves_prose_references_and_reports_them(patched_wiki, capsys): patched_wiki / "entities/tools/gdeploy.md", {"type": "types/entity.md", "entity_type": "tool", "tags": [], "created": "2026-07-25", "modified": "2026-07-25", "related": [], - "sources": [], "confidence": 0.8}, + "sources": []}, "\n# gdeploy\n\n## Description\n\nRuns on [[Borealis]] nightly.\n", ) page_ops.rm_command(page_title="Borealis", yes=True, dry_run=False) @@ -284,7 +284,7 @@ def test_inbound_pages_sees_frontmatter_only_references(patched_wiki): patched_wiki / "entities/tools/gdeploy.md", {"type": "types/entity.md", "entity_type": "tool", "tags": [], "created": "2026-07-25", "modified": "2026-07-25", - "related": ["Modbus"], "sources": [], "confidence": 0.8}, + "related": ["Modbus"], "sources": []}, "\n# gdeploy\n\n## Description\n\nNo body link at all.\n", ) assert "gdeploy" in page_ops.inbound_pages(load_kb_pages(patched_wiki), "Modbus") @@ -299,7 +299,7 @@ def _write_misplaced(kb: Path, relative: str, title: str, entity_type: str) -> N { "type": "types/entity.md", "entity_type": entity_type, "tags": [], "created": "2026-07-25", "modified": "2026-07-25", - "related": [], "sources": [], "confidence": 0.8, + "related": [], "sources": [], }, f"\n# {title}\n", ) diff --git a/tools/chemenu/tests/test_provenance.py b/tools/chemenu/tests/test_provenance.py index 47cd2b1..df4dfb7 100644 --- a/tools/chemenu/tests/test_provenance.py +++ b/tools/chemenu/tests/test_provenance.py @@ -304,7 +304,7 @@ def test_citing_pages_via_frontmatter_and_inline(kb_dir, raw_dir): kb_dir / "entities/tools/gdeploy.md", { "type": "entity", "entity_type": "tool", "tags": [], "created": "2026-07-25", - "modified": "2026-07-25", "related": [], "sources": ["Source - Aurora"], "confidence": 0.8, + "modified": "2026-07-25", "related": [], "sources": ["Source - Aurora"], }, "\n# gdeploy\n\n## Description\n\nDeploy tool.\n", ) @@ -313,7 +313,7 @@ def test_citing_pages_via_frontmatter_and_inline(kb_dir, raw_dir): kb_dir / "concepts/protocols/Modbus.md", { "type": "concept", "concept_type": "protocol", "tags": [], "created": "2026-07-25", - "modified": "2026-07-25", "related": [], "sources": [], "confidence": 0.7, + "modified": "2026-07-25", "related": [], "sources": [], }, f"\n# Modbus\n\n## Definition\n\nUses port 502 {refs}.\n\n{block}", ) @@ -328,7 +328,7 @@ def test_page_raw_files_resolves_through_sources_and_inline(kb_dir, raw_dir): kb_dir / "concepts/protocols/Modbus.md", { "type": "concept", "concept_type": "protocol", "tags": [], "created": "2026-07-25", - "modified": "2026-07-25", "related": [], "sources": ["Source - Aurora"], "confidence": 0.7, + "modified": "2026-07-25", "related": [], "sources": ["Source - Aurora"], }, "\n# Modbus\n\n## Definition\n\nIndustrial protocol.\n", ) @@ -369,7 +369,7 @@ def test_sources_trace_by_raw_and_by_page(kb_dir, raw_dir, monkeypatch): { "type": "entity", "entity_type": "system", "tags": ["server"], "created": "2026-07-31", "modified": "2026-07-31", "related": ["Borealis"], - "sources": ["Source - Aurora"], "confidence": 0.9, + "sources": ["Source - Aurora"], }, "\n# aurora\n\n## Description\n\nHosts things.\n", ) @@ -434,7 +434,7 @@ def test_lint_flags_citation_not_in_frontmatter_sources(kb_dir, raw_dir, monkeyp kb_dir / "concepts/protocols/Modbus.md", { "type": "concept", "concept_type": "protocol", "tags": [], "created": "2026-07-25", - "modified": "2026-07-25", "related": [], "sources": [], "confidence": 0.7, + "modified": "2026-07-25", "related": [], "sources": [], "provenance": "sourced", }, f"\n# Modbus\n\n## Definition\n\nUses port 502 {refs}.\n\n{block}", @@ -456,7 +456,7 @@ def test_lint_no_drift_when_source_declared(kb_dir, raw_dir, monkeypatch): kb_dir / "concepts/protocols/Modbus.md", { "type": "concept", "concept_type": "protocol", "tags": [], "created": "2026-07-25", - "modified": "2026-07-25", "related": [], "sources": ["Source - Aurora"], "confidence": 0.7, + "modified": "2026-07-25", "related": [], "sources": ["Source - Aurora"], "provenance": "sourced", }, f"\n# Modbus\n\n## Definition\n\nUses port 502 {refs}.\n\n{block}", diff --git a/tools/chemenu/tests/test_raw_cmd.py b/tools/chemenu/tests/test_raw_cmd.py index 8a19e36..1418c87 100644 --- a/tools/chemenu/tests/test_raw_cmd.py +++ b/tools/chemenu/tests/test_raw_cmd.py @@ -494,7 +494,7 @@ def test_replaces_reports_source_and_both_citing_pages(tree, capsys): { "type": "types/concept.md", "concept_type": "protocol", "tags": [], "created": "2026-09-01", "modified": "2026-09-01", "related": [], - "sources": ["Source - Handbuch"], "confidence": 0.7, + "sources": ["Source - Handbuch"], }, "\n# Handbuch-Konzept\n\n## Definition\n\nx.\n", ) @@ -503,7 +503,7 @@ def test_replaces_reports_source_and_both_citing_pages(tree, capsys): { "type": "types/entity.md", "entity_type": "tool", "tags": [], "created": "2026-09-01", "modified": "2026-09-01", "related": [], - "sources": ["Source - Handbuch"], "confidence": 0.7, + "sources": ["Source - Handbuch"], }, "\n# handbuch-tool\n\n## Description\n\nx.\n", ) diff --git a/tools/chemenu/tests/test_search.py b/tools/chemenu/tests/test_search.py index 4b25427..031900e 100644 --- a/tools/chemenu/tests/test_search.py +++ b/tools/chemenu/tests/test_search.py @@ -18,6 +18,7 @@ from chemenu.search.fuse import reciprocal_rank_fusion from chemenu.search.registry import UnknownBackend, resolve from chemenu.search.ripgrep import RipgrepBackend, build_argv from chemenu.search.types import Match, Predicate, SearchHit, SearchQuery +from chemenu.frontmatter_io import write_page @pytest.fixture @@ -56,9 +57,9 @@ def _q(*raw, **kwargs): [ ("entity_type=system", Predicate("entity_type", "=", "system")), ("summary~storage", Predicate("summary", "~", "storage")), - ("confidence>=0.8", Predicate("confidence", ">=", "0.8")), - ("confidence<=0.8", Predicate("confidence", "<=", "0.8")), - ("confidence>0.8", Predicate("confidence", ">", "0.8")), + ("weight>=0.8", Predicate("weight", ">=", "0.8")), + ("weight<=0.8", Predicate("weight", "<=", "0.8")), + ("weight>0.8", Predicate("weight", ">", "0.8")), ("modified<2026-08-01", Predicate("modified", "<", "2026-08-01")), ("summary:*", Predicate("summary", "exists", None)), ("!summary", Predicate("summary", "absent", None)), @@ -70,7 +71,7 @@ def test_parse_predicate_forms(raw, expected): def test_parse_predicate_prefers_longest_operator(): """`>=` must be tried before `>`, or the value keeps a stray `=`.""" - assert parse_predicate("confidence>=0.8").value == "0.8" + assert parse_predicate("weight>=0.8").value == "0.8" @pytest.mark.parametrize("raw", ["", "nonsense", "=value", "field=", "!", ":*"]) @@ -94,8 +95,25 @@ def test_substring_match_is_case_insensitive(search): assert _titles(search(_q("summary~ZFS STORAGE"))) == ["aurora"] -def test_numeric_comparison(search): - assert _titles(search(_q("confidence>=0.9"))) == ["aurora", "Borealis"] +def test_numeric_comparison(kb_dir, tmp_path): + """`_compare` tries a float parse before falling back to lexicographic - + exercised here on an arbitrary numeric field, since no frontmatter field + in the schema is numeric any more (Gitea #60).""" + write_page( + kb_dir / "entities/tools/heavy.md", + {"type": "types/entity.md", "entity_type": "tool", "tags": [], "created": "2026-07-25", + "modified": "2026-07-25", "related": [], "sources": [], "weight": 0.9}, + "\n# heavy\n", + ) + write_page( + kb_dir / "entities/tools/light.md", + {"type": "types/entity.md", "entity_type": "tool", "tags": [], "created": "2026-07-25", + "modified": "2026-07-25", "related": [], "sources": [], "weight": 0.5}, + "\n# light\n", + ) + pages = load_pages_by_path(kb_dir, tmp_path) + matched = filters.apply_predicates(pages, (parse_predicate("weight>=0.9"),)) + assert {page.title for page in matched.values()} == {"heavy"} def test_date_comparison_handles_yaml_date_objects(search): @@ -164,7 +182,6 @@ def test_hits_carry_frontmatter_so_the_page_need_not_be_opened(search, backend): assert hit.kind == "entity" assert hit.subtype == "system" assert hit.collection == "entities" - assert hit.confidence == 0.9 assert "ZFS" in hit.summary @@ -189,17 +206,17 @@ def test_no_matches_is_an_empty_result_not_an_error(search, backend): def test_limit_and_sort(search): - hits = search(_q("kind=entity", sort="-confidence")) - assert [hit.confidence for hit in hits] == [0.9, 0.9, 0.8] + hits = search(_q("kind=entity", sort="-modified")) + assert [hit.title for hit in hits] == ["Borealis", "aurora", "gdeploy"] assert len(search(_q("kind=entity", limit=2))) == 2 def test_sort_puts_missing_values_last(): hits = [ - SearchHit(title="b", path="b", confidence=None), - SearchHit(title="a", path="a", confidence=0.5), + SearchHit(title="b", path="b", modified=None), + SearchHit(title="a", path="a", modified="2026-01-01"), ] - assert [hit.title for hit in sort_hits(hits, "confidence")] == ["a", "b"] + assert [hit.title for hit in sort_hits(hits, "modified")] == ["a", "b"] # --- fusion and registry ---------------------------------------------------- @@ -246,7 +263,7 @@ def test_hit_serialises_for_json(): def test_known_fields_includes_virtual_and_real(pages): fields = filters.known_fields(pages) assert {"title", "kind", "subtype", "collection"} <= fields - assert {"entity_type", "confidence", "tags"} <= fields + assert {"entity_type", "sources", "tags"} <= fields # --- Read-path limits (Gitea #33) ------------------------------------------- @@ -299,16 +316,16 @@ def test_a_hanging_ripgrep_is_reported_as_a_failure_not_a_hang(monkeypatch, kb_d def test_a_page_with_broken_frontmatter_is_reported_not_lost(kb_dir, tmp_path): - """It matches no positive predicate - including the low-confidence sweep - meant to find pages in exactly that state - so silence reads as 'did not - match'. The page has to be nameable.""" + """It matches no positive predicate - including the sweeps meant to find + pages in exactly that state (`!sources`, `provenance=general`) - so + silence reads as 'did not match'. The page has to be nameable.""" broken = kb_dir / "entities" / "Broken.md" broken.write_text("---\ntype: [unclosed\n---\n\n# Broken\n", encoding="utf-8") pages = load_pages_by_path(kb_dir, tmp_path) key = page_key(broken, tmp_path) assert pages[key].frontmatter == {} - assert filters.apply_predicates(pages, (parse_predicate("confidence<0.6"),)) .get(key) is None + assert filters.apply_predicates(pages, (parse_predicate("entity_type=system"),)) .get(key) is None reported = unreadable_pages(pages) assert [entry["path"] for entry in reported] == [key] diff --git a/tools/chemenu/tests/test_touch.py b/tools/chemenu/tests/test_touch.py index 683af6f..601312c 100644 --- a/tools/chemenu/tests/test_touch.py +++ b/tools/chemenu/tests/test_touch.py @@ -2,11 +2,14 @@ import datetime import pytest import typer +from typer.testing import CliRunner from chemenu import config from chemenu.commands.touch import touch_command from chemenu.frontmatter_io import read_page +runner = CliRunner() + @pytest.fixture def touch_wiki(kb_dir, monkeypatch): @@ -27,7 +30,6 @@ def _touch(**overrides): page_title=None, summary=None, provenance=None, - confidence_base=None, date=None, set_fields=None, add_fields=None, @@ -176,14 +178,23 @@ def test_page_reference_fields_are_refused_and_name_xref(touch_wiki, capsys): assert "xref" in capsys.readouterr().out -def test_type_and_confidence_are_refused_with_their_owner(touch_wiki, capsys): +def test_type_is_refused_with_its_owner(touch_wiki, capsys): with pytest.raises(typer.Exit): _touch(page_title="aurora", set_fields=["type=types/concept.md"]) assert "page-lifecycle" in capsys.readouterr().out - with pytest.raises(typer.Exit): - _touch(page_title="aurora", set_fields=["confidence=0.99"]) - assert "confidence-base" in capsys.readouterr().out + +def test_confidence_base_flag_no_longer_exists(touch_wiki, monkeypatch): + """The confidence mechanism is gone (Gitea #60): `--confidence-base` is not + a denylisted field owned elsewhere, it simply does not exist as an option + any more - refused by the CLI parser itself, before `touch_command` runs.""" + import chemenu.config as cfg + from chemenu.cli import app + + monkeypatch.setattr(cfg, "KB_DIR", touch_wiki) + result = runner.invoke(app, ["touch", "--page", "aurora", "--confidence-base", "0.9"]) + assert result.exit_code != 0 + assert "confidence-base" in result.output.lower() or "no such option" in result.output.lower() def test_unknown_field_lists_what_the_page_actually_has(touch_wiki, capsys): diff --git a/tools/chemenu/tests/test_type_resolver.py b/tools/chemenu/tests/test_type_resolver.py index 7489de0..0819ad4 100644 --- a/tools/chemenu/tests/test_type_resolver.py +++ b/tools/chemenu/tests/test_type_resolver.py @@ -248,7 +248,7 @@ def test_validate_frontmatter_accepts_conforming_instance(): resolver.validate_frontmatter( { "type": "types/entity.md", "entity_type": "tool", "tags": [], "created": "2026-07-25", - "modified": "2026-07-25", "related": [], "sources": [], "confidence": 0.8, + "modified": "2026-07-25", "related": [], "sources": [], "provenance": "general", "summary": "A tool.", }, "types/entity.md", @@ -267,7 +267,7 @@ def test_validate_frontmatter_reports_invalid_enum_with_field_name(): { "type": "types/entity.md", "entity_type": "not-a-real-type", "tags": [], "created": "2026-07-25", "modified": "2026-07-25", "related": [], "sources": [], - "confidence": 0.8, "provenance": "general", "summary": "x", + "provenance": "general", "summary": "x", }, "types/entity.md", ) @@ -278,7 +278,7 @@ def test_validate_frontmatter_reports_wrong_field_type(): resolver.validate_frontmatter( { "type": "types/entity.md", "entity_type": "tool", "tags": ["a", 3], "created": "2026-07-25", - "modified": "2026-07-25", "related": [], "sources": [], "confidence": 0.8, + "modified": "2026-07-25", "related": [], "sources": [], "provenance": "general", "summary": "x", }, "types/entity.md", diff --git a/tools/chemenu/tests/test_version_cmd.py b/tools/chemenu/tests/test_version_cmd.py index 9fe50e0..3338eb6 100644 --- a/tools/chemenu/tests/test_version_cmd.py +++ b/tools/chemenu/tests/test_version_cmd.py @@ -324,7 +324,7 @@ def test_release_entry_can_replace_the_title(): def test_bump_writes_both_the_version_and_the_changelog_heading(tree): version_cmd.bump_command( major=False, minor=True, patch=False, title="Something happened", - breaking=None, no_migration=None, dry_run=False, + breaking=None, no_migration=None, migration_required=False, dry_run=False, ) assert (tree / "VERSION").read_text(encoding="utf-8").strip() == "1.1.0-beta.1" changes = (tree / "CHANGES.md").read_text(encoding="utf-8") @@ -336,11 +336,11 @@ def test_bump_writes_both_the_version_and_the_changelog_heading(tree): def test_a_second_bump_continues_the_same_candidate_instead_of_opening_another(tree): version_cmd.bump_command( major=False, minor=True, patch=False, title="First", - breaking=None, no_migration=None, dry_run=False, + breaking=None, no_migration=None, migration_required=False, dry_run=False, ) version_cmd.bump_command( major=False, minor=False, patch=True, title="Second", - breaking=None, no_migration=None, dry_run=False, + breaking=None, no_migration=None, migration_required=False, dry_run=False, ) assert (tree / "VERSION").read_text(encoding="utf-8").strip() == "1.1.0-beta.2" changes = (tree / "CHANGES.md").read_text(encoding="utf-8") @@ -350,7 +350,7 @@ def test_a_second_bump_continues_the_same_candidate_instead_of_opening_another(t def test_bump_dry_run_writes_nothing(tree): version_cmd.bump_command( - major=False, minor=False, patch=True, title="Nope", breaking=None, no_migration=None, dry_run=True + major=False, minor=False, patch=True, title="Nope", breaking=None, no_migration=None, migration_required=False, dry_run=True ) assert (tree / "VERSION").read_text(encoding="utf-8").strip() == "1.0.0" assert "1.0.1" not in (tree / "CHANGES.md").read_text(encoding="utf-8") @@ -363,7 +363,7 @@ def test_bump_demands_exactly_one_part(tree, flags): major, minor, patch = flags with pytest.raises(typer.Exit): version_cmd.bump_command( - major=major, minor=minor, patch=patch, title="x", breaking=None, no_migration=None, dry_run=False + major=major, minor=minor, patch=patch, title="x", breaking=None, no_migration=None, migration_required=False, dry_run=False ) assert (tree / "VERSION").read_text(encoding="utf-8").strip() == "1.0.0" @@ -371,7 +371,7 @@ def test_bump_demands_exactly_one_part(tree, flags): def test_bump_refuses_an_empty_title(tree): with pytest.raises(typer.Exit): version_cmd.bump_command( - major=False, minor=False, patch=True, title=" ", breaking=None, no_migration=None, dry_run=False + major=False, minor=False, patch=True, title=" ", breaking=None, no_migration=None, migration_required=False, dry_run=False ) @@ -384,7 +384,7 @@ def test_bump_refuses_when_version_and_changelog_disagree(tree): ) with pytest.raises(typer.Exit): version_cmd.bump_command( - major=False, minor=False, patch=True, title="x", breaking=None, no_migration=None, dry_run=False + major=False, minor=False, patch=True, title="x", breaking=None, no_migration=None, migration_required=False, dry_run=False ) assert (tree / "VERSION").read_text(encoding="utf-8").strip() == "1.0.0" @@ -398,7 +398,7 @@ def test_a_boundary_crossing_bump_without_a_migration_is_refused(tree): with pytest.raises(typer.Exit): version_cmd.bump_command( major=True, minor=False, patch=False, title="Breaking", - breaking="the feed moved", no_migration=None, dry_run=False, + breaking="the feed moved", no_migration=None, migration_required=False, dry_run=False, ) assert (tree / "VERSION").read_text(encoding="utf-8").strip() == "1.0.0" @@ -413,7 +413,7 @@ def test_a_boundary_crossing_bump_passes_with_a_migration_document(tree): ) version_cmd.bump_command( major=True, minor=False, patch=False, title="Breaking", - breaking="every page is retyped", no_migration=None, dry_run=False, + breaking="every page is retyped", no_migration=None, migration_required=False, dry_run=False, ) assert (tree / "VERSION").read_text(encoding="utf-8").strip() == "2.0.0-beta.1" @@ -430,11 +430,11 @@ def test_a_follow_up_bump_at_the_same_stage_need_not_repeat_breaking_or_migratio ) version_cmd.bump_command( major=True, minor=False, patch=False, title="Breaking", - breaking="every page is retyped", no_migration=None, dry_run=False, + breaking="every page is retyped", no_migration=None, migration_required=False, dry_run=False, ) version_cmd.bump_command( major=True, minor=False, patch=False, title="Follow-up", - breaking=None, no_migration=None, dry_run=False, + breaking=None, no_migration=None, migration_required=False, dry_run=False, ) assert (tree / "VERSION").read_text(encoding="utf-8").strip() == "2.0.0-beta.2" changes = (tree / "CHANGES.md").read_text(encoding="utf-8") @@ -446,7 +446,7 @@ def test_no_migration_records_the_reason_in_the_changelog(tree): version_cmd.bump_command( major=True, minor=False, patch=False, title="Breaking", breaking="the release feed moved", - no_migration="no distributed instance exists yet", dry_run=False, + no_migration="no distributed instance exists yet", migration_required=False, dry_run=False, ) changes = (tree / "CHANGES.md").read_text(encoding="utf-8") assert version_mod.MIGRATION_NONE_MARKER in changes @@ -458,10 +458,103 @@ def test_no_migration_is_refused_on_a_compatible_bump(tree): with pytest.raises(typer.Exit): version_cmd.bump_command( major=False, minor=False, patch=True, title="Fix", - breaking=None, no_migration="not needed", dry_run=False, + breaking=None, no_migration="not needed", migration_required=False, dry_run=False, ) +# --- version bump: retracting --no-migration -------------------------------- + + +def _migration_document(tree: Path, target: str, slug: str = "retype") -> None: + (tree / "instructions" / "migrations" / f"{target}-{slug}.md").write_text( + f"---\ntype: types/instruction.md\nname: {target}-{slug}\n" + f"description: Retype every page.\nmanual: true\n" + f"migrates_to: {target}\nmigration_kind: assisted\n---\n\n# M\n", + encoding="utf-8", + ) + + +def test_migration_required_retracts_the_no_migration_line(tree): + """A candidate that recorded --no-migration and later turns out to need + one after all has no other way to take that statement back.""" + version_cmd.bump_command( + major=True, minor=False, patch=False, title="Breaking", + breaking="the feed moved", no_migration="kb/ untouched", migration_required=False, dry_run=False, + ) + changes = (tree / "CHANGES.md").read_text(encoding="utf-8") + assert version_mod.MIGRATION_NONE_MARKER in changes + + _migration_document(tree, "2.0.0") + version_cmd.bump_command( + major=True, minor=False, patch=False, title="Turns out it migrates", + breaking=None, no_migration=None, migration_required=True, dry_run=False, + ) + changes = (tree / "CHANGES.md").read_text(encoding="utf-8") + assert version_mod.MIGRATION_NONE_MARKER not in changes + assert version_mod.BREAKING_CHANGE_MARKER in changes # untouched by the retraction + assert (tree / "VERSION").read_text(encoding="utf-8").strip() == "2.0.0-beta.2" + + +def test_migration_required_is_refused_without_a_migration_document(tree): + version_cmd.bump_command( + major=True, minor=False, patch=False, title="Breaking", + breaking="the feed moved", no_migration="kb/ untouched", migration_required=False, dry_run=False, + ) + with pytest.raises(typer.Exit): + version_cmd.bump_command( + major=True, minor=False, patch=False, title="Turns out it migrates", + breaking=None, no_migration=None, migration_required=True, dry_run=False, + ) + changes = (tree / "CHANGES.md").read_text(encoding="utf-8") + assert version_mod.MIGRATION_NONE_MARKER in changes # unchanged + + +def test_migration_required_is_refused_with_no_no_migration_line_to_retract(tree): + _migration_document(tree, "2.0.0") + version_cmd.bump_command( + major=True, minor=False, patch=False, title="Breaking", + breaking="the feed moved", no_migration=None, migration_required=False, dry_run=False, + ) + with pytest.raises(typer.Exit): + version_cmd.bump_command( + major=True, minor=False, patch=False, title="Nothing to retract", + breaking=None, no_migration=None, migration_required=True, dry_run=False, + ) + + +def test_migration_required_is_refused_together_with_no_migration(tree): + with pytest.raises(typer.Exit): + version_cmd.bump_command( + major=True, minor=False, patch=False, title="Contradiction", + breaking="the feed moved", no_migration="kb/ untouched", + migration_required=True, dry_run=False, + ) + + +def test_migration_required_is_refused_without_a_running_candidate(tree): + """Nothing to retract before any candidate has ever crossed the boundary.""" + with pytest.raises(typer.Exit): + version_cmd.bump_command( + major=False, minor=False, patch=True, title="Fix", + breaking=None, no_migration=None, migration_required=True, dry_run=False, + ) + + +def test_insert_changes_entry_migration_required_clears_the_no_migration_line(): + text = CHANGES_HEADER + "## 1.4.0 - 2026-08-29 - Older\n\nBody.\n" + first = version_mod.insert_changes_entry( + text, Version(2, 0, 0, beta=1), "2026-09-01", "Breaking bump", "Someone", + breaking_reason="the feed moved", no_migration_reason="kb untouched", + ) + second = version_mod.insert_changes_entry( + first, Version(2, 0, 0, beta=2), "2026-09-02", "Follow-up", "Someone", + migration_required=True, + ) + assert version_mod.MIGRATION_NONE_MARKER not in second + assert version_mod.BREAKING_CHANGE_MARKER in second + assert "the feed moved" in second + + # --- version bump: the breaking-change note -------------------------------- @@ -471,7 +564,7 @@ def test_a_boundary_crossing_bump_without_breaking_is_refused(tree): with pytest.raises(typer.Exit): version_cmd.bump_command( major=True, minor=False, patch=False, title="Renamed the feed", - breaking=None, no_migration="kb/ keeps its shape", dry_run=False, + breaking=None, no_migration="kb/ keeps its shape", migration_required=False, dry_run=False, ) assert (tree / "VERSION").read_text(encoding="utf-8").strip() == "1.0.0" @@ -480,7 +573,7 @@ def test_breaking_records_what_stops_working_in_the_changelog(tree): version_cmd.bump_command( major=True, minor=False, patch=False, title="Renamed the feed", breaking="update_url points at a repo path that no longer exists", - no_migration="kb/ keeps its shape", dry_run=False, + no_migration="kb/ keeps its shape", migration_required=False, dry_run=False, ) changes = (tree / "CHANGES.md").read_text(encoding="utf-8") assert version_mod.BREAKING_CHANGE_MARKER in changes @@ -497,7 +590,7 @@ def test_breaking_is_refused_on_a_compatible_bump(tree): with pytest.raises(typer.Exit): version_cmd.bump_command( major=False, minor=True, patch=False, title="New command", - breaking="nothing, really", no_migration=None, dry_run=False, + breaking="nothing, really", no_migration=None, migration_required=False, dry_run=False, ) assert (tree / "VERSION").read_text(encoding="utf-8").strip() == "1.0.0" @@ -508,7 +601,7 @@ def test_breaking_is_refused_on_a_compatible_bump(tree): def test_release_fixes_version_and_the_changelog_heading(tree): version_cmd.bump_command( major=False, minor=True, patch=False, title="First bump", - breaking=None, no_migration=None, dry_run=False, + breaking=None, no_migration=None, migration_required=False, dry_run=False, ) version_cmd.release_command(title=None, dry_run=False) assert (tree / "VERSION").read_text(encoding="utf-8").strip() == "1.1.0" @@ -521,11 +614,11 @@ def test_release_fixes_version_and_the_changelog_heading(tree): def test_release_can_replace_the_title(tree): version_cmd.bump_command( major=False, minor=True, patch=False, title="First bump", - breaking=None, no_migration=None, dry_run=False, + breaking=None, no_migration=None, migration_required=False, dry_run=False, ) version_cmd.bump_command( major=False, minor=False, patch=True, title="Second bump", - breaking=None, no_migration=None, dry_run=False, + breaking=None, no_migration=None, migration_required=False, dry_run=False, ) version_cmd.release_command(title="Summary of both bumps", dry_run=False) changes = (tree / "CHANGES.md").read_text(encoding="utf-8") @@ -539,7 +632,7 @@ def test_release_can_replace_the_title(tree): def test_release_dry_run_writes_nothing(tree): version_cmd.bump_command( major=False, minor=True, patch=False, title="First bump", - breaking=None, no_migration=None, dry_run=False, + breaking=None, no_migration=None, migration_required=False, dry_run=False, ) version_cmd.release_command(title=None, dry_run=True) assert (tree / "VERSION").read_text(encoding="utf-8").strip() == "1.1.0-beta.1" @@ -554,7 +647,7 @@ def test_release_refuses_when_version_is_already_a_release(tree): def test_release_refuses_when_version_and_changelog_disagree(tree): version_cmd.bump_command( major=False, minor=True, patch=False, title="First bump", - breaking=None, no_migration=None, dry_run=False, + breaking=None, no_migration=None, migration_required=False, dry_run=False, ) (tree / "VERSION").write_text("9.9.9-beta.1\n", encoding="utf-8") with pytest.raises(typer.Exit): @@ -572,11 +665,11 @@ def test_notes_prints_the_entry_for_the_current_version(tree, capsys): def test_notes_prints_a_running_candidates_full_entry(tree, capsys): version_cmd.bump_command( major=False, minor=True, patch=False, title="First bump", - breaking=None, no_migration=None, dry_run=False, + breaking=None, no_migration=None, migration_required=False, dry_run=False, ) version_cmd.bump_command( major=False, minor=False, patch=True, title="Second bump", - breaking=None, no_migration=None, dry_run=False, + breaking=None, no_migration=None, migration_required=False, dry_run=False, ) version_cmd.notes_command(version=None) out = capsys.readouterr().out diff --git a/tools/chemenu/tests/test_xref.py b/tools/chemenu/tests/test_xref.py index e23e73b..4dc3810 100644 --- a/tools/chemenu/tests/test_xref.py +++ b/tools/chemenu/tests/test_xref.py @@ -181,7 +181,7 @@ def test_xref_remove_clears_a_ref_to_a_page_that_no_longer_exists(kb_dir): kb_dir / "entities/tools/gdeploy.md", {"type": "types/entity.md", "entity_type": "tool", "tags": [], "created": "2026-07-25", "modified": "2026-07-25", - "related": ["Ghost Page"], "sources": [], "confidence": 0.8}, + "related": ["Ghost Page"], "sources": []}, "\n# gdeploy\n\n## See Also\n\n- [[Ghost Page]]\n", ) diff --git a/tools/chemenu/version.py b/tools/chemenu/version.py index db62f08..c2ff734 100644 --- a/tools/chemenu/version.py +++ b/tools/chemenu/version.py @@ -493,6 +493,18 @@ def _set_marker_line(section: str, marker: str, line: str) -> str: return section[:insert_at] + f"\n{line}\n" + section[insert_at:] +def _clear_marker_line(section: str, marker: str) -> str: + """Remove the one-line `marker ...` paragraph from `section`, if present. + + The retraction counterpart to `_set_marker_line`. A candidate that + recorded `--no-migration` and later turns out to need one after all has no + other way to take that statement back - the line is machine-managed, and + invariant 1 forbids hand-editing it. + """ + pattern = re.compile(rf"^{re.escape(marker)}.*\n?", re.MULTILINE) + return pattern.sub("", section, count=1) + + def _entry_span(text: str) -> tuple[int, int]: """Start/end offsets of the topmost entry, heading included.""" match = re.search(r"^## ", text, re.MULTILINE) @@ -511,10 +523,15 @@ def _update_open_candidate( title: str, breaking_reason: Optional[str], no_migration_reason: Optional[str], + migration_required: bool = False, ) -> str: """Move the topmost entry's heading to `version`/`date`/`title`, append `title` to its machine-managed bump list, and set the breaking/no-migration - lines only where this call supplies them - see `insert_changes_entry`.""" + lines only where this call supplies them - see `insert_changes_entry`. + + `migration_required` retracts an earlier `--no-migration` line instead of + setting one - the two are mutually exclusive on a single bump, enforced by + the caller (`version_cmd.bump_command`), not here.""" start, end = _entry_span(text) section = text[start:end] @@ -529,6 +546,8 @@ def _update_open_candidate( section = _set_marker_line(section, BREAKING_CHANGE_MARKER, f"{BREAKING_CHANGE_MARKER} {breaking_reason}") if no_migration_reason: section = _set_marker_line(section, MIGRATION_NONE_MARKER, f"{MIGRATION_NONE_MARKER} - {no_migration_reason}") + elif migration_required: + section = _clear_marker_line(section, MIGRATION_NONE_MARKER) return text[:start] + section + text[end:] @@ -541,6 +560,7 @@ def insert_changes_entry( author: str, no_migration_reason: Optional[str] = None, breaking_reason: Optional[str] = None, + migration_required: bool = False, ) -> str: """Open a new entry above the newest existing one, or - when the topmost entry is still an open candidate (a pre-release heading) - update that @@ -560,12 +580,17 @@ def insert_changes_entry( release notes has to act on, and the migration line only qualifies it. The entry's actual prose is written afterwards by whoever made the change, which is also why `bump` refuses to invent a title. + + `migration_required` only has anything to retract on an already-open + candidate, so a fresh entry ignores it - there is no earlier + `--no-migration` line in a skeleton that was just opened. """ top = top_changes_version(text) if top is not None and top.is_prerelease: return _update_open_candidate( text, version, date, title, breaking_reason=breaking_reason, no_migration_reason=no_migration_reason, + migration_required=migration_required, ) lines = [f"## {version} - {date} - {title}", "", f"**Author:** {author}", ""] diff --git a/types/concept.md b/types/concept.md index 4305754..dd06de9 100644 --- a/types/concept.md +++ b/types/concept.md @@ -45,8 +45,6 @@ layout: | `modified` | Ja | Datum der letzten Änderung (YYYY-MM-DD) | | `related` | Nein | Titel verwandter Concepts und Entities | | `sources` | Nein | Titel der Source-Seiten, die die Aussagen dieser Seite stützen | -| `confidence` | Nein | Abgeleitete Konfidenz (0.0-1.0), neu berechnet von `wikitool confidence decay` | -| `confidence_base` | Nein | Unverfallene Konfidenz zum Zeitpunkt der letzten Bestätigung - bei einer Neubewertung dieses Feld ändern, nicht `confidence` | | `provenance` | Ja | sourced, general oder mixed | | `summary` | Ja | Einzeiler für `kb/index.md` | diff --git a/types/concept.schema.yaml b/types/concept.schema.yaml index cca4673..01b10f1 100644 --- a/types/concept.schema.yaml +++ b/types/concept.schema.yaml @@ -47,18 +47,6 @@ properties: items: type: string description: Source page titles that support claims - confidence: - type: number - minimum: 0.0 - maximum: 1.0 - default: 0.5 - description: Confidence score for the concept's information (derived - recomputed by `wikitool confidence decay` from confidence_base) - confidence_base: - type: number - minimum: 0.0 - maximum: 1.0 - default: 0.5 - description: Undecayed confidence at last confirmation; the input `wikitool confidence decay` decays from. Set this, not `confidence`, when re-assessing a page. provenance: type: string enum: [sourced, general, mixed] diff --git a/types/entity.md b/types/entity.md index e1803f2..1702770 100644 --- a/types/entity.md +++ b/types/entity.md @@ -43,8 +43,6 @@ layout: | `modified` | Ja | Datum der letzten Änderung (YYYY-MM-DD) | | `related` | Nein | Titel verwandter Seiten (Entities, Concepts, Sources) | | `sources` | Nein | Titel der Source-Seiten, die die Aussagen dieser Seite stützen | -| `confidence` | Nein | Abgeleitete Konfidenz (0.0-1.0), neu berechnet von `wikitool confidence decay` | -| `confidence_base` | Nein | Unverfallene Konfidenz zum Zeitpunkt der letzten Bestätigung - bei einer Neubewertung dieses Feld ändern, nicht `confidence` | | `provenance` | Ja | sourced, general oder mixed | | `summary` | Ja | Einzeiler für `kb/index.md` | diff --git a/types/entity.schema.yaml b/types/entity.schema.yaml index 1598c93..79554a4 100644 --- a/types/entity.schema.yaml +++ b/types/entity.schema.yaml @@ -47,18 +47,6 @@ properties: items: type: string description: Source page titles that support claims - confidence: - type: number - minimum: 0.0 - maximum: 1.0 - default: 0.5 - description: Confidence score for the entity's information (derived - recomputed by `wikitool confidence decay` from confidence_base) - confidence_base: - type: number - minimum: 0.0 - maximum: 1.0 - default: 0.5 - description: Undecayed confidence at last confirmation; the input `wikitool confidence decay` decays from. Set this, not `confidence`, when re-assessing a page. provenance: type: string enum: [sourced, general, mixed] diff --git a/types/instruction.md b/types/instruction.md index 8c7895d..abe185a 100644 --- a/types/instruction.md +++ b/types/instruction.md @@ -41,9 +41,8 @@ flat file is reached only through a link or an explicit request. See | `name` | Yes | Short identifier, matching the filename stem | | `description` | Yes | The retrieval wire: the question an agent would ask when it needs this procedure. Not a label for the file | -There is deliberately no `summary`, no `confidence` and no `sources`. An instruction is not a -knowledge claim: it is either correct and in use, or it is wrong and gets fixed. Scoring its -confidence would suggest a middle state that does not exist. +There is deliberately no `summary` and no `sources`. An instruction is not a knowledge claim: it +is either correct and in use, or it is wrong and gets fixed. ## Authoring Instructions diff --git a/types/type-spec.md b/types/type-spec.md index 39df8aa..2618df4 100644 --- a/types/type-spec.md +++ b/types/type-spec.md @@ -173,9 +173,9 @@ replace anyway. See `tools/chemenu/blocks.py`. | Owned here | Owned by `kb/CONTRACT.md` | Owned by `kb/CONVENTIONS.md` and the collection contracts | |------------|--------------------------|-----------------------------------------------------------| | Frontmatter fields, enums, defaults, required-ness | Provenance and citation mechanics | Quality goal and tone | -| Directory placement and title prefix | The confidence machinery | Naming conventions and the confidence rubric | -| Body skeleton (template) | Linking mechanics and the orphan check | Relationship vocabulary | -| When to use / not use this type | The prose/identifier rule | The KB language and its section-heading names | +| Directory placement and title prefix | Linking mechanics and the orphan check | Naming conventions | +| Body skeleton (template) | The prose/identifier rule | Relationship vocabulary | +| When to use / not use this type | — | The KB language and its section-heading names | If a rule would be identical for every type *and* every instance, it belongs in `kb/CONTRACT.md`. If every instance would answer it differently, it belongs in