From a9069f188e516ec928cbf5689fad2d6b14def060 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 29 Jul 2026 08:01:39 +0000 Subject: [PATCH 1/3] registry pages: capture enumerable sources completely, one cited row per entry MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A source that is (or contains) a uniform enumeration of like entries — a machine inventory, an error-code catalog, a customer roster, a price list — used to come out as a representative subset with the tail compressed into one footnote (the kelvarra Sundries defect). The rules actively demanded it: the granularity floor prefers fewer dense pages, essence-not-structure discards enumerable data, and meeting-minutes routes perennial reference tables to "ordinary facts" with no aggregate destination. New `Registry` type (folder `registries/`): one page per collection, one bullet per entry with the entry's source-verbatim key in bold and its own citation at the finest available locator. The granularity floor is unchanged — an entry earns its own page (of its own kind) only past several independent cited facts, and its row becomes key + link + one-line gloss. Delivered as rules text (new `genres/registry.md`, a `Registry` row + decision step + `## Registries` contract in schema.md, floor/essence carve-outs in core.md, the meeting-minutes reroute, reconcile keep-treatment) plus two code touches: the `okf.folder_for_type` mapping (same commit as the rules text, or the misc-fallback + curate resort would relocate every registry page) and a type-aware curate length guidance (an oversized registry splits by entry range/subclass into sibling registries, never along topics). Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_01X8L1A9vAa2WJKemtM21uR9 --- .github/copilot-instructions.md | 6 +- CHANGELOG.md | 14 ++++ CLAUDE.md | 6 +- README.md | 4 +- citadel/curate.py | 18 ++++- citadel/okf.py | 13 +++- citadel/rules/README.md | 3 +- citadel/rules/core.md | 6 ++ citadel/rules/genres/meeting-minutes.md | 3 +- citadel/rules/genres/registry.md | 99 +++++++++++++++++++++++++ citadel/rules/schema.md | 26 ++++++- citadel/rules/tasks/reconcile.md | 8 +- tests/test_curate.py | 60 +++++++++++++++ tests/test_okf.py | 6 ++ 14 files changed, 251 insertions(+), 21 deletions(-) create mode 100644 citadel/rules/genres/registry.md diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index 069abab..758bf0c 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -165,9 +165,9 @@ recomputed from them in memory. **Three layers** (the README and `citadel/rules/schema.md` are authoritative): 1. `raw/` — immutable sources the agent reads but never edits. 2. `wiki/` — the LLM-owned OKF bundle: pages routed *by kind* into `concepts/`, `objects/`, - `systems/`, `persons/`, `organizations/`, `projects/`, `abbreviations/`, `misc/` (see - `okf.folder_for_type`), cross-linked with relative markdown links, each fact carrying a footnote - citation. + `systems/`, `persons/`, `organizations/`, `projects/`, `abbreviations/`, `registries/`, `misc/` + (see `okf.folder_for_type`), cross-linked with relative markdown links, each fact carrying a + footnote citation. 3. `citadel/rules/` — the schema/rules tree, packaged with the wheel (index: `citadel/rules/README.md`): `schema.md` (format contract) + `core.md` (agent behavior) are read every session, plus one diff --git a/CHANGELOG.md b/CHANGELOG.md index 9208139..501c60c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,20 @@ All notable changes to this project are documented here. The format is based on ### Added +- **`Registry` pages — enumerable sources are captured completely.** A source that is (or + contains) a uniform enumeration of like entries — a machine/asset inventory, an error-code + catalog, a customer roster, a product/price list — now folds into ONE `type: Registry` page + (new folder `wiki/registries/`): one cited row per entry with the finest available locator, + instead of a representative subset with the tail compressed into a single footnote. The + granularity floor is unchanged — an entry earns its own page (of its own kind) only once it + carries several independent cited facts, and its registry row becomes a link + one-line gloss. + The behavior lives in the rules tree (new `genres/registry.md` brief, a `Registry` row + + decision-procedure step + `## Registries` contract in `schema.md`, floor/essence carve-outs in + `core.md`); code-side the type is routed by `okf.folder_for_type`, and curate's over-length + guidance is now type-aware — an oversized registry splits by entry range/subclass into sibling + registries, never along topics. Known limit: a list source over `CITADEL_MAX_SOURCE_CHARS` + (~300k chars) is chunked through segment files whose line numbers rebase, so per-row + `lines A-B` locators of such oversized lists are not offline-verifiable yet. - **The model a source was imported with is now the model that actually ran.** Each backend's own session envelope is parsed for the serving model — claude's `modelUsage` map (the PRIMARY entry by token volume, so the small model claude routes side work to never wins), copilot's JSONL diff --git a/CLAUDE.md b/CLAUDE.md index 49a0c7a..1d92d9d 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -162,9 +162,9 @@ recomputed from them in memory. **Three layers** (the README and `citadel/rules/schema.md` are authoritative): 1. `raw/` — immutable sources the agent reads but never edits. 2. `wiki/` — the LLM-owned OKF bundle: pages routed *by kind* into `concepts/`, `objects/`, - `systems/`, `persons/`, `organizations/`, `projects/`, `abbreviations/`, `misc/` (see - `okf.folder_for_type`), cross-linked with relative markdown links, each fact carrying a footnote - citation. + `systems/`, `persons/`, `organizations/`, `projects/`, `abbreviations/`, `registries/`, `misc/` + (see `okf.folder_for_type`), cross-linked with relative markdown links, each fact carrying a + footnote citation. 3. `citadel/rules/` — the schema/rules tree, packaged with the wheel (index: `citadel/rules/README.md`): `schema.md` (format contract) + `core.md` (agent behavior) are read every session, plus one diff --git a/README.md b/README.md index 72cb261..34dc3e1 100644 --- a/README.md +++ b/README.md @@ -85,8 +85,8 @@ authoritative rules, which the ingest agent reads — referenced by path — eve 1. **`raw/`** — immutable sources; ingest reads but never edits them. 2. **`wiki/`** — the LLM-owned OKF bundle: markdown pages with YAML frontmatter, routed **by kind** into `concepts/`, `objects/`, `systems/`, `persons/`, `organizations/`, `projects/`, - `abbreviations/`, `misc/`, densely cross-linked, each fact carrying a citation. The reserved - `index.md`, `log.md`, and `sources/index.md` are generated, not authored. + `abbreviations/`, `registries/`, `misc/`, densely cross-linked, each fact carrying a citation. + The reserved `index.md`, `log.md`, and `sources/index.md` are generated, not authored. 3. **[`citadel/rules/`](https://github.com/MarkusNeusinger/cite-citadel/blob/main/citadel/rules/README.md)** — the schema/rules layer: `schema.md` (the format contract) + `core.md` (agent behavior) + per-lifecycle `tasks/`, per-file-type `formats/`, and agent-judged `genres/` briefs. Editing them changes how the wiki is built with diff --git a/citadel/curate.py b/citadel/curate.py index db91487..d5a4a01 100644 --- a/citadel/curate.py +++ b/citadel/curate.py @@ -501,6 +501,22 @@ def _link_neighbors(page: Page, inbound: dict[str, list[str]]) -> list[str]: ), } +_REGISTRY_LENGTH_GUIDANCE = ( + "This Registry page is over the hard length threshold. Split it by entry range or subclass " + "into sibling `Registry` pages, the original becoming a short hub page linking the parts — " + "never a topic split, and never drop or compress entries: every row keeps its `[^sN]` marker " + "AND its `## Sources` definition (see `genres/registry.md`)." +) + + +def _reason_guidance(reason: str, page: Page) -> str: + """The per-reason instruction line for the findings checklist. A `Registry` page over the + length threshold must split by entry range into sibling registries — the generic topic-split + guidance would shred its rows across topic pages.""" + if reason == REASON_PAGE_LENGTH and (page.type or "").strip().lower() == "registry": + return _REGISTRY_LENGTH_GUIDANCE + return _REASON_GUIDANCE.get(reason, "Review and repair per the rules.") + def _render_findings(item: PlanItem, page: Page, inbound: dict[str, list[str]]) -> str: """The per-cluster findings checklist the agent reads BY PATH (never embedded in the prompt). @@ -519,7 +535,7 @@ def _render_findings(item: PlanItem, page: Page, inbound: dict[str, list[str]]) "## Detected issues (act on each ONLY where it genuinely holds against the sources)", ] for reason in item.reasons: - lines.append(f"- **{reason}** — {_REASON_GUIDANCE.get(reason, 'Review and repair per the rules.')}") + lines.append(f"- **{reason}** — {_reason_guidance(reason, page)}") lines += [ "", "If the findings do not hold up against the pages and their cited raw files, make no edits " diff --git a/citadel/okf.py b/citadel/okf.py index e227dbd..acd0eac 100644 --- a/citadel/okf.py +++ b/citadel/okf.py @@ -174,6 +174,7 @@ def folder_for_type(type_: str) -> str: | ``Organization`` | ``organizations`` | | ``Project`` | ``projects`` | | ``Abbreviation`` | ``abbreviations`` | + | ``Registry`` | ``registries`` | | ``Entity`` (legacy) | ``entities`` | | anything else | ``misc`` | @@ -181,10 +182,13 @@ def folder_for_type(type_: str) -> str: route without guessing (the "can you touch it?" test: a physical/engineered thing — a part, product, material, or device — is an ``Object``; a principle/method/topic is a ``Concept``; an external software system/service a source connects to — DB, API, queue, library — is a - ``System``). ``Person``/``Organization``/``Project`` replace the old overloaded ``Entity`` - ("person, org, project, tool"). ``Entity`` is still routed to ``entities`` as a tolerated - **legacy alias** so old pages keep working, but it should no longer be produced. The British - spelling ``Organisation`` is accepted as an alias of ``Organization``.""" + ``System``). ``Registry`` is a complete enumeration of like entries captured row-by-row from + a source (a machine inventory, an error-code catalog, a customer roster — see + ``rules/genres/registry.md``). ``Person``/``Organization``/``Project`` replace the old + overloaded ``Entity`` ("person, org, project, tool"). ``Entity`` is still routed to + ``entities`` as a tolerated **legacy alias** so old pages keep working, but it should no + longer be produced. The British spelling ``Organisation`` is accepted as an alias of + ``Organization``.""" normalized = (type_ or "").strip().lower() return { "concept": "concepts", @@ -195,6 +199,7 @@ def folder_for_type(type_: str) -> str: "organisation": "organizations", # British spelling — same folder "project": "projects", "abbreviation": "abbreviations", + "registry": "registries", "entity": "entities", # legacy alias — superseded by object/person/organization/project }.get(normalized, "misc") diff --git a/citadel/rules/README.md b/citadel/rules/README.md index 7141ddc..fed9867 100644 --- a/citadel/rules/README.md +++ b/citadel/rules/README.md @@ -8,7 +8,7 @@ files changes how the wiki is built — **with no code change**; treat them as p | File | Purpose | Consumed by | | ---- | ------- | ----------- | -| `schema.md` | The format contract: OKF frontmatter, folder routing, citation grammar + locators, grounding/quality contract, contradictions, links, tags, abbreviations, wiki language, opinions & style | every session | +| `schema.md` | The format contract: OKF frontmatter, folder routing, citation grammar + locators, grounding/quality contract, contradictions, links, tags, abbreviations, registries, wiki language, opinions & style | every session | | `core.md` | Generic behavior: paths-verbatim, workflow, path-as-context, code essence, genre selection, restructuring, off-limits, self-check | every session | | `tasks/ingest.md` | Fold a NEW source in; segmented large-source passes | kinds `ingest`, `image`, `audio`, `pdf`, `repo` | | `tasks/reconcile.md` | Re-fold a CHANGED (or force-re-read) source: update/remove stale facts, re-check locators, keep genre treatment | kinds `reconcile`, `image-reconcile`, `audio-reconcile`, `pdf-reconcile`, `repo-reconcile` | @@ -29,6 +29,7 @@ files changes how the wiki is built — **with no code change**; treat them as p | `genres/chat.md` | Workplace-chat exports: timestamped attribution, decisions reverse in-thread (live fact = end state), terse decisions still count, banter stays out | agent judgment | | `genres/transcript.md` | Multi-speaker spoken word: per-speaker attribution, unlabeled speakers stay roles, no invented precision | agent judgment | | `genres/cv.md` | CVs/applications: everything is self-reported and attributed, claims vs corroborating evidence | agent judgment | +| `genres/registry.md` | Enumerable-entry sources (inventories, catalogs, rosters, code lists): one `Registry` page per collection, one cited row per entry, complete — promotion past the granularity floor | agent judgment | The two axes are decided by two different parties: a **format** is structurally detectable, so the *code* selects the format brief (repo markers, image/Office/audio extensions, PDF); a **genre** is diff --git a/citadel/rules/core.md b/citadel/rules/core.md index 9f566ef..97e5924 100644 --- a/citadel/rules/core.md +++ b/citadel/rules/core.md @@ -74,6 +74,9 @@ component, or type. - **Litmus test:** *would this still be true and useful if the code were rewritten in another language or framework?* If yes, capture it. If it only describes how this particular file is structured, skip it. +- **Data rows are not code structure.** A machine list, price table, or code catalog *inside* a + data file is CONTENT, captured row-by-row (`genres/registry.md`) — the essence rule strips a + program's scaffolding, never a dataset's entries. A code "fact" is a faithful description of intent or behavior **derived from and cited to the file** — a slightly more interpretive mode than restating a prose sentence, but the grounding @@ -103,6 +106,9 @@ when needed: cultivar, a product variant, a sub-process. A named entity earns its own page only when it carries **several independent cited facts**; until then, fold it into its parent concept page as a linkable section. Prefer fewer dense, well-cross-linked pages over many thin stubs. + The floor limits **pages, not rows**: like entries enumerated by a source (an inventory, + catalog, roster, or code list) are captured **completely** — one cited row each — on a + `Registry` page (`genres/registry.md`); an entry still earns its own page only past the floor. - **Split** a page that has grown too large or mixes unrelated topics: write the focused new files carrying the moved facts **with their `[^sN]` citations**, then delete the original. - **Merge** two pages on the same topic: write the survivor with the full merged body (citations diff --git a/citadel/rules/genres/meeting-minutes.md b/citadel/rules/genres/meeting-minutes.md index 3efb40a..7759f50 100644 --- a/citadel/rules/genres/meeting-minutes.md +++ b/citadel/rules/genres/meeting-minutes.md @@ -15,7 +15,8 @@ open", "now resolved", "closed") **or** its **semantics** say so even without th unstructured note that names an owner and an unresolved action — "Ana will look at the DB, aiming for next sprint"). It is **not** a tracking artifact when its items are **standing/recurring** — a runbook, checklist, policy, or reference table. Test: *can this item reach a terminal "done" -state?* If items are perennial, ingest as ordinary facts, no thread. +state?* If items are perennial, no thread: ingest as ordinary facts — and when they form a +uniform enumeration of like entries, as a registry (`genres/registry.md`). ## Fan-out stays mandatory; the thread is an additive overlay diff --git a/citadel/rules/genres/registry.md b/citadel/rules/genres/registry.md new file mode 100644 index 0000000..cf6bc28 --- /dev/null +++ b/citadel/rules/genres/registry.md @@ -0,0 +1,99 @@ +# registry — enumerable-entry sources (inventories, catalogs, rosters, code lists) + +Applies when the source is — or contains — a **uniform enumeration of like entries** whose value +lies in being complete: a machine/asset inventory, a product catalog or price list, a customer or +contact roster, an error-code / problem-type table, a server or license inventory, a bill of +materials. Test: *the entries share one attribute shape, and a reader would ask "is X on the +list?"*. When that test holds, the enumeration is captured completely on a `Registry` page — +this brief says how. + +## Completeness over compression + +**Every entry gets a row — a skipped entry is an error, not a compression.** The granularity +floor (`core.md` § Restructuring) limits *pages*, never *rows*: compressing the tail of a catalog +into one summary sentence loses exactly the answers a registry exists for ("is X on the list?", +"what does code E-142 mean?"). + +- WRONG: `The catalog also lists survey chains, thermometers, sounding leads, and a rain + gauge.[^s9]` — four products, one citation, no per-entry attributes, none findable. +- RIGHT: four bullets, four citations, each with its own locator and its stated attributes. + +When the source states a total ("the plant operates 28 machines"), cite that count in the scope +paragraph — it is the registry's own completeness check. + +## One page per collection + +Route the enumeration to **one `Registry` page per collection** (`type: Registry` → +`wiki/registries/`; format contract: `schema.md` § Registries) — never one page per entry, and +never rows scattered as loose facts across topic pages. Like a `System` page, a registry +**accumulates across sources**: a later source listing the same collection extends the SAME page +— search for an existing registry before creating one. Title it after the collection and its +scope ("Machine registry — Aldervik plant"), never a bare "Index" or "Catalog". + +## Row shape and identity + +One bullet = one entry = its own citation: + +``` +- **HX-201** — heat exchanger, commissioned 1998, in service.[^s2] +``` + +- The **bold key is the entry's stable identity**: the source's own identifier verbatim (machine + number, error code, customer ID) when it has one, else the entry's name. **Search before you + append** — grep the page (and the wiki) for the key first, and extend the existing row instead + of adding a near-duplicate; a second row under a variant spelling forks the entry silently. +- Group rows under `##` sections only when the source's own structure suggests it (by building, + class, code range). +- Cite the **finest locator the format offers**: `lines A-B` (often a single line) for text and + CSV entries; for a spreadsheet, rows of one sheet legitimately share that sheet's single + `§ Sheet: X` marker — the sheet IS the location — with the covered keys named in the + definition's free-text note. Facts from different places in the source still get separate + markers (`schema.md` § Locators). + +## Promotion past the granularity floor + +The floor itself is unchanged: an entry earns its **own page** only when it carries several +independent cited facts (typically from a second source — a service report, a complaint, a spec). +When it does, create that page **typed by its own kind** — a machine → `Object`, a customer → +`Organization` or `Person`, a service → `System` — and reduce the registry row to **key + link + +one-line gloss + its membership citation**: + +``` +- **PV-014** — [PV-014 pressure vessel](../objects/pv-014-pressure-vessel.md) — 2019 vessel, + under observation since June.[^s4] +``` + +The facts move to the entry's page and live ONLY there — never duplicated on the row. + +## Rows change over time + +Reconcile rules (`tasks/reconcile.md`) apply per row: a changed value updates the bullet, and the +superseded value survives as a dated `## Change Log` line on the registry page +(`genres/meeting-minutes.md` § Dates). A row the current source no longer lists loses this +source's marker — and when no source supports it anymore, it moves to a dated Change Log line +("2026-07: removed from the inventory.[^sN]") instead of vanishing silently; a registry's history +is part of its value. + +## When a registry outgrows a page + +Split a too-long registry **by key range or subclass** into sibling `Registry` pages +(`machine-registry-building-7.md`, `error-codes-e100-e199.md`), the original becoming a short hub +page linking the parts — **never a topic split**, and every row keeps its `[^sN]` marker and +`## Sources` definition. + +## When NOT to registry + +- Items with a terminal "done" state (action items, to-dos, open issues) → `## Open Points` + (`genres/meeting-minutes.md`). +- Chat logs, event streams, timelines — the rows are *events in time*, not standing members of a + collection; genre judgment and noise rules apply (`genres/chat.md`, `genres/social.md`). +- Code symbols — functions, classes, endpoints — stay under `core.md` § Code & structured + sources (but a *data* table inside a repo is data, and this brief applies). +- A paper's references/bibliography section (`genres/publication.md` — cited works are not + sources). +- A handful of heterogeneous one-off mentions — ordinary cited facts on the parent page; the + registry treatment needs uniform shape. +- Abbreviation glossaries → the existing `Abbreviation` machinery (`schema.md` § Abbreviations). + +Compose with `genres/contract.md` when the entries carry legal/financial amounts (verbatim +figures), and with `formats/office.md` for spreadsheet locator grammar. diff --git a/citadel/rules/schema.md b/citadel/rules/schema.md index bd17d10..dd510d8 100644 --- a/citadel/rules/schema.md +++ b/citadel/rules/schema.md @@ -34,6 +34,7 @@ does not**, so boundaries don't overlap. | `Organization` | `wiki/organizations/` | A specific, **named** company, institution, team, or group. (British spelling `Organisation` is accepted as an alias.) | A product it makes → `Object`/`System` | | `Project` | `wiki/projects/` | A specific, **named initiative/effort** with a goal and a lifecycle. | The ongoing topic behind it → `Concept` | | `Abbreviation` | `wiki/abbreviations/` | A short form + its expansion (a glossary entry). | A full term with no acronym → `Concept` | +| `Registry` | `wiki/registries/` | A **complete enumeration of like entries** captured row-by-row from one or more sources — a machine/asset inventory, product catalog, customer roster, error-code list. One page per collection, one cited row per entry (see `genres/registry.md`). | An entry with several independent cited facts → its own page of its kind, the row links to it; a to-do/action list → `## Open Points` (`genres/meeting-minutes.md`) | | anything else | `wiki/misc/` | A genuine leftover only: Note, Metric, Runbook, Event, Place. **Last resort, never a shortcut.** | Anything that fits a row above | | `Entity` *(legacy)* | `wiki/entities/` | **Deprecated** — the old catch-all for "person, org, project, tool". Still routed so old pages keep working; do **not** produce it. Use `Object`/`Person`/`Organization`/`Project`/`System`. | — | @@ -45,8 +46,9 @@ does not**, so boundaries don't overlap. 4. A specific named initiative/effort with a goal and lifecycle? → **Project** 5. An external software/IT system or service the source connects to or uses (DB, API, queue, SaaS, library)? → **System** 6. A physical/engineered thing you could **touch** (product, assembly, component, part, material, device)? → **Object** -7. A principle, method, phenomenon, or topic (not one specific named thing)? → **Concept** -8. None of the above? → **misc** +7. An enumerated collection of like entries captured row-by-row (an inventory, catalog, roster, code list)? → **Registry** +8. A principle, method, phenomenon, or topic (not one specific named thing)? → **Concept** +9. None of the above? → **misc** This split-by-kind is what fixes the old `Entity` overload: people, organizations, projects, software systems, and physical objects are five different shapes of page, and each has its own @@ -306,6 +308,26 @@ each one self-documenting so **both** the short and long form are captured and a worse than a missing one. `citadel lint` lists abbreviations used across pages but never defined, so a human can fill the gaps. +## Registries — enumerations captured completely + +A `Registry` page (routed to `wiki/registries/`) holds a **complete enumeration of like +entries** — a machine inventory, an error-code catalog, a customer roster. The behavioral rules +live in `genres/registry.md`; the format contract is: + +- The page opens with a **scope paragraph** stating what collection it covers and from which + source(s), cited — when the source states a total count, cite that too. +- **One bullet = one entry = its own citation.** The bullet starts with the entry's **bold key** + (the source's own identifier verbatim — machine number, error code, customer ID — else the + name), then the entry's attributes: `- **HX-201** — heat exchanger, commissioned 1998.[^s2]`. +- Each entry cites the **finest locator the format offers** (`lines A-B` for text; rows of one + spreadsheet sheet share that sheet's single `§ Sheet: X` marker — the sheet is the location — + with the covered keys named in the definition's free-text note). +- An entry promoted to its own page (past the granularity floor, `core.md` § Restructuring) + keeps its row as **key + link + one-line gloss + its membership citation**; its facts live + only on the entry's page. +- Title the page after the collection and its scope ("Machine registry — Aldervik plant") — + never a bare "Index" or "Catalog" (an *Index* title slugs to the reserved `index.md`). + ## Wiki language The wiki is written in ONE **target language**, named in your run instruction (default English) — diff --git a/citadel/rules/tasks/reconcile.md b/citadel/rules/tasks/reconcile.md index 8634a80..a13a738 100644 --- a/citadel/rules/tasks/reconcile.md +++ b/citadel/rules/tasks/reconcile.md @@ -22,10 +22,10 @@ next to the new one: - **Re-check this source's locators** (`schema.md` § Locators): its page/line/heading locators must still point at the right place in the current file. - **Keep the existing genre treatment.** The wiki shows how this source was treated at first - ingest — existing `## Open Points` threads, `## Change Log` sections, style-profile sections. - Keep maintaining that treatment (per the matching genre briefs) instead of reclassifying the - source and churning its pages. Dated thread bullets are **append-only history — a reconcile - never rewrites or deletes one**; a correction is a new dated bullet + ingest — existing `## Open Points` threads, `## Change Log` sections, registry row lists, + style-profile sections. Keep maintaining that treatment (per the matching genre briefs) instead + of reclassifying the source and churning its pages. Dated thread bullets are **append-only + history — a reconcile never rewrites or deletes one**; a correction is a new dated bullet (`genres/meeting-minutes.md`). ## Segmented reconcile — you see only PART of the source diff --git a/tests/test_curate.py b/tests/test_curate.py index ea623b7..6b523f9 100644 --- a/tests/test_curate.py +++ b/tests/test_curate.py @@ -180,6 +180,66 @@ def test_detector_flags_type_folder_mismatch_for_resort(tmp_citadel, seed_page): assert "resort" in _reasons_for(plan, "concepts/alice.md") +def test_registry_type_routes_cleanly_for_resort(tmp_citadel, seed_page): + """`type: Registry` routes to `registries/` (okf.folder_for_type), so a registry page sitting + there is correctly sorted — while the same type mis-filed under `concepts/` is still planned + for a re-sort. Guards the type mapping landing together with the rules text: without it every + registry page would be flagged (and moved to misc/) each run.""" + from citadel import curate + + (tmp_citadel.raw / "inventory.md").write_text("machines\n", encoding="utf-8") + _seed_cited( + seed_page, "registries/machine-registry.md", "raw/inventory.md", type_="Registry", title="Machine registry" + ) + _seed_cited(seed_page, "concepts/misfiled.md", "raw/inventory.md", type_="Registry", title="Misfiled") + + plan = curate.build_plan() + assert "resort" not in _reasons_for(plan, "registries/machine-registry.md") + assert "resort" in _reasons_for(plan, "concepts/misfiled.md") + + +def test_registry_length_guidance_splits_by_range_not_topic(tmp_citadel, seed_page): + """An over-threshold `Registry` page still trips page_length_hard, but its findings guidance + tells the agent to split by entry range/subclass into sibling registries — the generic + topic-split instruction would shred the rows across topic pages. A non-Registry page keeps + the generic guidance.""" + from citadel import curate, store + + (tmp_citadel.raw / "inventory.md").write_text("machines\n", encoding="utf-8") + rows = "".join(f"- **MX-{i:03d}** — machine {i}.[^s1]\n" for i in range(900)) + seed_page( + "registries/machine-registry.md", + { + "type": "Registry", + "title": "Machine registry", + "description": "d", + "tags": ["t"], + "resource": "raw/inventory.md", + }, + f"{rows}\n## Sources\n\n[^s1]: [raw/inventory.md](../../raw/inventory.md) - s\n", + ) + long_body = "".join(f"Line {i} of a very long page.[^s1]\n\n" for i in range(900)) + seed_page( + "concepts/huge.md", + {"type": "Concept", "title": "Huge", "description": "d", "tags": ["t"], "resource": "raw/inventory.md"}, + f"{long_body}## Sources\n\n[^s1]: [raw/inventory.md](../../raw/inventory.md) - s\n", + ) + + plan = curate.build_plan() + pages = {p.rel_path: p for p in store.load()} + by_page = {item.page: item for item in plan.items} + assert "page_length_hard" in _reasons_for(plan, "registries/machine-registry.md") + + registry_findings = curate._render_findings( + by_page["registries/machine-registry.md"], pages["registries/machine-registry.md"], {} + ) + assert "entry range or subclass" in registry_findings + assert "Split it along its topics" not in registry_findings + + concept_findings = curate._render_findings(by_page["concepts/huge.md"], pages["concepts/huge.md"], {}) + assert "Split it along its topics" in concept_findings + + def test_reverify_candidates_are_prefiltered_to_sha_unchanged_sources(tmp_citadel, seed_page): """Fact re-verification is pre-filtered offline via manifest shas: a source whose bytes CHANGED is reconcile's job, a source that is GONE is delete's job — only sha-UNCHANGED tracked diff --git a/tests/test_okf.py b/tests/test_okf.py index ccdc8af..b5e946e 100644 --- a/tests/test_okf.py +++ b/tests/test_okf.py @@ -175,11 +175,17 @@ def test_default_rel_path_routing(): okf.default_rel_path("Abbreviation", "TDS — Total Dissolved Solids") == "abbreviations/tds-total-dissolved-solids.md" ) + # Registry routes to its own folder — the complete-enumeration page kind. + assert ( + okf.default_rel_path("Registry", "Machine Registry — Aldervik Plant") + == "registries/machine-registry-aldervik-plant.md" + ) # Case-insensitive on the known types; British 'Organisation' aliases to organizations/. assert okf.default_rel_path("concept", "X") == "concepts/x.md" assert okf.default_rel_path("object", "Y") == "objects/y.md" assert okf.default_rel_path("organisation", "Z") == "organizations/z.md" assert okf.default_rel_path("abbreviation", "API") == "abbreviations/api.md" + assert okf.default_rel_path("registry", "Error Codes") == "registries/error-codes.md" # Entity is kept as a tolerated legacy alias so old pages keep working. assert okf.default_rel_path("Entity", "Legacy Thing") == "entities/legacy-thing.md" assert okf.default_rel_path("ENTITY", "Y") == "entities/y.md" From 124b58688118eebc2e9180e8a407a847920735bc Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 29 Jul 2026 08:09:03 +0000 Subject: [PATCH 2/3] werkhof corpus: enumerable sources grading Registry completeness The tenth corpus and the graded proof for the Registry feature: a 28-machine register (>200 lines, so per-row line locators are required), a 20-code fault catalogue (near-miss E-142 vs E-412, a deprecated E-155 -> E-310 hand-over), a 15-customer CSV (the data-not-code boundary), and a June 2026 service report that drives promotion (PV-014 -> objects/, Nordwerk -> organizations/), a dated HX-201 status supersession, attributed opinions, and a done-able open-items list that must land in Open Points, never in a registry. Hidden answer key at .claude/skills/verify-corpus/werkhof/ground-truth.md (outside the corpus); verify-corpus SKILL.md, CLAUDE.md, and the CI corpus floors (9 -> 10) updated. The committed showcase wiki follows in the next commit, generated by a real graded ingest run. Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_01X8L1A9vAa2WJKemtM21uR9 --- .claude/skills/verify-corpus/SKILL.md | 7 +- .../verify-corpus/werkhof/ground-truth.md | 77 +++++++ .github/copilot-instructions.md | 6 +- .github/workflows/ci.yml | 4 +- .github/workflows/pages.yml | 4 +- CLAUDE.md | 6 +- corpora/werkhof/.citadel_run.lock | 1 + corpora/werkhof/README.md | 40 ++++ corpora/werkhof/citadel.toml | 2 + corpora/werkhof/raw/kundenliste.csv | 16 ++ corpora/werkhof/raw/maschinenbestand-2026.md | 213 ++++++++++++++++++ corpora/werkhof/raw/stoercode-katalog.md | 42 ++++ .../werkhof/raw/wartungsbericht-2026-06.md | 48 ++++ 13 files changed, 453 insertions(+), 13 deletions(-) create mode 100644 .claude/skills/verify-corpus/werkhof/ground-truth.md create mode 100755 corpora/werkhof/.citadel_run.lock create mode 100644 corpora/werkhof/README.md create mode 100644 corpora/werkhof/citadel.toml create mode 100644 corpora/werkhof/raw/kundenliste.csv create mode 100644 corpora/werkhof/raw/maschinenbestand-2026.md create mode 100644 corpora/werkhof/raw/stoercode-katalog.md create mode 100644 corpora/werkhof/raw/wartungsbericht-2026-06.md diff --git a/.claude/skills/verify-corpus/SKILL.md b/.claude/skills/verify-corpus/SKILL.md index b453cff..2e3d03d 100644 --- a/.claude/skills/verify-corpus/SKILL.md +++ b/.claude/skills/verify-corpus/SKILL.md @@ -1,11 +1,11 @@ --- name: verify-corpus -description: End-to-end test + grader for the citadel ingest pipeline over the shipped test corpora — beverages (coffee+tea showcase), kelvarra (a coherent fictional world whose facts contradict reality), leuchtfeuer (a 3-year programme ingested in dated waves that drives reconcile/delete/force), pemberley (all of Pride and Prejudice as one large-source chunking + narrative stress test), injection-resistance (mundane documents with adversarial instructions the agent must treat as content), clockwork (a whole git repository folded in as one digest, with a second commit driving repo-reconcile), flurfunk (informal genres — chat, social, interview, application, forum — grading attribution and in-thread reversal), and gazette (PDF sources grading CITADEL_PDF_MODE text-vs-images, the academic-publications genre, and an image-only page), and kontor (binary Office documents — OOXML + legacy OLE — grading the Office extraction path, an embedded-image delta via CITADEL_IMAGE_SUPPORT, dedup-by-basename, and ignore-patterns). Mode A ingests a corpus into a throwaway SANDBOX workspace (never a live wiki), runs the structural gates (citadel check + lint), then grades the result the way a user consumes it — driving citadel's own read tools (search/read/index/tags) to check each hidden ground-truth.md guarantee is both correct+cited and easily findable, dropping to a file-level grep only to separate a wiki-creation defect from a retrieval one and route the miss into an improvement backlog (single-source facts, merges, contradictions, counterfactuals kept-as-stated, temporal supersession, delete propagation, repo digests, cross-links, abbreviations, chunking integrity, attribution, injection non-execution). Use whenever the user wants to run the e2e / corpus test, verify or grade a corpus, (re)build the demo/showcase wiki, prove citations and contradictions still surface, or check that a change to ingest, llm, the rules tree (citadel/rules/), the ingest prompts, or the store still folds a corpus correctly — even if they do not say the word "skill". Takes a corpus name (beverages | kelvarra | leuchtfeuer | pemberley | injection-resistance | clockwork | flurfunk | gazette | kontor | all) and optional --grade-only. +description: End-to-end test + grader for the citadel ingest pipeline over the shipped test corpora — beverages (coffee+tea showcase), kelvarra (a coherent fictional world whose facts contradict reality), leuchtfeuer (a 3-year programme ingested in dated waves that drives reconcile/delete/force), pemberley (all of Pride and Prejudice as one large-source chunking + narrative stress test), injection-resistance (mundane documents with adversarial instructions the agent must treat as content), clockwork (a whole git repository folded in as one digest, with a second commit driving repo-reconcile), flurfunk (informal genres — chat, social, interview, application, forum — grading attribution and in-thread reversal), and gazette (PDF sources grading CITADEL_PDF_MODE text-vs-images, the academic-publications genre, and an image-only page), and kontor (binary Office documents — OOXML + legacy OLE — grading the Office extraction path, an embedded-image delta via CITADEL_IMAGE_SUPPORT, dedup-by-basename, and ignore-patterns), and werkhof (uniform enumerable sources — a machine register, a fault-code catalogue, a customer CSV — grading Registry-page completeness, per-row citations, and promotion past the granularity floor). Mode A ingests a corpus into a throwaway SANDBOX workspace (never a live wiki), runs the structural gates (citadel check + lint), then grades the result the way a user consumes it — driving citadel's own read tools (search/read/index/tags) to check each hidden ground-truth.md guarantee is both correct+cited and easily findable, dropping to a file-level grep only to separate a wiki-creation defect from a retrieval one and route the miss into an improvement backlog (single-source facts, merges, contradictions, counterfactuals kept-as-stated, temporal supersession, delete propagation, repo digests, cross-links, abbreviations, chunking integrity, attribution, injection non-execution). Use whenever the user wants to run the e2e / corpus test, verify or grade a corpus, (re)build the demo/showcase wiki, prove citations and contradictions still surface, or check that a change to ingest, llm, the rules tree (citadel/rules/), the ingest prompts, or the store still folds a corpus correctly — even if they do not say the word "skill". Takes a corpus name (beverages | kelvarra | leuchtfeuer | pemberley | injection-resistance | clockwork | flurfunk | gazette | kontor | werkhof | all) and optional --grade-only. --- # Verify a corpus end-to-end -Nine shipped corpora, each a `corpora//` bundle (`raw/`, sometimes `stages/` or a +Ten shipped corpora, each a `corpora//` bundle (`raw/`, sometimes `stages/` or a materializable repo tree, a `README.md`) plus a hidden answer key at `.claude/skills/verify-corpus//ground-truth.md`. The ingest agent **never sees the key** — it lives outside the corpus, and Mode A points `CITADEL_RAW_DIR` at the @@ -18,7 +18,7 @@ end-to-end — it seeds known defects into a sandbox, proves the offline detecto then runs real curate sessions and grades that the model FIXES them without breaking valid pages. **Usage:** `verify-corpus - [--grade-only]` + [--grade-only]` | corpus | what it stresses | sandbox note | ground-truth | | ------ | ---------------- | ------------ | ------------ | @@ -31,6 +31,7 @@ then runs real curate sessions and grades that the model FIXES them without brea | `flurfunk` | informal genres (chat / social / interview / application / forum); attribution ("X said Y" ≠ "Y is true"), in-thread reversal, a quote-tweet negative row, CV timeline | 7 files, one pass each | `.claude/skills/verify-corpus/flurfunk/ground-truth.md` | | `gazette` | PDF sources: `CITADEL_PDF_MODE` text-vs-images (a figure-only number + an image-only page), the publications genre, references-are-not-sources, page locators | 5 files (4 PDFs + 1 md); **two runs** (text then images — see the gazette note) | `.claude/skills/verify-corpus/gazette/ground-truth.md` | | `kontor` | binary Office documents (OOXML .pptx/.docx/.xlsx + legacy OLE .doc/.ppt/.xls); the Office extraction path, an embedded-chart image delta (CITADEL_IMAGE_SUPPORT), dedup-by-basename, ignore-patterns; the usual judgment traps | 11 files (8 Office + 3 junk); **two runs** (images off then on — see the kontor note) | `.claude/skills/verify-corpus/kontor/ground-truth.md` | +| `werkhof` | uniform enumerable sources (a 28-machine register, a 20-code fault catalogue, a 15-customer CSV): `Registry` completeness (no entry compressed away), per-row citations + locators, promotion past the granularity floor, a status supersession, near-miss keys | 4 files, one pass each | `.claude/skills/verify-corpus/werkhof/ground-truth.md` | Mode A shells out to the ingest CLI (slow, uses your subscription). For fast iteration on the grader use **Mode B** (`--grade-only`) against a sandbox you already built. **Mode C** grades the *curate* diff --git a/.claude/skills/verify-corpus/werkhof/ground-truth.md b/.claude/skills/verify-corpus/werkhof/ground-truth.md new file mode 100644 index 0000000..3b41d7f --- /dev/null +++ b/.claude/skills/verify-corpus/werkhof/ground-truth.md @@ -0,0 +1,77 @@ +# Ground truth — the werkhof corpus + +This is the **answer key** for the `werkhof` corpus (`corpora/werkhof/`). It lives under +`.claude/` (outside the corpus, outside `raw/`/`wiki/`/`docs/`), so the ingest pipeline can never +see it. The verify-corpus skill reads it to grade the wiki the pipeline produced. + +`werkhof` is the **registry corpus**: three of its four sources are uniform enumerations (a +machine register, a fault-code catalogue, a customer CSV) whose value lies in being **complete**. +Its corpus-wide guarantee is the `Registry` page kind (`genres/registry.md`): one page per +collection, one cited row per entry, **no entry compressed away** — plus **promotion**: an entry +with several independent cited facts (from the service report) moves to its own page of its own +kind, its row becoming a link + one-line gloss. + +> Everything is **fictional by design** (Werkhof Anlagenservice Brandt, the Aldervik yard, every +> machine, manufacturer, customer, and person). The wiki must record it faithfully as stated. + +## The 4 source files + +| file | genre | gist | +| ---- | ----- | ---- | +| `maschinenbestand-2026.md` | machine register (registry) | **28 machines** in `###` blocks across four sections, stated total ("all 28 machines"); DL-102 decommissioned 2024 but still listed; PV-014 "inspection due June 2026"; near-miss IDs **HX-201** (shell-and-tube) vs **HX-210** (plate) | +| `stoercode-katalog.md` | fault-code catalogue (registry) | **20 codes** E-101…E-500, stated total; **E-155 deprecated** since rev. 3 (2024), replaced by **E-310**; near-miss **E-142** (compressed-air pressure sensor) vs **E-412** (coolant temperature sensor) | +| `kundenliste.csv` | customer list (registry, CSV) | **15 customers** K-001…K-015 with city/contract/since; K-007 = Nordwerk Maschinenbau GmbH, Wischhafen | +| `wartungsbericht-2026-06.md` | service report (prose + open items) | PV-014 inspection (4 findings + 1 opinion) → **promotion**; HX-201 out of service 2026-06-12 (**supersedes** the register's "in service"); KP-011 logged **E-142**; Nordwerk visit (4 facts) → **promotion**; 3 done-able **open items** | + +Sandbox: one ingest pass, one agentic session per file (4 sessions, serial is fine). + +## A · Registry completeness — the corpus-wide HARD gate + +One `type: Registry` page per collection under `registries/` (three pages; exact titles/slugs are +the agent's), each with a cited scope statement. **A missing entry is a creation defect** — the +whole point of the corpus: + +| id | guarantee | check | +| -- | --------- | ----- | +| `R1` | **all 28 machines** appear as rows on ONE machine-registry page: DL-101, DL-102, FR-110, FR-111, CN-120, CN-121, SW-130, PU-140, KP-010, KP-011, KP-012, PV-013, PV-014, HX-201, HX-210, KR-301, KR-302, ST-310, ST-311, ST-312, WB-320, GN-401, TR-410, CH-420, CT-430, BL-440, WT-450, FS-460 | grep the registry page for each key; count = 28 | +| `R2` | **all 20 fault codes** appear as rows on ONE fault-code-registry page: E-101, E-102, E-110, E-115, E-120, E-142, E-155, E-160, E-201, E-210, E-230, E-250, E-301, E-310, E-320, E-350, E-412, E-420, E-455, E-500 | grep; count = 20 | +| `R3` | **all 15 customers** appear as rows on ONE customer-registry page: K-001…K-015 with their names | grep; count = 15 | +| `R4` | the register's stated total ("all 28 machines") appears in the machine registry's scope statement, cited | read the page head | +| `R5` | each row carries its **own citation** with a locator (`lines A-B` into the register — REQUIRED there, the source is >200 lines); `citadel lint` reports **no locator issues** on the registry pages | lint + spot-check 3 locators resolve to the right block | + +Retrieval-first: `citadel search "KP-011"`, `search "E-420"`, and `search "K-009"` (mid-list keys +that appear nowhere else) must each surface the matching registry page in the top results. + +## B · Promotion past the granularity floor + +| id | guarantee | check | +| -- | --------- | ----- | +| `P1` | **PV-014** has its own `objects/` page carrying the report facts: wall thickness 6.2 mm (down from 6.8 mm, 2023), pressure test passed at 14 bar, corrosion at nozzle N2 ground back and recoated, interval shortened 24 → 12 months / under observation | read the page | +| `P2` | the machine registry's PV-014 **row is a link + one-line gloss** to that page — the inspection facts are NOT duplicated on the row | read the row | +| `P3` | **Nordwerk Maschinenbau GmbH (K-007)** has its own `organizations/` page: contract extended to end of 2028, two visits/year from 2027, contact R. Albers (plant manager) | read the page | +| `P4` | the customer registry's K-007 row links to it | read the row | +| `P5` | machines with only their register block (e.g. WB-320, CT-430) do **NOT** get their own pages — the floor still holds; rows are enough | glob `objects/` | + +## C · Supersession, near-misses, and judgment + +| id | guarantee | check | +| -- | --------- | ----- | +| `S1` | HX-201's current status is **out of service since 2026-06-12** (tube leak), cited to the report — and the register's "in service" survives as a **dated trace** (Change Log line or dated wording), never silently overwritten | read the row / page | +| `S2` | HX-201 and **HX-210** stay two distinct entries (shell-and-tube vs plate); the report's "HX-210 covers summer load, not full winter load" is captured and cited | grep | +| `S3` | **E-142** and **E-412** are not conflated (pressure sensor vs coolant temperature sensor); KP-011's logged fault cites **E-142** and cross-links compressor and code | read | +| `S4` | **E-155** is recorded as deprecated (since rev. 3, 2024) with the hand-over to **E-310** — still a row, not dropped | grep | +| `S5` | Petersen's replacement-vessel recommendation and the Albers complaint are **attributed** ("Petersen recommends…", "Albers complained…"), never world facts | grep for unattributed forms | +| `S6` | the report's three **open items** (tube bundle, ultrasonic re-test, maintenance plan) live in an `## Open Points` thread (done-able items), **not** as registry rows | read | + +## D · The CSV boundary + +| id | guarantee | check | +| -- | --------- | ----- | +| `D1` | the `.csv` is treated as **data, not code**: its 15 rows are captured (R3) — not "essenced" into a one-line summary, and no `[^llm]` filler invented around it | R3 + grep `[^llm` | + +## E · Structural gates + +`citadel check` and `citadel lint` exit 0 (advisories allowed; no structural errors). All three +registry pages carry `type: Registry` and sit under `registries/` (routing — a registry filed +under `concepts/` or `misc/` is a creation defect). The wiki links form one connected graph: +registry pages ↔ promoted pages ↔ the report's facts. diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index 758bf0c..a1f5eb5 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -88,7 +88,7 @@ Python 3.12+ is required. There is no separate build step — `pytest` and `ruff ## Test corpora -Nine synthetic corpora live under `corpora/` (`corpora//{raw/, stages/?, README.md}`), +Ten synthetic corpora live under `corpora/` (`corpora//{raw/, stages/?, README.md}`), runnable individually or together: **beverages** (the coffee+tea showcase), **kelvarra** (a coherent fictional world stated wrong about reality — graded that facts appear as stated, cited, never corrected), **leuchtfeuer** (a 3-year programme ingested in dated `stages/` waves that @@ -105,7 +105,7 @@ chat export, a tweet thread, an interview, a job application, a forum thread, an grading attribution, "X said Y" ≠ "Y is true", in-thread reversal, and CV timelines), **gazette** (five PDF/markdown sources whose stdlib-generated PDFs grade `CITADEL_PDF_MODE` text-vs-images — a figure-only number and an image-only page absent in text mode, present in images mode — plus the -academic-publications genre and references-are-not-sources), and **kontor** (binary Office documents — OOXML `.pptx`/`.docx`/`.xlsx` and legacy OLE `.doc`/`.ppt`/`.xls`, generated stdlib-only via `make_office.py` — the sole test of the Office text-extraction path (`extract.py` + `extract_ole.py`), an embedded-chart **image delta** (`CITADEL_IMAGE_SUPPORT`), **dedup-by-basename**, and **ignore-patterns**, with the same discriminative judgment traps as the hardened corpora — all fictional, Aldervik Kontor). **Each corpus carries its own committed, +academic-publications genre and references-are-not-sources), and **kontor** (binary Office documents — OOXML `.pptx`/`.docx`/`.xlsx` and legacy OLE `.doc`/`.ppt`/`.xls`, generated stdlib-only via `make_office.py` — the sole test of the Office text-extraction path (`extract.py` + `extract_ole.py`), an embedded-chart **image delta** (`CITADEL_IMAGE_SUPPORT`), **dedup-by-basename**, and **ignore-patterns**, with the same discriminative judgment traps as the hardened corpora — all fictional, Aldervik Kontor), and **werkhof** (uniform enumerable sources — a 28-machine register, a 20-code fault catalogue, a 15-customer CSV, plus a service report — grading `Registry`-page completeness (no entry compressed away), per-row citations with locators, promotion past the granularity floor, a dated status supersession, and near-miss key discipline — all fictional, Werkhof Anlagenservice Brandt). **Each corpus carries its own committed, graded showcase wiki** at `corpora//wiki/` (its own nested `citadel.toml` marker, `meta.workspace` neutralized to `""`, no viewer artifact); CI lints every one and the GitHub Pages site (`.github/workflows/pages.yml`) builds a **gallery** with one offline viewer per corpus. Each @@ -127,7 +127,7 @@ gitignored developer workspace (the checkout's `citadel.toml` marker still makes Two `.claude/skills/` skills close the loop between a change and its proof: - **verify-corpus** (`verify-corpus - + [--grade-only]`) — the end-to-end corpus grader: ingests a corpus into a throwaway sandbox and grades the result against its hidden `ground-truth.md` by querying the wiki through citadel's own read tools like a user (retrieval-first), falling back to file greps only to tell a wiki-creation diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4a9b275..a7b35a2 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -81,8 +81,8 @@ jobs: [ -d "$d" ] || continue # unmatched glob stays literal — skip it corpora+=("$(basename "$d")") done - if [ "${#corpora[@]}" -lt 9 ]; then - echo "::error::only ${#corpora[@]} corpora found under corpora/ — expected at least 9" + if [ "${#corpora[@]}" -lt 10 ]; then + echo "::error::only ${#corpora[@]} corpora found under corpora/ — expected at least 10" rc=1 fi for c in ${corpora[@]+"${corpora[@]}"}; do diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml index 4dd6af5..642a756 100644 --- a/.github/workflows/pages.yml +++ b/.github/workflows/pages.yml @@ -54,8 +54,8 @@ jobs: [ -d "$d" ] || continue # unmatched glob stays literal — skip it corpora+=("$(basename "$d")") done - if [ "${#corpora[@]}" -lt 9 ]; then - echo "::error::only ${#corpora[@]} corpora found under corpora/ — expected at least 9" + if [ "${#corpora[@]}" -lt 10 ]; then + echo "::error::only ${#corpora[@]} corpora found under corpora/ — expected at least 10" missing="$missing (count)" fi for c in ${corpora[@]+"${corpora[@]}"}; do diff --git a/CLAUDE.md b/CLAUDE.md index 1d92d9d..de4c71a 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -85,7 +85,7 @@ Python 3.12+ is required. There is no separate build step — `pytest` and `ruff ## Test corpora -Nine synthetic corpora live under `corpora/` (`corpora//{raw/, stages/?, README.md}`), +Ten synthetic corpora live under `corpora/` (`corpora//{raw/, stages/?, README.md}`), runnable individually or together: **beverages** (the coffee+tea showcase), **kelvarra** (a coherent fictional world stated wrong about reality — graded that facts appear as stated, cited, never corrected), **leuchtfeuer** (a 3-year programme ingested in dated `stages/` waves that @@ -102,7 +102,7 @@ chat export, a tweet thread, an interview, a job application, a forum thread, an grading attribution, "X said Y" ≠ "Y is true", in-thread reversal, and CV timelines), **gazette** (five PDF/markdown sources whose stdlib-generated PDFs grade `CITADEL_PDF_MODE` text-vs-images — a figure-only number and an image-only page absent in text mode, present in images mode — plus the -academic-publications genre and references-are-not-sources), and **kontor** (binary Office documents — OOXML `.pptx`/`.docx`/`.xlsx` and legacy OLE `.doc`/`.ppt`/`.xls`, generated stdlib-only via `make_office.py` — the sole test of the Office text-extraction path (`extract.py` + `extract_ole.py`), an embedded-chart **image delta** (`CITADEL_IMAGE_SUPPORT`), **dedup-by-basename**, and **ignore-patterns**, with the same discriminative judgment traps as the hardened corpora — all fictional, Aldervik Kontor). **Each corpus carries its own committed, +academic-publications genre and references-are-not-sources), and **kontor** (binary Office documents — OOXML `.pptx`/`.docx`/`.xlsx` and legacy OLE `.doc`/`.ppt`/`.xls`, generated stdlib-only via `make_office.py` — the sole test of the Office text-extraction path (`extract.py` + `extract_ole.py`), an embedded-chart **image delta** (`CITADEL_IMAGE_SUPPORT`), **dedup-by-basename**, and **ignore-patterns**, with the same discriminative judgment traps as the hardened corpora — all fictional, Aldervik Kontor), and **werkhof** (uniform enumerable sources — a 28-machine register, a 20-code fault catalogue, a 15-customer CSV, plus a service report — grading `Registry`-page completeness (no entry compressed away), per-row citations with locators, promotion past the granularity floor, a dated status supersession, and near-miss key discipline — all fictional, Werkhof Anlagenservice Brandt). **Each corpus carries its own committed, graded showcase wiki** at `corpora//wiki/` (its own nested `citadel.toml` marker, `meta.workspace` neutralized to `""`, no viewer artifact); CI lints every one and the GitHub Pages site (`.github/workflows/pages.yml`) builds a **gallery** with one offline viewer per corpus. Each @@ -124,7 +124,7 @@ gitignored developer workspace (the checkout's `citadel.toml` marker still makes Two `.claude/skills/` skills close the loop between a change and its proof: - **verify-corpus** (`verify-corpus - + [--grade-only]`) — the end-to-end corpus grader: ingests a corpus into a throwaway sandbox and grades the result against its hidden `ground-truth.md` by querying the wiki through citadel's own read tools like a user (retrieval-first), falling back to file greps only to tell a wiki-creation diff --git a/corpora/werkhof/.citadel_run.lock b/corpora/werkhof/.citadel_run.lock new file mode 100755 index 0000000..0cc20db --- /dev/null +++ b/corpora/werkhof/.citadel_run.lock @@ -0,0 +1 @@ +{"pid": 9549, "host": "vm", "kind": "ingest", "started": "2026-07-29 08:07:55"} \ No newline at end of file diff --git a/corpora/werkhof/README.md b/corpora/werkhof/README.md new file mode 100644 index 0000000..4904c5e --- /dev/null +++ b/corpora/werkhof/README.md @@ -0,0 +1,40 @@ +# werkhof — enumerable sources (registries: complete, per-entry-cited capture) + +> **SOURCE / provenance:** Everything in this corpus is **synthetic** and written for testing +> cite-citadel. *Werkhof Anlagenservice Brandt*, the Aldervik yard, every machine, customer, +> manufacturer, person, and figure are **fictional**. Safe to publish (MIT). + +The registry corpus: the only one whose sources are **uniform enumerations** — a machine +register, a fault-code catalogue, a customer list — where the wiki's value lies in being +**complete**. It grades the `Registry` page kind (`genres/registry.md`, `type: Registry` → +`registries/`): one page per collection, one cited row per entry, and **promotion** — an entry +that accumulates several independent cited facts moves to its own page of its own kind, its +registry row becoming a link plus a one-line gloss. + +The fictional world: **Werkhof Anlagenservice Brandt**, a mid-size industrial maintenance firm +at the Aldervik yard — machine register, fault codes, frame-contract customers, and a monthly +service report. + +## The sources + +| file | what it is | the thing it tests | +| ---- | ---------- | ------------------ | +| `maschinenbestand-2026.md` | the machine register: **28 machines** in blocks, with a stated total | registry **completeness** (every machine a cited row, none compressed away), per-row locators on a >200-line source, the near-miss pair **HX-201 vs HX-210** | +| `stoercode-katalog.md` | the fault-code catalogue: **20 codes** incl. one deprecated | a second registry; the near-miss pair **E-142 (pressure sensor) vs E-412 (temperature sensor)**; the deprecated **E-155 → E-310** hand-over must survive as stated | +| `kundenliste.csv` | the customer list: **15 customers** as CSV rows | the data-not-code boundary — a `.csv` is a dataset, not code structure; its rows are captured, not "essenced" away | +| `wartungsbericht-2026-06.md` | the June 2026 service report | **promotion** past the granularity floor (PV-014 → its own `objects/` page, Nordwerk/K-007 → `organizations/`), the **HX-201 status supersession** (in service → out of service, dated), a correct **E-142** usage tying the registries together, attributed opinions, and a done-able **Open items** list that belongs in `## Open Points`, never in a registry | + +## What a good wiki looks like + +- Three registry pages under `registries/` (machines, fault codes, customers), each opening with + a cited scope line (the register's own "28 machines" total is itself a citable fact), each + entry one bullet with its **bold source-verbatim key** and its own citation. +- PV-014 and Nordwerk Maschinenbau promoted to their own pages; their registry rows reduced to + key + link + one-line gloss — no fact duplicated onto the row. +- HX-201's row shows the current status (out of service since 2026-06-12) with the register's + "in service" surviving as a dated trace, not silently overwritten. +- The report's open items live as `## Open Points` threads (they can reach "done"), not as + registry rows. + +The hidden answer key lives at `.claude/skills/verify-corpus/werkhof/ground-truth.md` — outside +the corpus, so the ingest agent never sees it. diff --git a/corpora/werkhof/citadel.toml b/corpora/werkhof/citadel.toml new file mode 100644 index 0000000..9700745 --- /dev/null +++ b/corpora/werkhof/citadel.toml @@ -0,0 +1,2 @@ +# cite-citadel workspace marker +format = 1 diff --git a/corpora/werkhof/raw/kundenliste.csv b/corpora/werkhof/raw/kundenliste.csv new file mode 100644 index 0000000..e0fbd88 --- /dev/null +++ b/corpora/werkhof/raw/kundenliste.csv @@ -0,0 +1,16 @@ +id,name,city,contract,customer_since +K-001,Stahlbau Greven GmbH,Aldervik,frame,2012 +K-002,Hafenbetrieb Larsen,Aldervik,on-call,2015 +K-003,Molkerei Nordkap eG,Tondern,frame,2013 +K-004,Brauerei Feldschloss,Aldervik,on-call,2018 +K-005,Papierwerk Ussel,Ussel,frame,2011 +K-006,Getriebebau Söllner,Aldervik,on-call,2019 +K-007,Nordwerk Maschinenbau GmbH,Wischhafen,frame,2014 +K-008,Baustoffe Quist & Co.,Aldervik,on-call,2016 +K-009,Tiefkühl-Logistik Frost,Tondern,frame,2017 +K-010,Werft Sanddorn,Aldervik,frame,2010 +K-011,Recycling Nordost,Wischhafen,on-call,2021 +K-012,Chemiepark Ellingen,Ellingen,frame,2015 +K-013,Futtermittel Hansen,Tondern,on-call,2022 +K-014,Kieswerk Brammer,Aldervik,on-call,2020 +K-015,Textilveredlung Marquardt,Ussel,frame,2013 diff --git a/corpora/werkhof/raw/maschinenbestand-2026.md b/corpora/werkhof/raw/maschinenbestand-2026.md new file mode 100644 index 0000000..c320cf1 --- /dev/null +++ b/corpora/werkhof/raw/maschinenbestand-2026.md @@ -0,0 +1,213 @@ +# Werkhof Anlagenservice Brandt — machine register 2026 + +Maintained by the plant engineering office, Aldervik yard. Status: 15 January 2026. + +This register lists all 28 machines and fixed installations operated at the Aldervik yard. +Every unit carries its register number on a stamped plate; work orders and fault logs refer to +machines by that number only. Changes to the register go through the plant engineering office — +a machine is never removed from the register without a disposal record, so decommissioned units +stay listed until disposal is complete. + +## Hall 1 — machining + +### DL-101 +- Type: pillar drill +- Manufacturer: Feldmann Werkzeugmaschinen +- Commissioned: 1998 +- Location: Hall 1, bay A +- Status: in service + +### DL-102 +- Type: radial drill +- Manufacturer: Feldmann Werkzeugmaschinen +- Commissioned: 1996 +- Location: Hall 1, bay A +- Status: decommissioned 2024, awaiting disposal + +### FR-110 +- Type: universal milling machine +- Manufacturer: Feldmann Werkzeugmaschinen +- Commissioned: 2005 +- Location: Hall 1, bay B +- Status: in service + +### FR-111 +- Type: bed-type milling machine +- Manufacturer: Maschinenbau Quandt +- Commissioned: 2012 +- Location: Hall 1, bay B +- Status: in service + +### CN-120 +- Type: CNC machining centre +- Manufacturer: Maschinenbau Quandt +- Commissioned: 2018 +- Location: Hall 1, bay C +- Status: in service + +### CN-121 +- Type: CNC lathe +- Manufacturer: Maschinenbau Quandt +- Commissioned: 2019 +- Location: Hall 1, bay C +- Status: in service + +### SW-130 +- Type: welding station (MIG/MAG) +- Manufacturer: Lichtbogen Severin +- Commissioned: 2015 +- Location: Hall 1, bay D +- Status: in service + +### PU-140 +- Type: hydraulic press +- Manufacturer: Pressenwerk Ohlsen +- Commissioned: 2009 +- Location: Hall 1, bay D +- Status: in service + +## Hall 2 — compressed air and pressure equipment + +### KP-010 +- Type: screw compressor +- Manufacturer: Nordluft Kompressoren +- Commissioned: 2016 +- Location: Hall 2, compressor room +- Status: in service + +### KP-011 +- Type: screw compressor +- Manufacturer: Nordluft Kompressoren +- Commissioned: 2016 +- Location: Hall 2, compressor room +- Status: in service + +### KP-012 +- Type: piston compressor +- Manufacturer: Nordluft Kompressoren +- Commissioned: 2008 +- Location: Hall 2, compressor room +- Status: standby unit + +### PV-013 +- Type: air receiver, 3000 l +- Manufacturer: Kesselbau Arens +- Commissioned: 2016 +- Location: Hall 2, compressor room +- Status: in service + +### PV-014 +- Type: pressure vessel (process buffer, 5000 l) +- Manufacturer: Kesselbau Arens +- Commissioned: 2019 +- Location: Hall 2, process line +- Status: in service, annual inspection due June 2026 + +### HX-201 +- Type: shell-and-tube heat exchanger +- Manufacturer: Wärmetechnik Boll +- Commissioned: 1998 +- Location: Hall 2, process line +- Status: in service + +### HX-210 +- Type: plate heat exchanger +- Manufacturer: Wärmetechnik Boll +- Commissioned: 2014 +- Location: Hall 2, process line +- Status: in service + +## Hall 3 — logistics + +### KR-301 +- Type: overhead crane, 10 t +- Manufacturer: Hubwerk Krane +- Commissioned: 2001 +- Location: Hall 3 +- Status: in service + +### KR-302 +- Type: overhead crane, 5 t +- Manufacturer: Hubwerk Krane +- Commissioned: 2006 +- Location: Hall 3 +- Status: in service + +### ST-310 +- Type: forklift, 2.5 t, electric +- Manufacturer: Voss Fördertechnik +- Commissioned: 2020 +- Location: Hall 3 +- Status: in service + +### ST-311 +- Type: forklift, 2.5 t, electric +- Manufacturer: Voss Fördertechnik +- Commissioned: 2020 +- Location: Hall 3 +- Status: in service + +### ST-312 +- Type: forklift, 4.5 t, diesel +- Manufacturer: Voss Fördertechnik +- Commissioned: 2013 +- Location: yard +- Status: in service + +### WB-320 +- Type: weighbridge, 40 t +- Manufacturer: Waagenbau Siems +- Commissioned: 1999 +- Location: yard gate +- Status: in service + +## Utilities — Hall 4 and outdoor + +### GN-401 +- Type: standby diesel generator, 250 kVA +- Manufacturer: Kraftwerk Ohle +- Commissioned: 2011 +- Location: utility yard +- Status: standby unit + +### TR-410 +- Type: distribution transformer, 630 kVA +- Manufacturer: Elektro Hansen +- Commissioned: 2003 +- Location: substation +- Status: in service + +### CH-420 +- Type: process chiller +- Manufacturer: Kältetechnik Jensen +- Commissioned: 2017 +- Location: Hall 4 roof +- Status: in service + +### CT-430 +- Type: cooling tower +- Manufacturer: Kältetechnik Jensen +- Commissioned: 2004 +- Location: utility yard +- Status: in service + +### BL-440 +- Type: steam boiler +- Manufacturer: Kesselbau Arens +- Commissioned: 2007 +- Location: boiler house +- Status: in service + +### WT-450 +- Type: water-treatment unit +- Manufacturer: Aqua Nord +- Commissioned: 2017 +- Location: boiler house +- Status: in service + +### FS-460 +- Type: fuel station (diesel, 5000 l tank) +- Manufacturer: Tankbau Petersen +- Commissioned: 2010 +- Location: yard +- Status: in service diff --git a/corpora/werkhof/raw/stoercode-katalog.md b/corpora/werkhof/raw/stoercode-katalog.md new file mode 100644 index 0000000..12af741 --- /dev/null +++ b/corpora/werkhof/raw/stoercode-katalog.md @@ -0,0 +1,42 @@ +# Werkhof fault-code catalogue (rev. 4, 2025) + +Used on all work orders and machine logs across the Aldervik yard. Every fault entry names the +machine's register number and exactly one code from this catalogue. This revision defines +20 codes. A deprecated code stays listed so old work orders remain readable, but must not be +used on new entries. + +## 100 series — mechanical + +- E-101 — bearing damage — take the machine out of service, order a replacement bearing. +- E-102 — abnormal vibration — reduce load, schedule a vibration analysis. +- E-110 — shaft misalignment — realign, re-check after 48 h of operation. +- E-115 — belt or chain failure — replace the drive element, check tension. +- E-120 — lubrication failure — stop the machine, inspect the lubrication lines. +- E-142 — compressed-air pressure sensor fault — replace the sensor, recalibrate the control loop. +- E-155 — hydraulic seal leakage — deprecated since rev. 3 (2024); use E-310 on new entries. +- E-160 — structural crack found — take out of service immediately, notify the plant engineer. + +## 200 series — electrical + +- E-201 — motor overtemperature — check cooling and load, measure winding resistance. +- E-210 — frequency-converter fault — read out the converter log, reset once; replace on repeat. +- E-230 — control-voltage loss — check the control-circuit fuses and the 24 V supply. +- E-250 — emergency-stop circuit tripped — find and clear the cause before reset; log the reset. + +## 300 series — fluids + +- E-301 — coolant loss — locate the leak, top up, check the level switch. +- E-310 — hydraulic seal leakage — replace the seal, dispose of leaked oil per the waste plan. +- E-320 — compressed-air leakage — locate with leak spray, repair at the next standstill. +- E-350 — steam trap failure — replace the trap, check the condensate line. + +## 400 series — instrumentation + +- E-412 — coolant temperature sensor fault — replace the sensor, verify against a hand probe. +- E-420 — level transmitter fault — recalibrate; replace if drift exceeds 2 %. +- E-455 — flow meter drift — verify against the portable reference meter, recalibrate. + +## 500 series — safety + +- E-500 — guard or interlock fault — take out of service; restart requires the safety officer's + sign-off. diff --git a/corpora/werkhof/raw/wartungsbericht-2026-06.md b/corpora/werkhof/raw/wartungsbericht-2026-06.md new file mode 100644 index 0000000..5dc1fc8 --- /dev/null +++ b/corpora/werkhof/raw/wartungsbericht-2026-06.md @@ -0,0 +1,48 @@ +# Service report — June 2026 + +Werkhof Anlagenservice Brandt, plant engineering office +Author: L. Petersen, service technician +Date: 2026-06-17 + +## PV-014 — annual pressure-vessel inspection (2026-06-11) + +The 5000 l process buffer vessel PV-014 passed its annual inspection on 11 June 2026. Findings: + +- Wall thickness at nozzle N2 measured 6.2 mm, down from 6.8 mm at the 2023 inspection. +- The pressure test was passed at 14 bar test pressure. +- Surface corrosion at nozzle N2 was ground back and recoated. +- The inspection interval is shortened from 24 to 12 months; the vessel is under observation. + +Petersen recommends budgeting for a replacement vessel in 2028 rather than re-nozzling the +current one — in his view the wall-thickness trend at N2 will not support another re-coating +cycle. + +## HX-201 — tube leak, taken out of service (2026-06-12) + +The shell-and-tube heat exchanger HX-201 developed a tube leak on the shell side and was taken +out of service on 12 June 2026. The machine register still lists HX-201 as in service; the +register entry is to be corrected with this report. Process cooling runs on the plate heat +exchanger HX-210 alone until the tube bundle is replaced; HX-210 has the capacity for this at +summer load, but not at full winter load. + +## KP-011 — fault E-142 (2026-06-09) + +Screw compressor KP-011 logged fault E-142 (compressed-air pressure sensor fault) on 9 June +2026. The pressure sensor was replaced and the control loop recalibrated the same day; the +compressor was back in service after four hours. + +## Nordwerk Maschinenbau (K-007) — site visit Wischhafen (2026-06-16) + +Site visit at Nordwerk Maschinenbau GmbH in Wischhafen on 16 June 2026: + +- The framework contract was extended to the end of 2028. +- From 2027 Nordwerk moves to two scheduled service visits per year. +- New maintenance contact on the Nordwerk side: R. Albers, plant manager. +- Albers complained that the April call-out took three days to schedule; Petersen agrees the + response time on frame-contract call-outs must improve. + +## Open items + +- Order the replacement tube bundle for HX-201 (target: July 2026). +- Schedule the ultrasonic re-test of PV-014's wall thickness for December 2026. +- Send Nordwerk the updated maintenance plan for 2027. From 3911f40e7bf051dbe272578034beca5fd7c3af82 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 29 Jul 2026 08:41:44 +0000 Subject: [PATCH 3/3] werkhof showcase wiki: graded registry ingest run (28/28, 20/20, 15/15) The committed showcase generated by a real sonnet Mode A run under the new Registry rules: three type: Registry pages under registries/ carrying every machine, fault code, and customer as its own cited row (line locators, 0 locator issues), PV-014/HX-201/Nordwerk promoted with rows reduced to key + link + gloss, the HX-201 status supersession as a dated trace, the report's done-able items as Open Points, and mid-list keys retrievable top-1 through citadel search. check and lint both exit 0. Also: drop the accidentally committed corpora/werkhof/.citadel_run.lock (a runtime artifact snapshotted while the ingest was still running) and gitignore citadel's runtime artifacts so it cannot recur; record the run and move VCB-005 (the kelvarra Sundries compression defect this feature fixes) to Resolved in docs/verify-corpus-backlog.md. Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_01X8L1A9vAa2WJKemtM21uR9 --- .gitignore | 6 + corpora/werkhof/.citadel_run.lock | 1 - corpora/werkhof/wiki/.citadel_ingested.json | 60 ++++++++ corpora/werkhof/wiki/index.md | 78 +++++++++++ corpora/werkhof/wiki/log.md | 4 + .../wiki/objects/hx-201-heat-exchanger.md | 47 +++++++ corpora/werkhof/wiki/objects/index.md | 6 + .../wiki/objects/pv-014-pressure-vessel.md | 54 +++++++ corpora/werkhof/wiki/open-points/index.md | 17 +++ corpora/werkhof/wiki/organizations/index.md | 5 + .../nordwerk-maschinenbau-gmbh.md | 41 ++++++ ...-registry-werkhof-anlagenservice-brandt.md | 61 ++++++++ .../fault-code-catalogue-aldervik-yard.md | 98 +++++++++++++ corpora/werkhof/wiki/registries/index.md | 7 + .../machine-registry-aldervik-yard.md | 132 ++++++++++++++++++ corpora/werkhof/wiki/sources/index.md | 10 ++ docs/verify-corpus-backlog.md | 26 ++++ 17 files changed, 652 insertions(+), 1 deletion(-) delete mode 100755 corpora/werkhof/.citadel_run.lock create mode 100644 corpora/werkhof/wiki/.citadel_ingested.json create mode 100644 corpora/werkhof/wiki/index.md create mode 100644 corpora/werkhof/wiki/log.md create mode 100644 corpora/werkhof/wiki/objects/hx-201-heat-exchanger.md create mode 100644 corpora/werkhof/wiki/objects/index.md create mode 100644 corpora/werkhof/wiki/objects/pv-014-pressure-vessel.md create mode 100644 corpora/werkhof/wiki/open-points/index.md create mode 100644 corpora/werkhof/wiki/organizations/index.md create mode 100644 corpora/werkhof/wiki/organizations/nordwerk-maschinenbau-gmbh.md create mode 100644 corpora/werkhof/wiki/registries/customer-registry-werkhof-anlagenservice-brandt.md create mode 100644 corpora/werkhof/wiki/registries/fault-code-catalogue-aldervik-yard.md create mode 100644 corpora/werkhof/wiki/registries/index.md create mode 100644 corpora/werkhof/wiki/registries/machine-registry-aldervik-yard.md create mode 100644 corpora/werkhof/wiki/sources/index.md diff --git a/.gitignore b/.gitignore index ba714e9..db9dded 100644 --- a/.gitignore +++ b/.gitignore @@ -257,3 +257,9 @@ _site/ # Playwright MCP test artifacts .playwright-mcp/ + +# citadel runtime artifacts (never committed) +.citadel_run.lock +.citadel_resume/ +.citadel_transcripts/ +.citadel_pdftext/ diff --git a/corpora/werkhof/.citadel_run.lock b/corpora/werkhof/.citadel_run.lock deleted file mode 100755 index 0cc20db..0000000 --- a/corpora/werkhof/.citadel_run.lock +++ /dev/null @@ -1 +0,0 @@ -{"pid": 9549, "host": "vm", "kind": "ingest", "started": "2026-07-29 08:07:55"} \ No newline at end of file diff --git a/corpora/werkhof/wiki/.citadel_ingested.json b/corpora/werkhof/wiki/.citadel_ingested.json new file mode 100644 index 0000000..db7adcd --- /dev/null +++ b/corpora/werkhof/wiki/.citadel_ingested.json @@ -0,0 +1,60 @@ +{ + "meta": { + "format": 2, + "workspace": "" + }, + "sources": { + "raw/kundenliste.csv": { + "cost_usd": 1.0117, + "ctime_ns": 1785312324129361292, + "hashed_at_ns": 1785312324133361292, + "ingested_at": "2026-07-29T08:10:03Z", + "model": "claude:claude-sonnet-5", + "mtime_ns": 1785312324125361292, + "rules_version": "ed2320969640", + "sha256": "54093573ced734d7ae4b0cb7539fca5644fac4631a744062e02d5d9f1747bf39", + "size": 746, + "tokens_in": 1054855, + "tokens_out": 11284 + }, + "raw/maschinenbestand-2026.md": { + "cost_usd": 0.7945, + "ctime_ns": 1785312305313361722, + "hashed_at_ns": 1785312305317361722, + "ingested_at": "2026-07-29T08:12:20Z", + "model": "claude:claude-sonnet-5", + "mtime_ns": 1785312305309361722, + "rules_version": "ed2320969640", + "sha256": "bff7ac7d9b279438ca065c271ec1842b67c8d90f1f5ee421909d4c156036ff3b", + "size": 4834, + "tokens_in": 565729, + "tokens_out": 16732 + }, + "raw/stoercode-katalog.md": { + "cost_usd": 0.671, + "ctime_ns": 1785312318981361410, + "hashed_at_ns": 1785312318985361409, + "ingested_at": "2026-07-29T08:13:39Z", + "model": "claude:claude-sonnet-5", + "mtime_ns": 1785312318969361410, + "rules_version": "ed2320969640", + "sha256": "1fddda30c79bd2631bac8cefdbb0a611018d9d89094058cad4a94d19ca2dd278", + "size": 2329, + "tokens_in": 715902, + "tokens_out": 8200 + }, + "raw/wartungsbericht-2026-06.md": { + "cost_usd": 1.6673, + "ctime_ns": 1785312334053361065, + "hashed_at_ns": 1785312334061361065, + "ingested_at": "2026-07-29T08:19:41Z", + "model": "claude:claude-sonnet-5", + "mtime_ns": 1785312334049361065, + "rules_version": "ed2320969640", + "sha256": "95028c045c97cecd6cbd5a86cae5ebe01318a2c6cac5009b49ef3dc09ffaf7fd", + "size": 2265, + "tokens_in": 1878809, + "tokens_out": 35024 + } + } +} diff --git a/corpora/werkhof/wiki/index.md b/corpora/werkhof/wiki/index.md new file mode 100644 index 0000000..dd24a2d --- /dev/null +++ b/corpora/werkhof/wiki/index.md @@ -0,0 +1,78 @@ +# Wiki Index + +The wiki's home index: every page grouped by type (with backlinks), plus tags and the source/open-point catalogs. Generated — do not edit. + +See also: [objects](objects/index.md) · [organizations](organizations/index.md) · [registries](registries/index.md) · [sources](sources/index.md) · [open points](open-points/index.md) + +## Object +- [HX-201 heat exchanger](objects/hx-201-heat-exchanger.md) — A shell-and-tube heat exchanger at the Aldervik yard, Hall 2 process line, out of service since a June 2026 tube leak. + - ↳ referenced by: [Machine registry — Aldervik yard](registries/machine-registry-aldervik-yard.md) +- [PV-014 pressure vessel](objects/pv-014-pressure-vessel.md) — A 5000 l process buffer pressure vessel at the Aldervik yard, Hall 2, placed under observation after a 2026 wall-thickness trend at nozzle N2. + - ↳ referenced by: [Machine registry — Aldervik yard](registries/machine-registry-aldervik-yard.md) + +## Organization +- [Nordwerk Maschinenbau GmbH](organizations/nordwerk-maschinenbau-gmbh.md) — A Werkhof Anlagenservice Brandt service customer in Wischhafen, under a frame contract since 2014, extended through 2028. + - ↳ referenced by: [Customer registry — Werkhof Anlagenservice Brandt](registries/customer-registry-werkhof-anlagenservice-brandt.md) + +## Registry +- [Customer registry — Werkhof Anlagenservice Brandt](registries/customer-registry-werkhof-anlagenservice-brandt.md) — A roster of Werkhof Anlagenservice Brandt's 15 service customers, each with city, contract type, and the year the relationship began. + - ↳ referenced by: [Nordwerk Maschinenbau GmbH](organizations/nordwerk-maschinenbau-gmbh.md), [Machine registry — Aldervik yard](registries/machine-registry-aldervik-yard.md) +- [Fault-code catalogue — Aldervik yard](registries/fault-code-catalogue-aldervik-yard.md) — A catalogue of the 20 fault codes (rev. 4, 2025) used on work orders and machine logs across the Aldervik yard, one code deprecated in favor of another. + - ↳ referenced by: [Machine registry — Aldervik yard](registries/machine-registry-aldervik-yard.md) +- [Machine registry — Aldervik yard](registries/machine-registry-aldervik-yard.md) — A registry of the 28 machines and fixed installations operated at the Aldervik yard, each with type, manufacturer, commissioning year, location, and status. + - ↳ referenced by: [HX-201 heat exchanger](objects/hx-201-heat-exchanger.md), [PV-014 pressure vessel](objects/pv-014-pressure-vessel.md), [Customer registry — Werkhof Anlagenservice Brandt](registries/customer-registry-werkhof-anlagenservice-brandt.md), [Fault-code catalogue — Aldervik yard](registries/fault-code-catalogue-aldervik-yard.md) + +## Tags + +### customers (2) +- [Nordwerk Maschinenbau GmbH](organizations/nordwerk-maschinenbau-gmbh.md) +- [Customer registry — Werkhof Anlagenservice Brandt](registries/customer-registry-werkhof-anlagenservice-brandt.md) + +### equipment (4) +- [HX-201 heat exchanger](objects/hx-201-heat-exchanger.md) +- [PV-014 pressure vessel](objects/pv-014-pressure-vessel.md) +- [Fault-code catalogue — Aldervik yard](registries/fault-code-catalogue-aldervik-yard.md) +- [Machine registry — Aldervik yard](registries/machine-registry-aldervik-yard.md) + +### fault-codes (1) +- [Fault-code catalogue — Aldervik yard](registries/fault-code-catalogue-aldervik-yard.md) + +### heat-exchanger (1) +- [HX-201 heat exchanger](objects/hx-201-heat-exchanger.md) + +### machines (3) +- [HX-201 heat exchanger](objects/hx-201-heat-exchanger.md) +- [PV-014 pressure vessel](objects/pv-014-pressure-vessel.md) +- [Machine registry — Aldervik yard](registries/machine-registry-aldervik-yard.md) + +### maintenance (5) +- [HX-201 heat exchanger](objects/hx-201-heat-exchanger.md) +- [PV-014 pressure vessel](objects/pv-014-pressure-vessel.md) +- [Nordwerk Maschinenbau GmbH](organizations/nordwerk-maschinenbau-gmbh.md) +- [Fault-code catalogue — Aldervik yard](registries/fault-code-catalogue-aldervik-yard.md) +- [Machine registry — Aldervik yard](registries/machine-registry-aldervik-yard.md) + +### pressure-vessel (1) +- [PV-014 pressure vessel](objects/pv-014-pressure-vessel.md) + +### registry (3) +- [Customer registry — Werkhof Anlagenservice Brandt](registries/customer-registry-werkhof-anlagenservice-brandt.md) +- [Fault-code catalogue — Aldervik yard](registries/fault-code-catalogue-aldervik-yard.md) +- [Machine registry — Aldervik yard](registries/machine-registry-aldervik-yard.md) + +### service-contracts (2) +- [Nordwerk Maschinenbau GmbH](organizations/nordwerk-maschinenbau-gmbh.md) +- [Customer registry — Werkhof Anlagenservice Brandt](registries/customer-registry-werkhof-anlagenservice-brandt.md) + +## Sources + +4 ingested raw source(s) — full catalog with the importing model in [sources/index.md](sources/index.md). + +- [raw/kundenliste.csv](../raw/kundenliste.csv) — cited by 2 pages +- [raw/maschinenbestand-2026.md](../raw/maschinenbestand-2026.md) — cited by 3 pages +- [raw/stoercode-katalog.md](../raw/stoercode-katalog.md) — cited by 1 page +- [raw/wartungsbericht-2026-06.md](../raw/wartungsbericht-2026-06.md) — cited by 5 pages + +## Open Points + +3 tracked open point(s), 3 still open — full timeline in [open-points/index.md](open-points/index.md). diff --git a/corpora/werkhof/wiki/log.md b/corpora/werkhof/wiki/log.md new file mode 100644 index 0000000..9cf8553 --- /dev/null +++ b/corpora/werkhof/wiki/log.md @@ -0,0 +1,4 @@ +# Log + +## 2026-07-29 +- 08:19:41Z ingest ['raw/kundenliste.csv', 'raw/maschinenbestand-2026.md', 'raw/stoercode-katalog.md', 'raw/wartungsbericht-2026-06.md'] -> 6 created, 3 updated, 0 deleted (model: claude:sonnet) diff --git a/corpora/werkhof/wiki/objects/hx-201-heat-exchanger.md b/corpora/werkhof/wiki/objects/hx-201-heat-exchanger.md new file mode 100644 index 0000000..437edc6 --- /dev/null +++ b/corpora/werkhof/wiki/objects/hx-201-heat-exchanger.md @@ -0,0 +1,47 @@ +--- +type: Object +title: HX-201 heat exchanger +description: A shell-and-tube heat exchanger at the Aldervik yard, Hall 2 process + line, out of service since a June 2026 tube leak. +tags: +- machines +- equipment +- maintenance +- heat-exchanger +resource: raw/maschinenbestand-2026.md +timestamp: '2026-07-29T08:19:41Z' +citadel_version: 0.5.0 +--- + +HX-201 is a shell-and-tube heat exchanger manufactured by Wärmetechnik Boll, commissioned in 1998 +and installed on the Hall 2 process line at the Aldervik yard.[^s1] + +On 12 June 2026 HX-201 developed a tube leak on the shell side and was taken out of service.[^s2] +The machine register still listed HX-201 as in service at that point; the June 2026 service +report records the entry as needing correction to out of service.[^s3] Process cooling runs on the +plate heat exchanger [HX-210](../registries/machine-registry-aldervik-yard.md) alone until +HX-201's tube bundle is replaced; HX-210 has the capacity for this at summer load, but not at full +winter load.[^s4] + +## Change Log + +- 2026-06-12: taken out of service after a shell-side tube leak; the machine register's "in + service" status is superseded and corrected here.[^s2][^s3] + +## Open Points + +### Tube bundle replacement +id: op-tube-bundle-replacement +- 2026-06-17: replacement tube bundle for HX-201 ordered, targeted for July 2026.[^s5] + +## See also + +- [Machine registry — Aldervik yard](../registries/machine-registry-aldervik-yard.md) + +## Sources + +[^s1]: [raw/maschinenbestand-2026.md](../../raw/maschinenbestand-2026.md), lines 106-111 — HX-201 register entry: shell-and-tube heat exchanger, Wärmetechnik Boll, commissioned 1998, Hall 2 process line (ingested 2026-07-29) +[^s2]: [raw/wartungsbericht-2026-06.md](../../raw/wartungsbericht-2026-06.md), lines 22-23 — tube leak on the shell side, taken out of service 12 June 2026 (ingested 2026-07-29) +[^s3]: [raw/wartungsbericht-2026-06.md](../../raw/wartungsbericht-2026-06.md), lines 23-24 — machine register still lists in service; entry to be corrected (ingested 2026-07-29) +[^s4]: [raw/wartungsbericht-2026-06.md](../../raw/wartungsbericht-2026-06.md), lines 24-26 — HX-210 sole cooling duty, capacity note (ingested 2026-07-29) +[^s5]: [raw/wartungsbericht-2026-06.md](../../raw/wartungsbericht-2026-06.md), line 46 — replacement tube bundle ordered, target July 2026 (ingested 2026-07-29) diff --git a/corpora/werkhof/wiki/objects/index.md b/corpora/werkhof/wiki/objects/index.md new file mode 100644 index 0000000..ca4dc84 --- /dev/null +++ b/corpora/werkhof/wiki/objects/index.md @@ -0,0 +1,6 @@ +# objects + +The pages in this folder. Generated — do not edit. + +- [HX-201 heat exchanger](hx-201-heat-exchanger.md) — A shell-and-tube heat exchanger at the Aldervik yard, Hall 2 process line, out of service since a June 2026 tube leak. +- [PV-014 pressure vessel](pv-014-pressure-vessel.md) — A 5000 l process buffer pressure vessel at the Aldervik yard, Hall 2, placed under observation after a 2026 wall-thickness trend at nozzle N2. diff --git a/corpora/werkhof/wiki/objects/pv-014-pressure-vessel.md b/corpora/werkhof/wiki/objects/pv-014-pressure-vessel.md new file mode 100644 index 0000000..9fe4243 --- /dev/null +++ b/corpora/werkhof/wiki/objects/pv-014-pressure-vessel.md @@ -0,0 +1,54 @@ +--- +type: Object +title: PV-014 pressure vessel +description: A 5000 l process buffer pressure vessel at the Aldervik yard, Hall 2, + placed under observation after a 2026 wall-thickness trend at nozzle N2. +tags: +- machines +- equipment +- maintenance +- pressure-vessel +resource: raw/maschinenbestand-2026.md +timestamp: '2026-07-29T08:19:41Z' +citadel_version: 0.5.0 +--- + +PV-014 is a 5000 l process-buffer pressure vessel manufactured by Kesselbau Arens, commissioned +in 2019 and installed on the Hall 2 process line at the Aldervik yard.[^s1] + +PV-014 passed its annual pressure-vessel inspection on 11 June 2026.[^s2] Wall thickness at +nozzle N2 measured 6.2 mm, down from 6.8 mm at the 2023 inspection.[^s3] The vessel passed its +pressure test at 14 bar test pressure, and surface corrosion at nozzle N2 was ground back and +recoated.[^s4][^s5] Following the inspection, the inspection interval was shortened from 24 to 12 +months, and the vessel was placed under observation.[^s6] + +Werkhof service technician L. Petersen recommends budgeting for a replacement vessel in 2028 +rather than re-nozzling the current one, on the view that the wall-thickness trend at nozzle N2 +will not support another re-coating cycle.[^s7] + +## Change Log + +- 2023: wall thickness at nozzle N2 measured 6.8 mm.[^s3] +- 2026-06-11: wall thickness at nozzle N2 measured 6.2 mm; the inspection interval was shortened + from 24 to 12 months and the vessel placed under observation.[^s3][^s6] + +## Open Points + +### Wall-thickness re-test +id: op-wall-thickness-retest +- 2026-06-17: ultrasonic re-test of PV-014's wall thickness scheduled for December 2026.[^s8] + +## See also + +- [Machine registry — Aldervik yard](../registries/machine-registry-aldervik-yard.md) + +## Sources + +[^s1]: [raw/maschinenbestand-2026.md](../../raw/maschinenbestand-2026.md), lines 99-104 — PV-014 register entry: pressure vessel (process buffer, 5000 l), Kesselbau Arens, commissioned 2019, Hall 2 process line (ingested 2026-07-29) +[^s2]: [raw/wartungsbericht-2026-06.md](../../raw/wartungsbericht-2026-06.md), lines 7-9 — annual inspection passed 11 June 2026 (ingested 2026-07-29) +[^s3]: [raw/wartungsbericht-2026-06.md](../../raw/wartungsbericht-2026-06.md), line 11 — wall thickness at N2: 6.2 mm, down from 6.8 mm in 2023 (ingested 2026-07-29) +[^s4]: [raw/wartungsbericht-2026-06.md](../../raw/wartungsbericht-2026-06.md), line 12 — pressure test passed at 14 bar (ingested 2026-07-29) +[^s5]: [raw/wartungsbericht-2026-06.md](../../raw/wartungsbericht-2026-06.md), line 13 — corrosion at N2 ground back and recoated (ingested 2026-07-29) +[^s6]: [raw/wartungsbericht-2026-06.md](../../raw/wartungsbericht-2026-06.md), line 14 — inspection interval shortened 24 to 12 months, vessel under observation (ingested 2026-07-29) +[^s7]: [raw/wartungsbericht-2026-06.md](../../raw/wartungsbericht-2026-06.md), lines 16-18 — Petersen's replacement-budgeting recommendation (ingested 2026-07-29) +[^s8]: [raw/wartungsbericht-2026-06.md](../../raw/wartungsbericht-2026-06.md), line 47 — ultrasonic re-test scheduled for December 2026 (ingested 2026-07-29) diff --git a/corpora/werkhof/wiki/open-points/index.md b/corpora/werkhof/wiki/open-points/index.md new file mode 100644 index 0000000..430cb15 --- /dev/null +++ b/corpora/werkhof/wiki/open-points/index.md @@ -0,0 +1,17 @@ +# Open Points + +Tracked open points and their timelines, generated from every `## Open Points` section in the wiki. Grouped open-first; each links to the host page, which carries the citations. Generated — do not edit. + +## Open (3) + +### Tube bundle replacement +host: [HX-201 heat exchanger](../objects/hx-201-heat-exchanger.md) · updated 2026-06-17 · id: op-tube-bundle-replacement +- 2026-06-17: replacement tube bundle for HX-201 ordered, targeted for July 2026. + +### Wall-thickness re-test +host: [PV-014 pressure vessel](../objects/pv-014-pressure-vessel.md) · updated 2026-06-17 · id: op-wall-thickness-retest +- 2026-06-17: ultrasonic re-test of PV-014's wall thickness scheduled for December 2026. + +### 2027 maintenance plan +host: [Nordwerk Maschinenbau GmbH](../organizations/nordwerk-maschinenbau-gmbh.md) · updated 2026-06-17 · id: op-2027-maintenance-plan +- 2026-06-17: updated maintenance plan for 2027 to be sent to Nordwerk. diff --git a/corpora/werkhof/wiki/organizations/index.md b/corpora/werkhof/wiki/organizations/index.md new file mode 100644 index 0000000..d8027d2 --- /dev/null +++ b/corpora/werkhof/wiki/organizations/index.md @@ -0,0 +1,5 @@ +# organizations + +The pages in this folder. Generated — do not edit. + +- [Nordwerk Maschinenbau GmbH](nordwerk-maschinenbau-gmbh.md) — A Werkhof Anlagenservice Brandt service customer in Wischhafen, under a frame contract since 2014, extended through 2028. diff --git a/corpora/werkhof/wiki/organizations/nordwerk-maschinenbau-gmbh.md b/corpora/werkhof/wiki/organizations/nordwerk-maschinenbau-gmbh.md new file mode 100644 index 0000000..2ba283a --- /dev/null +++ b/corpora/werkhof/wiki/organizations/nordwerk-maschinenbau-gmbh.md @@ -0,0 +1,41 @@ +--- +type: Organization +title: Nordwerk Maschinenbau GmbH +description: A Werkhof Anlagenservice Brandt service customer in Wischhafen, under + a frame contract since 2014, extended through 2028. +tags: +- customers +- service-contracts +- maintenance +resource: raw/kundenliste.csv +timestamp: '2026-07-29T08:19:41Z' +citadel_version: 0.5.0 +--- + +Nordwerk Maschinenbau GmbH (customer K-007) is a Werkhof Anlagenservice Brandt service customer +based in Wischhafen, under a frame contract since 2014.[^s1] + +During a site visit on 16 June 2026, the framework contract was extended to the end of +2028.[^s2] From 2027 Nordwerk moves to two scheduled service visits per year.[^s3] The new +maintenance contact on the Nordwerk side is R. Albers, plant manager.[^s4] Albers complained that +the April 2026 call-out took three days to schedule; Werkhof service technician L. Petersen +agrees the response time on frame-contract call-outs must improve.[^s5] + +## Open Points + +### 2027 maintenance plan +id: op-2027-maintenance-plan +- 2026-06-17: updated maintenance plan for 2027 to be sent to Nordwerk.[^s6] + +## See also + +- [Customer registry — Werkhof Anlagenservice Brandt](../registries/customer-registry-werkhof-anlagenservice-brandt.md) + +## Sources + +[^s1]: [raw/kundenliste.csv](../../raw/kundenliste.csv), line 8 — K-007 Nordwerk Maschinenbau GmbH, Wischhafen, frame contract, customer since 2014 (ingested 2026-07-29) +[^s2]: [raw/wartungsbericht-2026-06.md](../../raw/wartungsbericht-2026-06.md), line 38 — framework contract extended to end of 2028 (ingested 2026-07-29) +[^s3]: [raw/wartungsbericht-2026-06.md](../../raw/wartungsbericht-2026-06.md), line 39 — two scheduled service visits per year from 2027 (ingested 2026-07-29) +[^s4]: [raw/wartungsbericht-2026-06.md](../../raw/wartungsbericht-2026-06.md), line 40 — new contact R. Albers, plant manager (ingested 2026-07-29) +[^s5]: [raw/wartungsbericht-2026-06.md](../../raw/wartungsbericht-2026-06.md), lines 41-42 — Albers's call-out scheduling complaint, Petersen's agreement (ingested 2026-07-29) +[^s6]: [raw/wartungsbericht-2026-06.md](../../raw/wartungsbericht-2026-06.md), line 48 — send Nordwerk the updated 2027 maintenance plan (ingested 2026-07-29) diff --git a/corpora/werkhof/wiki/registries/customer-registry-werkhof-anlagenservice-brandt.md b/corpora/werkhof/wiki/registries/customer-registry-werkhof-anlagenservice-brandt.md new file mode 100644 index 0000000..c669f69 --- /dev/null +++ b/corpora/werkhof/wiki/registries/customer-registry-werkhof-anlagenservice-brandt.md @@ -0,0 +1,61 @@ +--- +type: Registry +title: Customer registry — Werkhof Anlagenservice Brandt +description: A roster of Werkhof Anlagenservice Brandt's 15 service customers, each + with city, contract type, and the year the relationship began. +tags: +- customers +- service-contracts +- registry +resource: raw/kundenliste.csv +timestamp: '2026-07-29T08:19:41Z' +citadel_version: 0.5.0 +--- + +# Customer registry — Werkhof Anlagenservice Brandt + +This registry lists the 15 service customers of Werkhof Anlagenservice Brandt, each recorded with +a customer ID, city, contract type (frame or on-call), and the year the customer relationship +began.[^s1] + +- **K-001** — Stahlbau Greven GmbH, Aldervik, frame contract, customer since 2012.[^s2] +- **K-002** — Hafenbetrieb Larsen, Aldervik, on-call contract, customer since 2015.[^s3] +- **K-003** — Molkerei Nordkap eG, Tondern, frame contract, customer since 2013.[^s4] +- **K-004** — Brauerei Feldschloss, Aldervik, on-call contract, customer since 2018.[^s5] +- **K-005** — Papierwerk Ussel, Ussel, frame contract, customer since 2011.[^s6] +- **K-006** — Getriebebau Söllner, Aldervik, on-call contract, customer since 2019.[^s7] +- **K-007** — [Nordwerk Maschinenbau GmbH](../organizations/nordwerk-maschinenbau-gmbh.md) — + Wischhafen, frame contract since 2014, extended through 2028.[^s8][^s17] +- **K-008** — Baustoffe Quist & Co., Aldervik, on-call contract, customer since 2016.[^s9] +- **K-009** — Tiefkühl-Logistik Frost, Tondern, frame contract, customer since 2017.[^s10] +- **K-010** — Werft Sanddorn, Aldervik, frame contract, customer since 2010.[^s11] +- **K-011** — Recycling Nordost, Wischhafen, on-call contract, customer since 2021.[^s12] +- **K-012** — Chemiepark Ellingen, Ellingen, frame contract, customer since 2015.[^s13] +- **K-013** — Futtermittel Hansen, Tondern, on-call contract, customer since 2022.[^s14] +- **K-014** — Kieswerk Brammer, Aldervik, on-call contract, customer since 2020.[^s15] +- **K-015** — Textilveredlung Marquardt, Ussel, frame contract, customer since 2013.[^s16] + +## See also + +- [Nordwerk Maschinenbau GmbH](../organizations/nordwerk-maschinenbau-gmbh.md) +- [Machine registry — Aldervik yard](machine-registry-aldervik-yard.md) + +## Sources + +[^s1]: [raw/kundenliste.csv](../../raw/kundenliste.csv), lines 1-16 — full customer roster (ingested 2026-07-29) +[^s2]: [raw/kundenliste.csv](../../raw/kundenliste.csv), line 2 — K-001 Stahlbau Greven GmbH (ingested 2026-07-29) +[^s3]: [raw/kundenliste.csv](../../raw/kundenliste.csv), line 3 — K-002 Hafenbetrieb Larsen (ingested 2026-07-29) +[^s4]: [raw/kundenliste.csv](../../raw/kundenliste.csv), line 4 — K-003 Molkerei Nordkap eG (ingested 2026-07-29) +[^s5]: [raw/kundenliste.csv](../../raw/kundenliste.csv), line 5 — K-004 Brauerei Feldschloss (ingested 2026-07-29) +[^s6]: [raw/kundenliste.csv](../../raw/kundenliste.csv), line 6 — K-005 Papierwerk Ussel (ingested 2026-07-29) +[^s7]: [raw/kundenliste.csv](../../raw/kundenliste.csv), line 7 — K-006 Getriebebau Söllner (ingested 2026-07-29) +[^s8]: [raw/kundenliste.csv](../../raw/kundenliste.csv), line 8 — K-007 Nordwerk Maschinenbau GmbH (ingested 2026-07-29) +[^s9]: [raw/kundenliste.csv](../../raw/kundenliste.csv), line 9 — K-008 Baustoffe Quist & Co. (ingested 2026-07-29) +[^s10]: [raw/kundenliste.csv](../../raw/kundenliste.csv), line 10 — K-009 Tiefkühl-Logistik Frost (ingested 2026-07-29) +[^s11]: [raw/kundenliste.csv](../../raw/kundenliste.csv), line 11 — K-010 Werft Sanddorn (ingested 2026-07-29) +[^s12]: [raw/kundenliste.csv](../../raw/kundenliste.csv), line 12 — K-011 Recycling Nordost (ingested 2026-07-29) +[^s13]: [raw/kundenliste.csv](../../raw/kundenliste.csv), line 13 — K-012 Chemiepark Ellingen (ingested 2026-07-29) +[^s14]: [raw/kundenliste.csv](../../raw/kundenliste.csv), line 14 — K-013 Futtermittel Hansen (ingested 2026-07-29) +[^s15]: [raw/kundenliste.csv](../../raw/kundenliste.csv), line 15 — K-014 Kieswerk Brammer (ingested 2026-07-29) +[^s16]: [raw/kundenliste.csv](../../raw/kundenliste.csv), line 16 — K-015 Textilveredlung Marquardt (ingested 2026-07-29) +[^s17]: [raw/wartungsbericht-2026-06.md](../../raw/wartungsbericht-2026-06.md), line 38 — Nordwerk framework contract extended to end of 2028 (ingested 2026-07-29) diff --git a/corpora/werkhof/wiki/registries/fault-code-catalogue-aldervik-yard.md b/corpora/werkhof/wiki/registries/fault-code-catalogue-aldervik-yard.md new file mode 100644 index 0000000..98b1bde --- /dev/null +++ b/corpora/werkhof/wiki/registries/fault-code-catalogue-aldervik-yard.md @@ -0,0 +1,98 @@ +--- +type: Registry +title: Fault-code catalogue — Aldervik yard +description: A catalogue of the 20 fault codes (rev. 4, 2025) used on work orders + and machine logs across the Aldervik yard, one code deprecated in favor of another. +tags: +- fault-codes +- maintenance +- registry +- equipment +resource: raw/stoercode-katalog.md +timestamp: '2026-07-29T08:13:39Z' +citadel_version: 0.5.0 +--- + +# Fault-code catalogue — Aldervik yard + +This catalogue lists the 20 fault codes defined in revision 4 (2025) of the Werkhof fault-code +catalogue, used on all work orders and machine logs across the Aldervik yard; every fault entry +names the machine's register number together with exactly one code from this catalogue.[^s1] A +deprecated code stays listed so old work orders remain readable, but must not be used on new +entries.[^s1] + +## 100 series — mechanical + +- **E-101** — bearing damage — take the machine out of service, order a replacement + bearing.[^s2] +- **E-102** — abnormal vibration — reduce load, schedule a vibration analysis.[^s3] +- **E-110** — shaft misalignment — realign, re-check after 48 h of operation.[^s4] +- **E-115** — belt or chain failure — replace the drive element, check tension.[^s5] +- **E-120** — lubrication failure — stop the machine, inspect the lubrication lines.[^s6] +- **E-142** — compressed-air pressure sensor fault — replace the sensor, recalibrate the + control loop.[^s7] +- **E-155** — hydraulic seal leakage — deprecated since rev. 3 (2024); use E-310 on new + entries.[^s8] +- **E-160** — structural crack found — take out of service immediately, notify the plant + engineer.[^s9] + +## 200 series — electrical + +- **E-201** — motor overtemperature — check cooling and load, measure winding + resistance.[^s10] +- **E-210** — frequency-converter fault — read out the converter log, reset once; replace on + repeat.[^s11] +- **E-230** — control-voltage loss — check the control-circuit fuses and the 24 V + supply.[^s12] +- **E-250** — emergency-stop circuit tripped — find and clear the cause before reset; log the + reset.[^s13] + +## 300 series — fluids + +- **E-301** — coolant loss — locate the leak, top up, check the level switch.[^s14] +- **E-310** — hydraulic seal leakage — replace the seal, dispose of leaked oil per the waste + plan.[^s15] +- **E-320** — compressed-air leakage — locate with leak spray, repair at the next + standstill.[^s16] +- **E-350** — steam trap failure — replace the trap, check the condensate line.[^s17] + +## 400 series — instrumentation + +- **E-412** — coolant temperature sensor fault — replace the sensor, verify against a hand + probe.[^s18] +- **E-420** — level transmitter fault — recalibrate; replace if drift exceeds 2 %.[^s19] +- **E-455** — flow meter drift — verify against the portable reference meter, + recalibrate.[^s20] + +## 500 series — safety + +- **E-500** — guard or interlock fault — take out of service; restart requires the safety + officer's sign-off.[^s21] + +## See also + +- [Machine registry — Aldervik yard](machine-registry-aldervik-yard.md) + +## Sources + +[^s1]: [raw/stoercode-katalog.md](../../raw/stoercode-katalog.md), lines 3-6 — catalogue scope, revision, and code count (ingested 2026-07-29) +[^s2]: [raw/stoercode-katalog.md](../../raw/stoercode-katalog.md), line 10 — E-101 (ingested 2026-07-29) +[^s3]: [raw/stoercode-katalog.md](../../raw/stoercode-katalog.md), line 11 — E-102 (ingested 2026-07-29) +[^s4]: [raw/stoercode-katalog.md](../../raw/stoercode-katalog.md), line 12 — E-110 (ingested 2026-07-29) +[^s5]: [raw/stoercode-katalog.md](../../raw/stoercode-katalog.md), line 13 — E-115 (ingested 2026-07-29) +[^s6]: [raw/stoercode-katalog.md](../../raw/stoercode-katalog.md), line 14 — E-120 (ingested 2026-07-29) +[^s7]: [raw/stoercode-katalog.md](../../raw/stoercode-katalog.md), line 15 — E-142 (ingested 2026-07-29) +[^s8]: [raw/stoercode-katalog.md](../../raw/stoercode-katalog.md), line 16 — E-155 (ingested 2026-07-29) +[^s9]: [raw/stoercode-katalog.md](../../raw/stoercode-katalog.md), line 17 — E-160 (ingested 2026-07-29) +[^s10]: [raw/stoercode-katalog.md](../../raw/stoercode-katalog.md), line 21 — E-201 (ingested 2026-07-29) +[^s11]: [raw/stoercode-katalog.md](../../raw/stoercode-katalog.md), line 22 — E-210 (ingested 2026-07-29) +[^s12]: [raw/stoercode-katalog.md](../../raw/stoercode-katalog.md), line 23 — E-230 (ingested 2026-07-29) +[^s13]: [raw/stoercode-katalog.md](../../raw/stoercode-katalog.md), line 24 — E-250 (ingested 2026-07-29) +[^s14]: [raw/stoercode-katalog.md](../../raw/stoercode-katalog.md), line 28 — E-301 (ingested 2026-07-29) +[^s15]: [raw/stoercode-katalog.md](../../raw/stoercode-katalog.md), line 29 — E-310 (ingested 2026-07-29) +[^s16]: [raw/stoercode-katalog.md](../../raw/stoercode-katalog.md), line 30 — E-320 (ingested 2026-07-29) +[^s17]: [raw/stoercode-katalog.md](../../raw/stoercode-katalog.md), line 31 — E-350 (ingested 2026-07-29) +[^s18]: [raw/stoercode-katalog.md](../../raw/stoercode-katalog.md), line 35 — E-412 (ingested 2026-07-29) +[^s19]: [raw/stoercode-katalog.md](../../raw/stoercode-katalog.md), line 36 — E-420 (ingested 2026-07-29) +[^s20]: [raw/stoercode-katalog.md](../../raw/stoercode-katalog.md), line 37 — E-455 (ingested 2026-07-29) +[^s21]: [raw/stoercode-katalog.md](../../raw/stoercode-katalog.md), lines 41-42 — E-500 (ingested 2026-07-29) diff --git a/corpora/werkhof/wiki/registries/index.md b/corpora/werkhof/wiki/registries/index.md new file mode 100644 index 0000000..7b6489a --- /dev/null +++ b/corpora/werkhof/wiki/registries/index.md @@ -0,0 +1,7 @@ +# registries + +The pages in this folder. Generated — do not edit. + +- [Customer registry — Werkhof Anlagenservice Brandt](customer-registry-werkhof-anlagenservice-brandt.md) — A roster of Werkhof Anlagenservice Brandt's 15 service customers, each with city, contract type, and the year the relationship began. +- [Fault-code catalogue — Aldervik yard](fault-code-catalogue-aldervik-yard.md) — A catalogue of the 20 fault codes (rev. 4, 2025) used on work orders and machine logs across the Aldervik yard, one code deprecated in favor of another. +- [Machine registry — Aldervik yard](machine-registry-aldervik-yard.md) — A registry of the 28 machines and fixed installations operated at the Aldervik yard, each with type, manufacturer, commissioning year, location, and status. diff --git a/corpora/werkhof/wiki/registries/machine-registry-aldervik-yard.md b/corpora/werkhof/wiki/registries/machine-registry-aldervik-yard.md new file mode 100644 index 0000000..dd08ce5 --- /dev/null +++ b/corpora/werkhof/wiki/registries/machine-registry-aldervik-yard.md @@ -0,0 +1,132 @@ +--- +type: Registry +title: Machine registry — Aldervik yard +description: A registry of the 28 machines and fixed installations operated at the + Aldervik yard, each with type, manufacturer, commissioning year, location, and status. +tags: +- machines +- equipment +- registry +- maintenance +resource: raw/maschinenbestand-2026.md +timestamp: '2026-07-29T08:19:41Z' +citadel_version: 0.5.0 +--- + +# Machine registry — Aldervik yard + +This registry lists all 28 machines and fixed installations operated at the Aldervik yard, +maintained by the plant engineering office, with a status date of 15 January 2026.[^s1] Every +unit carries its register number on a stamped plate, and work orders and fault logs refer to +machines by that number only.[^s1] Changes to the register go through the plant engineering +office; a machine is never removed from the register without a disposal record, so a +decommissioned unit stays listed until its disposal is complete.[^s1] + +## Hall 1 — machining + +- **DL-101** — pillar drill, Feldmann Werkzeugmaschinen, commissioned 1998, Hall 1 bay A, in + service.[^s2] +- **DL-102** — radial drill, Feldmann Werkzeugmaschinen, commissioned 1996, Hall 1 bay A, + decommissioned 2024, awaiting disposal.[^s3] +- **FR-110** — universal milling machine, Feldmann Werkzeugmaschinen, commissioned 2005, Hall 1 + bay B, in service.[^s4] +- **FR-111** — bed-type milling machine, Maschinenbau Quandt, commissioned 2012, Hall 1 bay B, in + service.[^s5] +- **CN-120** — CNC machining centre, Maschinenbau Quandt, commissioned 2018, Hall 1 bay C, in + service.[^s6] +- **CN-121** — CNC lathe, Maschinenbau Quandt, commissioned 2019, Hall 1 bay C, in service.[^s7] +- **SW-130** — welding station (MIG/MAG), Lichtbogen Severin, commissioned 2015, Hall 1 bay D, in + service.[^s8] +- **PU-140** — hydraulic press, Pressenwerk Ohlsen, commissioned 2009, Hall 1 bay D, in + service.[^s9] + +## Hall 2 — compressed air and pressure equipment + +- **KP-010** — screw compressor, Nordluft Kompressoren, commissioned 2016, Hall 2 compressor + room, in service.[^s10] +- **KP-011** — screw compressor, Nordluft Kompressoren, commissioned 2016, Hall 2 compressor + room, in service; logged fault E-142 on 9 June 2026, resolved the same day.[^s11][^s32] +- **KP-012** — piston compressor, Nordluft Kompressoren, commissioned 2008, Hall 2 compressor + room, standby unit.[^s12] +- **PV-013** — air receiver, 3000 l, Kesselbau Arens, commissioned 2016, Hall 2 compressor room, + in service.[^s13] +- **PV-014** — [PV-014 pressure vessel](../objects/pv-014-pressure-vessel.md) — process buffer, + 5000 l, Kesselbau Arens, commissioned 2019, Hall 2 process line; under observation since its + June 2026 annual inspection.[^s14][^s30] +- **HX-201** — [HX-201 heat exchanger](../objects/hx-201-heat-exchanger.md) — shell-and-tube heat + exchanger, Wärmetechnik Boll, commissioned 1998, Hall 2 process line; out of service since June + 2026 (tube leak).[^s15][^s31] +- **HX-210** — plate heat exchanger, Wärmetechnik Boll, commissioned 2014, Hall 2 process line, + in service; carrying process cooling alone since HX-201's June 2026 outage, with capacity for + summer load but not full winter load.[^s16][^s33] + +## Hall 3 — logistics + +- **KR-301** — overhead crane, 10 t, Hubwerk Krane, commissioned 2001, Hall 3, in service.[^s17] +- **KR-302** — overhead crane, 5 t, Hubwerk Krane, commissioned 2006, Hall 3, in service.[^s18] +- **ST-310** — forklift, 2.5 t, electric, Voss Fördertechnik, commissioned 2020, Hall 3, in + service.[^s19] +- **ST-311** — forklift, 2.5 t, electric, Voss Fördertechnik, commissioned 2020, Hall 3, in + service.[^s20] +- **ST-312** — forklift, 4.5 t, diesel, Voss Fördertechnik, commissioned 2013, yard, in + service.[^s21] +- **WB-320** — weighbridge, 40 t, Waagenbau Siems, commissioned 1999, yard gate, in service.[^s22] + +## Utilities — Hall 4 and outdoor + +- **GN-401** — standby diesel generator, 250 kVA, Kraftwerk Ohle, commissioned 2011, utility + yard, standby unit.[^s23] +- **TR-410** — distribution transformer, 630 kVA, Elektro Hansen, commissioned 2003, substation, + in service.[^s24] +- **CH-420** — process chiller, Kältetechnik Jensen, commissioned 2017, Hall 4 roof, in + service.[^s25] +- **CT-430** — cooling tower, Kältetechnik Jensen, commissioned 2004, utility yard, in + service.[^s26] +- **BL-440** — steam boiler, Kesselbau Arens, commissioned 2007, boiler house, in service.[^s27] +- **WT-450** — water-treatment unit, Aqua Nord, commissioned 2017, boiler house, in + service.[^s28] +- **FS-460** — fuel station (diesel, 5000 l tank), Tankbau Petersen, commissioned 2010, yard, in + service.[^s29] + +## See also + +- [Customer registry — Werkhof Anlagenservice Brandt](customer-registry-werkhof-anlagenservice-brandt.md) +- [Fault-code catalogue — Aldervik yard](fault-code-catalogue-aldervik-yard.md) +- [PV-014 pressure vessel](../objects/pv-014-pressure-vessel.md) +- [HX-201 heat exchanger](../objects/hx-201-heat-exchanger.md) + +## Sources + +[^s1]: [raw/maschinenbestand-2026.md](../../raw/maschinenbestand-2026.md), lines 1-9 — register scope, maintenance, and status date (ingested 2026-07-29) +[^s2]: [raw/maschinenbestand-2026.md](../../raw/maschinenbestand-2026.md), lines 13-18 — DL-101 (ingested 2026-07-29) +[^s3]: [raw/maschinenbestand-2026.md](../../raw/maschinenbestand-2026.md), lines 20-25 — DL-102 (ingested 2026-07-29) +[^s4]: [raw/maschinenbestand-2026.md](../../raw/maschinenbestand-2026.md), lines 27-32 — FR-110 (ingested 2026-07-29) +[^s5]: [raw/maschinenbestand-2026.md](../../raw/maschinenbestand-2026.md), lines 34-39 — FR-111 (ingested 2026-07-29) +[^s6]: [raw/maschinenbestand-2026.md](../../raw/maschinenbestand-2026.md), lines 41-46 — CN-120 (ingested 2026-07-29) +[^s7]: [raw/maschinenbestand-2026.md](../../raw/maschinenbestand-2026.md), lines 48-53 — CN-121 (ingested 2026-07-29) +[^s8]: [raw/maschinenbestand-2026.md](../../raw/maschinenbestand-2026.md), lines 55-60 — SW-130 (ingested 2026-07-29) +[^s9]: [raw/maschinenbestand-2026.md](../../raw/maschinenbestand-2026.md), lines 62-67 — PU-140 (ingested 2026-07-29) +[^s10]: [raw/maschinenbestand-2026.md](../../raw/maschinenbestand-2026.md), lines 71-76 — KP-010 (ingested 2026-07-29) +[^s11]: [raw/maschinenbestand-2026.md](../../raw/maschinenbestand-2026.md), lines 78-83 — KP-011 (ingested 2026-07-29) +[^s12]: [raw/maschinenbestand-2026.md](../../raw/maschinenbestand-2026.md), lines 85-90 — KP-012 (ingested 2026-07-29) +[^s13]: [raw/maschinenbestand-2026.md](../../raw/maschinenbestand-2026.md), lines 92-97 — PV-013 (ingested 2026-07-29) +[^s14]: [raw/maschinenbestand-2026.md](../../raw/maschinenbestand-2026.md), lines 99-104 — PV-014 (ingested 2026-07-29) +[^s15]: [raw/maschinenbestand-2026.md](../../raw/maschinenbestand-2026.md), lines 106-111 — HX-201 (ingested 2026-07-29) +[^s16]: [raw/maschinenbestand-2026.md](../../raw/maschinenbestand-2026.md), lines 113-118 — HX-210 (ingested 2026-07-29) +[^s17]: [raw/maschinenbestand-2026.md](../../raw/maschinenbestand-2026.md), lines 122-127 — KR-301 (ingested 2026-07-29) +[^s18]: [raw/maschinenbestand-2026.md](../../raw/maschinenbestand-2026.md), lines 129-134 — KR-302 (ingested 2026-07-29) +[^s19]: [raw/maschinenbestand-2026.md](../../raw/maschinenbestand-2026.md), lines 136-141 — ST-310 (ingested 2026-07-29) +[^s20]: [raw/maschinenbestand-2026.md](../../raw/maschinenbestand-2026.md), lines 143-148 — ST-311 (ingested 2026-07-29) +[^s21]: [raw/maschinenbestand-2026.md](../../raw/maschinenbestand-2026.md), lines 150-155 — ST-312 (ingested 2026-07-29) +[^s22]: [raw/maschinenbestand-2026.md](../../raw/maschinenbestand-2026.md), lines 157-162 — WB-320 (ingested 2026-07-29) +[^s23]: [raw/maschinenbestand-2026.md](../../raw/maschinenbestand-2026.md), lines 166-171 — GN-401 (ingested 2026-07-29) +[^s24]: [raw/maschinenbestand-2026.md](../../raw/maschinenbestand-2026.md), lines 173-178 — TR-410 (ingested 2026-07-29) +[^s25]: [raw/maschinenbestand-2026.md](../../raw/maschinenbestand-2026.md), lines 180-185 — CH-420 (ingested 2026-07-29) +[^s26]: [raw/maschinenbestand-2026.md](../../raw/maschinenbestand-2026.md), lines 187-192 — CT-430 (ingested 2026-07-29) +[^s27]: [raw/maschinenbestand-2026.md](../../raw/maschinenbestand-2026.md), lines 194-199 — BL-440 (ingested 2026-07-29) +[^s28]: [raw/maschinenbestand-2026.md](../../raw/maschinenbestand-2026.md), lines 201-206 — WT-450 (ingested 2026-07-29) +[^s29]: [raw/maschinenbestand-2026.md](../../raw/maschinenbestand-2026.md), lines 208-213 — FS-460 (ingested 2026-07-29) +[^s30]: [raw/wartungsbericht-2026-06.md](../../raw/wartungsbericht-2026-06.md), lines 7-14 — PV-014 June 2026 annual inspection: interval shortened, vessel under observation (ingested 2026-07-29) +[^s31]: [raw/wartungsbericht-2026-06.md](../../raw/wartungsbericht-2026-06.md), lines 22-23 — HX-201 tube leak, taken out of service 12 June 2026 (ingested 2026-07-29) +[^s32]: [raw/wartungsbericht-2026-06.md](../../raw/wartungsbericht-2026-06.md), lines 28-32 — KP-011 fault E-142, resolved same day (ingested 2026-07-29) +[^s33]: [raw/wartungsbericht-2026-06.md](../../raw/wartungsbericht-2026-06.md), lines 24-26 — HX-210 sole cooling duty, capacity note (ingested 2026-07-29) diff --git a/corpora/werkhof/wiki/sources/index.md b/corpora/werkhof/wiki/sources/index.md new file mode 100644 index 0000000..f1daa33 --- /dev/null +++ b/corpora/werkhof/wiki/sources/index.md @@ -0,0 +1,10 @@ +# Sources + +Provenance for every ingested raw source: the model that actually imported it, what that session cost, when it was last checked, and the wiki pages that cite it. Generated — do not edit. + +| Source | Model | Cost | Tokens | Checked | Referenced by | +| --- | --- | --- | --- | --- | --- | +| [raw/kundenliste.csv](../../raw/kundenliste.csv) | claude:claude-sonnet-5 | $1.0117 | 1,054,855 in / 11,284 out | 2026-07-29 | [Nordwerk Maschinenbau GmbH](../organizations/nordwerk-maschinenbau-gmbh.md), [Customer registry — Werkhof Anlagenservice Brandt](../registries/customer-registry-werkhof-anlagenservice-brandt.md) | +| [raw/maschinenbestand-2026.md](../../raw/maschinenbestand-2026.md) | claude:claude-sonnet-5 | $0.7945 | 565,729 in / 16,732 out | 2026-07-29 | [HX-201 heat exchanger](../objects/hx-201-heat-exchanger.md), [PV-014 pressure vessel](../objects/pv-014-pressure-vessel.md), [Machine registry — Aldervik yard](../registries/machine-registry-aldervik-yard.md) | +| [raw/stoercode-katalog.md](../../raw/stoercode-katalog.md) | claude:claude-sonnet-5 | $0.671 | 715,902 in / 8,200 out | 2026-07-29 | [Fault-code catalogue — Aldervik yard](../registries/fault-code-catalogue-aldervik-yard.md) | +| [raw/wartungsbericht-2026-06.md](../../raw/wartungsbericht-2026-06.md) | claude:claude-sonnet-5 | $1.6673 | 1,878,809 in / 35,024 out | 2026-07-29 | [HX-201 heat exchanger](../objects/hx-201-heat-exchanger.md), [PV-014 pressure vessel](../objects/pv-014-pressure-vessel.md), [Nordwerk Maschinenbau GmbH](../organizations/nordwerk-maschinenbau-gmbh.md), [Customer registry — Werkhof Anlagenservice Brandt](../registries/customer-registry-werkhof-anlagenservice-brandt.md), [Machine registry — Aldervik yard](../registries/machine-registry-aldervik-yard.md) | diff --git a/docs/verify-corpus-backlog.md b/docs/verify-corpus-backlog.md index e8c68c2..3f591c0 100644 --- a/docs/verify-corpus-backlog.md +++ b/docs/verify-corpus-backlog.md @@ -51,6 +51,7 @@ Row format: | id | first seen | corpus | guarantee | lane | defect + route | status | |----|------------|--------|-----------|------|----------------|--------| +| VCB-005 | 2026-07-29 | kelvarra | complete enumeration of catalog entries | wiki-generation | An enumerable source's tail was compressed instead of captured: `organizations/instrument-works.md` presses 5 "Sundries" products (survey chains, thermometers, sounding leads, tide-pole, rain gauge) into ONE footnote `[^s9]` with no per-entry attributes and no per-entry retrievability — the granularity floor + essence-not-structure rules actively demanded it. Route: the `Registry` page kind — `genres/registry.md`, the `Registry` type row + `## Registries` contract in `schema.md`, floor/essence carve-outs in `core.md`, `okf.folder_for_type`, registry-aware curate length guidance. | fixed (PR #134 — capability verified by the werkhof Mode A run below; the kelvarra showcase itself keeps its pre-registry wiki until its next rebuild, so its catalogue page still shows the old compression) | ## Runs @@ -58,6 +59,31 @@ Row format: verdict, and the `VCB-` ids the run touched, or `misses: none`. This `## Runs` heading stays singular; runs nest under it.)* +### 2026-07-29 werkhof (first run — the registry corpus, grading PR #134's Registry feature) + +- **Mode:** Mode A into the corpus workspace itself (`CITADEL_WORKSPACE=corpora/werkhof`), building + the committed showcase; full answer-key walk of `werkhof/ground-truth.md` afterwards, + retrieval-first. +- **Model:** `claude:claude-sonnet-5` (`CITADEL_INGEST_MODEL=sonnet`) · **rules_version:** + `ed2320969640` · serial (`--jobs 1`) · 4 sources, 8 sessions (each first `--bare` attempt hit the + container's auth-in-user-settings shape and retried without hermetic isolation — the shipped + hermetic-auth fallback working as designed) · $4.14 recorded. +- **Result:** `check` exit 0, `lint` exit 0 (advisories: 2 undefined abbreviations HX/PV). All three + collections came out as `type: Registry` pages under `registries/` with **28/28 machines, 20/20 + fault codes, 15/15 customers** as rows, one `[^sN]` per row (`lines A-B` block locators on the + machine register, `line N` per code/CSV row; locator issues 0, so every one offline-verifies). The + register's stated "all 28" total is cited in the scope line. **Promotion** worked unprompted: + PV-014 and HX-201 → `objects/`, Nordwerk (K-007) → `organizations/`, each registry row reduced to + key + link + gloss; register-only machines stayed rows (no stub pages). The HX-201 register-vs-report + status supersession landed as a dated trace; E-142 vs E-412 and HX-201 vs HX-210 never conflated; + E-155's deprecation hand-over survives as a row; Petersen/Albers stay attributed; the report's three + done-able items landed as `## Open Points` threads (3 points in the generated catalog), not registry + rows; the CSV was treated as data (0 `[^llm]` pages). Retrieval: mid-list keys `KP-011`, `E-420`, + `K-009` each surface their registry page as the top hit. +- **Verdict:** PASS on every guarantee — the Registry rules produce complete, per-row-cited, + retrievable registries with correct promotion on the first try. **VCB-005** recorded and moved to + § Resolved on this evidence. `misses: none`. + ### 2026-07-25 beverages + a purpose-built overlap corpus - **Mode:** Mode A, but scoped as a **parallelism + model** test rather than a full answer-key grade: