bf8191b013
planung.md: Architektur (schlanker RAG-Service, SQLite-Index, Hybrid-Retrieval), verbindliche Grounding-Regeln, Modell-Bake-off M3 (qwen3.8:27b, qwen3:32b, gemma3:27b, mistral-small3.2:24b, qwen3:14b als Latenz-Untergrenze), Meilensteine M1-M4 und Odoo-Integrationsoptionen. .agents: neuer Skill pv-rag-agent (verbindliche Regeln für die Implementierung) sowie bestehende Projekt-Skills (agent-memory, wissensbasis, odoo19-development, opendataloader-pdf).
221 lines
11 KiB
Markdown
221 lines
11 KiB
Markdown
---
|
||
name: wissensbasis
|
||
description: |
|
||
Rules for building and maintaining the curated Austrian personal-law
|
||
knowledge base (Wissensbasis) under personalverrechnung/wissensbasis/:
|
||
intake of licensed PDF sources (.lexis360/ Lexis Briefings Personalrecht,
|
||
.wiku/ WIKU Personal publications), Layer-1 extraction and cataloging via
|
||
personalverrechnung/tools/build_lexis_kb.py, Layer-2 curation (frontmatter
|
||
schema, clusters, frozen IDs, curation conventions, status marks),
|
||
registry generation (kb.json, INDEX.md), validation gates
|
||
(--registry/--check), the batch workflow, and licensing rules for the raw
|
||
sources. Use for any Wissensbasis work: new batches, curating entries,
|
||
pipeline/tool changes, or anything touching .lexis360/ or .wiku/.
|
||
disable-model-invocation: false
|
||
---
|
||
|
||
## Applicability
|
||
|
||
Use this skill for all work on the Wissensbasis: importing new batches,
|
||
curating Layer-2 entries, extending `build_lexis_kb.py`, regenerating
|
||
`kb.json`/`INDEX.md`, resolving corpus conflicts, and anything that reads
|
||
or writes the sources `.lexis360/` or `.wiku/`.
|
||
|
||
The Wissensbasis serves two purposes (see
|
||
`personalverrechnung/wissensbasis/README.md`):
|
||
|
||
1. **development reference** next to `RECHTSQUELLEN-*.md` for the payroll
|
||
modules (`l10n_at_hr_payroll*`), and
|
||
2. **future copilot corpus** — retrieval-ready: stable IDs, machine-readable
|
||
`kb.json`.
|
||
|
||
Skills do not replace the mandatory `AGENTS.md` workflow. When Wissensbasis
|
||
work feeds payroll implementation, combine with `payroll/SKILL.md`.
|
||
|
||
## Source corpora & licensing (decision D1, 2026-09-10)
|
||
|
||
| Source | Path | Content |
|
||
|---|---|---|
|
||
| Lexis 360 | `.lexis360/*.pdf` | licensed exports of *Lexis Briefings Personalrecht* |
|
||
| WIKU Personal | `.wiku/*.pdf` | licensed WIKU publications (Fachbroschüren, Arbeitsunterlagen, Casebooks, „WIKU Personal aktuell" issues) |
|
||
|
||
Binding rules:
|
||
|
||
- PDFs and extracted Volltexte are licensed content: **local + unversioned**
|
||
(both directories gitignored, pattern `.firecrawl/`). Never commit them.
|
||
- Only Layer-2 curation (own words, short quotes with source attribution)
|
||
is versioned.
|
||
- If a licensed source file is missing: **ask the user — never re-procure**,
|
||
never reconstruct from training knowledge. Unlike `.firecrawl/`, these
|
||
are not agent-reconstructable web fetches.
|
||
|
||
## Layer architecture
|
||
|
||
| Layer | Path | Versioned | Tool |
|
||
|---|---|---|---|
|
||
| PDF exports | `.lexis360/*.pdf`, `.wiku/*.pdf` | no | manual export/copy by the user |
|
||
| Layer 1 — full texts + catalog | `.lexis360/md/` + `_catalog.json`; WIKU: `.wiku/md/` (planned) | no | `--extract` |
|
||
| Layer 2 — curated entries | `personalverrechnung/wissensbasis/dokumente/<slug>.md` | **yes** | by hand |
|
||
| Registry + index | `personalverrechnung/wissensbasis/kb.json`, `INDEX.md` | **yes** (generated) | `--registry` |
|
||
|
||
The Layer-2 frontmatter is the **single source of truth**; `kb.json` and
|
||
`INDEX.md` are always regenerated from it, never hand-edited.
|
||
|
||
## IDs, clusters, frontmatter schema
|
||
|
||
- IDs: `lb-<prefix>-<nn>` (Lexis), `wk-<prefix>-<nn>` (WIKU). Assigned at
|
||
first `--extract`, then **frozen** (`load_previous_ids()` via
|
||
`_catalog.json`): never renumber, never reuse numbers of removed
|
||
documents. New documents append after the highest number in their
|
||
cluster.
|
||
- `topic` = descriptive ASCII cluster slug (`altersteilzeit`, `lehrlinge`,
|
||
…); the ID prefix lives only in `id`. New clusters extend **all four**
|
||
structures in `build_lexis_kb.py`: `TOPIC_MAP` (breadcrumb → prefix),
|
||
`KEYWORDS` (slug fallback), `CLUSTERS` (prefix → display name) and
|
||
`TOPIC_TO_PREFIX` (frontmatter validation).
|
||
- Decision D2: structural frontmatter keys in English (consistent with
|
||
`kv-catalog.json`/`chambers.json`), values in German UTF-8. Exceptions:
|
||
`stand` as ISO `YYYY-MM`, `topic`/`tags` as ASCII slugs (umlauts
|
||
**dropped**, not transliterated — `uberblick`; ß → `ss`).
|
||
- Layer-2 filename = Layer-1 slug (WIKU: with `wiku_` prefix, see below).
|
||
|
||
Binding frontmatter (full schema and cluster table:
|
||
`personalverrechnung/wissensbasis/README.md`):
|
||
|
||
```yaml
|
||
id: lb-atz-07 # frozen; WIKU: wk-<prefix>-<nn>
|
||
batch: 1 # procurement batch, set manually per import
|
||
title: "Altersteilzeit - Überblick"
|
||
work: "Lexis Briefings Personalrecht" # WIKU: exact publication name
|
||
chapter: "Beschäftigungsverhältnisse" # source chapter (breadcrumb; WIKU: derived)
|
||
topic: altersteilzeit # ASCII cluster slug
|
||
author: "Marek"
|
||
stand: 2026-01 # ISO month of the source's Stand
|
||
source:
|
||
pdf: ".lexis360/Lexis360_altersteilzeit_uberblick.pdf"
|
||
text: ".lexis360/md/altersteilzeit_uberblick.md"
|
||
legal_bases: ["AlVG", "AZG § 19e"] # only norms named in the source text
|
||
tags: [altersteilzeit, ams-foerderung] # ASCII slugs, specific before generic
|
||
cross_refs: ["lb-atz-09"] # related KB entries; dangling = error
|
||
```
|
||
|
||
## Curation conventions (binding)
|
||
|
||
1. **Sprache:** German, Fachsprache as in the original; metadata values
|
||
UTF-8; `topic`/`tags` ASCII.
|
||
2. **Eigene Worte** — curation is not a full-text copy (licence!). Short
|
||
verbatim quotes only, marked and with Stand.
|
||
3. **Werte immer mit Stand** — every value carries „(Stand YYYY-MM)".
|
||
Never add values from training knowledge — only from the source text,
|
||
or from newer KB entries (then cite the ID).
|
||
4. **Status marks as in RECHTSQUELLEN:** ✅ verified · ⚠ plausible, detail
|
||
verification open · ❓ deliberately open. Quote §§ only when the source
|
||
names them; otherwise ⚠ with a verification note (RIS).
|
||
5. **Document structure:** `# <Titel>` → *source line (work, author,
|
||
Stand, ID)* → `## Zusammenfassung` → `## Kernwerte & Fristen (Stand
|
||
YYYY-MM)` (table) → `## Rechtsgrundlagen` → `## Payroll-Relevanz
|
||
(Odoo)` → `## Verweise`.
|
||
6. **Payroll-Relevanz** names Odoo 19 anchor points (hr_payroll engine,
|
||
work entries, `hr.rule.parameter`, SV-BG handling, Meldewesen) as
|
||
implementation *hints*, not as a spec.
|
||
7. **Verweise:** KB IDs of related briefings (respect the source's
|
||
breadcrumb cross-references) + project files (`RECHTSQUELLEN-*.md`).
|
||
8. **Export artefacts:** ignore footers („Page n", „Erstellt von …");
|
||
never reconstruct truncated cross-references — note when a reference
|
||
spot is incomplete in the export.
|
||
9. **Reference / quality benchmark:** `dokumente/altersteilzeit_uberblick.md`.
|
||
|
||
## Batch workflow (new Lexis import)
|
||
|
||
```bash
|
||
# 1. copy new PDFs to .lexis360/ (keep export naming convention Lexis360_<slug>.pdf)
|
||
# 2. bump the BATCH constant in personalverrechnung/tools/build_lexis_kb.py
|
||
python3 personalverrechnung/tools/build_lexis_kb.py --extract # Layer 1 + catalog (IDs stay frozen)
|
||
# 3. curate new Layer-2 entries (conventions above)
|
||
python3 personalverrechnung/tools/build_lexis_kb.py --registry # kb.json + INDEX.md, validates frontmatter
|
||
python3 personalverrechnung/tools/build_lexis_kb.py --check # Layer-1<->Layer-2 completeness
|
||
```
|
||
|
||
Afterwards update `personalverrechnung/RUNBOOK.md` and `.agents/MEMORY.md`
|
||
(`INDEX.md` is regenerated, not hand-edited).
|
||
|
||
Layer-1 batch intake stays with `build_lexis_kb.py` (frozen IDs, catalog and
|
||
`--check` depend on the Layer-1 text shape). For **difficult individual PDFs**
|
||
(scanned, complex tables) and **extraction spot-checks** against the source
|
||
PDFs, use `opendataloader-pdf/SKILL.md` — not a pipeline replacement.
|
||
|
||
## Validation & values discipline
|
||
|
||
- `--registry` enforces: mandatory keys, ID pattern, ID-prefix↔topic
|
||
consistency, `stand` format, `batch` in `1..BATCH`, dangling
|
||
`cross_refs`.
|
||
- `--check` enforces: 1:1 catalog↔curation, Layer-1 text and PDF files
|
||
exist.
|
||
- Spot-check Kernwerte against the Layer-1 full text:
|
||
`sed -n '16,$p' .lexis360/md/<slug>.md`. Values never from training
|
||
knowledge.
|
||
- Corpus conflicts (source vs. source): document **both** values with IDs
|
||
and Stand in the entry (⚠/⚓) — never resolve silently.
|
||
`RECHTSQUELLEN-*.md` stays binding; RIS clarifies before implementation
|
||
(known conflicts: `personalverrechnung/RUNBOOK.md`, Wissensbasis
|
||
section, and `.agents/MEMORY.md`).
|
||
|
||
## Known intake pitfalls
|
||
|
||
- ß/URL-encoded export filenames (`%c3%9f` = ß) — normalize (ß → `ss`);
|
||
document it.
|
||
- Identical truncated export filenames for different briefings (Batch 7:
|
||
`auslandstatigkeit_sv_tatigkeit_in` ×3) — rename explicitly before
|
||
extraction.
|
||
- Duplicate exports with identical text — remove before extraction
|
||
(batches 2 and 4).
|
||
- Fossil IDs from Pass-1 keyword mis-grabs (e.g. `lb-mip-05` corrected to
|
||
`lb-swa-05`): fix before curation; the tool warns when a frozen ID has
|
||
a mismatching cluster prefix.
|
||
- Breadcrumb wrap variants: the parser must handle wrapping also after
|
||
the first „·" — harden for new variants when a batch surprises.
|
||
- `KEYWORDS` order matters (first match wins): **specific stems before
|
||
generic ones** (batch-4 lesson).
|
||
- Old Stände (e.g. leh 2024-03/2025-08, gsf/vst/lei 2025-06, son-01–03
|
||
2025-06): curate only with explicit Stand marking.
|
||
|
||
## WIKU source `.wiku/` (integration model, 2026-09-10)
|
||
|
||
- Content: licensed WIKU Personal publications — Fachbroschüren,
|
||
Arbeitsunterlagen, Casebooks („gelöste Praxisfälle") and the periodical
|
||
„WIKU Personal aktuell" (issues „2026, Nr. N", combined issues like
|
||
„Nr. 4-5", „Nr. 8 - 9").
|
||
- Integration: **one shared corpus** — same
|
||
`personalverrechnung/wissensbasis/`, one `kb.json`; the `work` field
|
||
distinguishes the sources. WIKU entries use their own ID space
|
||
`wk-<prefix>-<nn>` on the existing cluster map (e.g. `wk-pfa-01`
|
||
alongside `lb-pfa-*`).
|
||
- Layer 1: `.wiku/md/<slug>.md` + `.wiku/md/_catalog.json` (separate
|
||
from Lexis). Layer-2 filenames get a `wiku_` prefix
|
||
(`wiku_lohnpfandung.md`) to avoid collisions in the shared `dokumente/`
|
||
directory.
|
||
- Stand determination: explicit „Stand YYYY-MM" / „YYYY-MM" in the
|
||
filename; periodicals: the issue's month; otherwise title page /
|
||
Impressum.
|
||
- WIKU has no Lexis breadcrumbs — metadata (Stand, chapter/topic) comes
|
||
from the filename and the title page.
|
||
- Granularity: **1 publication = 1 Layer-2 entry** (consistent with
|
||
briefing = entry). Per-case / per-article curation for Casebooks and
|
||
periodicals is a possible later extension.
|
||
- `cross_refs` between `lb-*` and `wk-*` on the same topic are
|
||
encouraged.
|
||
- Pipeline: WIKU must flow through a **multi-source extension of the
|
||
existing tool** (parameterize source directory and work), not a forked
|
||
second tool. Same validation gates apply. Status: not yet built —
|
||
follow-up **after Batch 7** (Lexis) is complete. Do not start WIKU
|
||
intake before that unless the user explicitly says so.
|
||
|
||
## Open points
|
||
|
||
- WIKU pipeline extension of `build_lexis_kb.py` (multi-source
|
||
`--extract`/`--registry`/`--check`).
|
||
- Copilot deployment needs a licence-compliant Layer-1 provisioning path
|
||
(Volltexte are not in the repo).
|
||
- Known corpus conflicts and verification backlogs: see
|
||
`personalverrechnung/RUNBOOK.md` (Wissensbasis section) and
|
||
`.agents/MEMORY.md` (open issues). |