knowledge_add
Add a knowledge node to a hierarchical store, requiring a parent path and a normative decision with reason to enforce provenance and prevent ambiguous facts.
Instructions
Add a new knowledge node to the tree. Specify parent_path to place it in the hierarchy. parent_path must already exist (or be '/'); an unknown parent_path is rejected with suggested nearby paths unless neuer_ast=True explicitly opens a new branch. source is required and rejected if empty -- e.g. "erzeugt aus /pfad/datei.md (Stand 2026-08-05T23:40:00+02:00)". norm_entscheidung is REQUIRED: 'keine_norm' (plain fact, no rank), 'norm_befristet' (norm with an end date) or 'norm_unbefristet' (norm without one). Omitting it, or combining it inconsistently with norm_rang/gilt_ab/gilt_bis, is rejected -- there is no default, because a silent default would recreate the exact ambiguity this field exists to remove (was a fact really decided to be non-normative, or did nobody look?). norm_rang/gilt_ab/gilt_bis stay optional inputs, but 'norm_befristet'/'norm_unbefristet' require norm_rang and gilt_ab to end up set (either given directly, or deterministically derived from source for directive/ADR imports -- ADR-034); 'norm_befristet' additionally requires gilt_bis, 'norm_unbefristet' requires gilt_bis stay unset. gilt_ab/gilt_bis must be ISO-8601 date or timestamp; gilt_bis before gilt_ab is rejected. Example -- raw material "Sozialtarif-Zuschlag entfaellt zum 01.03.2027 vollstaendig, loest die Uebergangsregelung von 2022 ab." -> {"parent_path": "/wissensnetz-pflegeverbund", "title": "Sozialtarif-Zuschlag entfaellt 01.03.2027", "summary": "Sozialtarif-Zuschlag entfaellt zum 01.03.2027, loest Regelung von 2022 ab.", "norm_rang": 2, "gilt_ab": "2027-03-01", "norm_entscheidung": "norm_unbefristet", "norm_entschieden_grund": "Uebergangsregelung 2022 laeuft aus, Nachfolgeregel greift direkt", "source": "erzeugt aus Rohmaterial (Beispiel)"}. norm_entschieden_grund is REQUIRED whenever norm_entscheidung is given (like grund on knowledge_zurueckziehen) -- a free-text reason for the decision. Who decided (norm_entschieden_von) is resolved automatically from your caller identity, not a separate input. When a rank-1/2 directive is the source, betreiber_weisung carries the exact quote and records the operator as decision-maker. anlass records what triggered this entry: 'selbst' (you wrote it unprompted) or 'betreiber' (an explicit human instruction, e.g. "merk dir das") are SELF-REPORTED -- only as reliable as the caller. 'hook' (the enforcing Stop-hook made you call this) and 'skript' (batch/migration/harvest run, no conversation) are objective in principle, but note the Stop-hook itself never calls this tool -- it only forces you to run /learn, which then calls this normally, so 'hook' is still self-reported by that skill, not verified by the server. Default 'unbekannt' if omitted. An unknown value is rejected with the allowed list, nothing is written. If up to 3 active nodes look content-similar (checked BEFORE writing), the response includes similar_node_hint -- a hint only, never auto-merged, no rejection either.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | Kind of entry: 'arbeitsbestand' (working set, the default) or 'nachschlagewerk' (reference corpus -- may sit in the store as a distractor but is never the TARGET of a test case, see node 096669de). Set this for imported third-party material, otherwise it dilutes retrieval. | arbeitsbestand |
| tags | No | ||
| actor | No | Calling agent identity; else BEGOD_KNOWLEDGE_ACTOR or unknown | |
| kreis | No | Optional: restrict this entry to one circle of people you belong to (BDW-E22). Empty (default) means everyone in your tenant. Set it AT CREATION -- narrowing it later already told everyone, via the hit count, that something exists. | |
| model | No | Calling model; else BEGOD_KNOWLEDGE_MODEL or unknown | |
| title | Yes | ||
| source | No | Required unless abgeleitet_von is set (then it must be omitted -- the system generates it). Origin: file path, konsil ID, or research ID. Example: 'erzeugt aus /pfad/datei.md (Stand 2026-08-05T23:40:00+02:00)' | |
| content | No | Full content (loaded only on read) | |
| gilt_ab | No | Optional: ISO-8601 date/timestamp the norm takes effect | |
| session | No | Stable session ID; else BEGOD_KNOWLEDGE_SESSION or unknown | |
| summary | Yes | 1-2 sentences summary (token-efficient) | |
| gilt_bis | No | Optional: ISO-8601 date/timestamp the norm expires; omit for indefinite. Must not be before gilt_ab. | |
| occasion | No | What triggered this entry -- selbst/betreiber self-reported, hook/skript objective in principle (see tool description). Default 'unbekannt'. | unbekannt |
| neuer_ast | No | Explicitly allow creating a new top-level branch when parent_path doesn't exist yet | |
| norm_rang | No | Optional: rank of a norm (1=global directive, 2=hub directive, 3=ADR). Omit for plain facts. | |
| project_id | No | Free-form project slug (any app dir under <Verbundwurzel>/, e.g. 'fahrtenbuch', 'openlehr'), not a fixed set. Omit to derive it from a matching segment in parent_path (falls back to 'shared' if none matches); pass explicitly (including '') to override the derivation. | |
| parent_path | Yes | Parent node path, e.g. '/shared/arch' -- must exist | |
| abgeleitet_von | No | Optional: id or path of an EXISTING source node. If set, source is generated by the system from the source node's kind (parent_path/norm_rang/tags, never its title/summary/content) -- giving your own source is rejected. | |
| betreiber_weisung | No | Exact operator quote for a rank-1/2 instruction; at least 10 characters inside German opening and straight closing quotes. | |
| norm_entscheidung | Yes | REQUIRED (no default): keine_norm=plain fact/no rank, norm_befristet=norm with an end date, norm_unbefristet=norm without one. See tool description. | |
| norm_entschieden_grund | Yes | REQUIRED alongside norm_entscheidung: free-text reason for the decision (see tool description). |