Files
pv-agent/.agents/wissensbasis/SKILL.md
T
fegger bf8191b013 Planung und Skills für den Wissensbasis-RAG-Agenten
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).
2026-09-14 16:34:13 +02:00

221 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
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-0103
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).