import vault

This commit is contained in:
Marcel Arndt
2026-07-16 14:04:45 +02:00
commit a2ad5f5c6d
90 changed files with 31429 additions and 0 deletions
+37
View File
@@ -0,0 +1,37 @@
# By Context
All assigned entities (`parent` set), grouped by their **root context** — the topmost ancestor reached by walking the `parent` chain.
```dataviewjs
const ALL = dv.pages('""').where(p =>
p.parent && !p.file.path.startsWith("_templates/")
);
function rootContext(page, depth = 0) {
if (depth > 16) return "(cycle)";
if (!page.parent) return page.file.name;
const link = page.parent;
const path = (link && link.path) || (typeof link === "string" ? link : null);
if (!path) return "(unresolved)";
const parent = dv.page(path);
if (!parent) return path;
if (!parent.parent) return parent.file.name;
return rootContext(parent, depth + 1);
}
const groups = {};
for (const p of ALL) {
const ctx = rootContext(p);
(groups[ctx] = groups[ctx] || []).push(p);
}
for (const ctx of Object.keys(groups).sort()) {
dv.header(2, ctx);
dv.table(
["Entity", "Direct parent", "Status"],
groups[ctx]
.sort((a, b) => (a.file.name > b.file.name ? 1 : -1))
.map(p => [p.file.link, p.parent, p.status ?? ""])
);
}
```
+85
View File
@@ -0,0 +1,85 @@
---
components:
- reviewable
review_status: needs_review
review_reason: "Cluster fuer Hygiene-Migration"
---
# Hygiene Migration
Quelle: [[90-dashboards/Hygiene|Hygiene Report]] vom 2026-06-24.
## Zusammenfassung
| Cluster | Befund | Anzahl | Migrationsart |
| --- | --- | ---: | --- |
| C1 | `components` fehlt | 24 Notes | Komponenten deklarieren |
| C2 | `contextual` fehlt oder ist nicht deklariert | 25 Notes, 26 Warnungen | `components` um `contextual` ergaenzen und Kontextfelder pruefen |
| C3 | `context_role` hat alte Werte | 16 Notes | Werte auf neues Enum migrieren |
| C4 | `base_created` wurde bisher gegen ein zu strenges Format geprueft | 5 Notes | Pruefung auf Obsidian-Format umstellen |
| C5 | Iterationsdefinitionen haben alte Feldwerte/Formate | 3 Notes plus Backlog-Hinweis | `iterdef` + Datum/Status normalisieren |
| C6 | Root-Note ohne Frontmatter | 1 Note | Minimal-Frontmatter fuer Root festlegen |
## C1 Components Fehlen
Diese Notes haben gar kein `components`-Array. Minimal muss `components` angelegt werden; fachlich vermutlich mindestens `contextual`.
| Bereich | Notes |
| --- | --- |
| Inbox | [[00-inbox/Tagesabschluss in der Zeiterfassung ermöglichen|Tagesabschluss in der Zeiterfassung ermöglichen]] |
| Contexts | [[10-contexts/Genius.ceo|Genius.ceo]], [[10-contexts/health|health]], [[10-contexts/work|work]] |
| Projects | [[20-projects/Avicenna|Avicenna]], [[20-projects/JULI|JULI]], [[20-projects/medmix Deutschland GmbH|medmix Deutschland GmbH]] |
| Tasks | [[30-tasks/Arbeitszeit aufteilen|Arbeitszeit aufteilen]], [[30-tasks/Arbeitszeit Sonstiges nur mit Kommentar|Arbeitszeit Sonstiges nur mit Kommentar]], [[30-tasks/Arbeitszeit taggen|Arbeitszeit taggen]], [[30-tasks/Liste der Mehraufwände am Projekt|Liste der Mehraufwände am Projekt]], [[30-tasks/Passwort ändern|Passwort ändern]], [[30-tasks/Personalstamm implementieren|Personalstamm implementieren]], [[30-tasks/Projektpositionen können abgeschlossen werden|Projektpositionen können abgeschlossen werden]], [[30-tasks/Review erfasster Mehraufwände|Review erfasster Mehraufwände]], [[30-tasks/Werkstatt als Systemprojekt aufnehmen|Werkstatt als Systemprojekt aufnehmen]], [[30-tasks/Zeit mit Projekt kann nicht auf Allgemein gebucht werden|Zeit mit Projekt kann nicht auf Allgemein gebucht werden]], [[30-tasks/Zeitzuordnung wird durch Sync zurückgesetzt|Zeitzuordnung wird durch Sync zurückgesetzt]] |
| Notes | [[40-notes/Austausch Dashboard Painpoints|Austausch Dashboard Painpoints]], [[40-notes/Demo Iteration 2|Demo Iteration 2]], [[40-notes/Iteration 1|Iteration 1]], [[40-notes/Iteration 2|Iteration 2]], [[40-notes/Iteration 3|Iteration 3]], [[40-notes/Onboarding von Philipp Töbelmann|Onboarding von Philipp Töbelmann]] |
## C2 Contextual Migration
Regel: Jede Nicht-Root-Note soll mittelfristig `contextual` in `components` tragen. Wenn `contextual` gesetzt ist, ist `context_target` Pflicht; `context_role` ist empfohlen.
Betroffen sind alle Notes aus C1 plus [[40-notes/Backlog|Backlog]]. Backlog hat bereits `components: [iterdef]`, braucht aber zusaetzlich `contextual`.
## C3 Context Role Werte
Erlaubt sind: `root`, `area`, `customer`, `project`, `product`, `person`, `topic`, `technology`, `organization`.
| Alter Wert | Anzahl | Notes | Vorschlag |
| --- | ---: | --- | --- |
| `Customer` | 2 | [[20-projects/JULI|JULI]], [[20-projects/medmix Deutschland GmbH|medmix Deutschland GmbH]] | wahrscheinlich `project` oder `customer` fachlich entscheiden |
| `Feature` | 7 | [[30-tasks/Arbeitszeit aufteilen|Arbeitszeit aufteilen]], [[30-tasks/Arbeitszeit Sonstiges nur mit Kommentar|Arbeitszeit Sonstiges nur mit Kommentar]], [[30-tasks/Arbeitszeit taggen|Arbeitszeit taggen]], [[30-tasks/Passwort ändern|Passwort ändern]], [[30-tasks/Personalstamm implementieren|Personalstamm implementieren]], [[30-tasks/Projektpositionen können abgeschlossen werden|Projektpositionen können abgeschlossen werden]], [[30-tasks/Werkstatt als Systemprojekt aufnehmen|Werkstatt als Systemprojekt aufnehmen]] | `context_role: project` ist nicht passend; Feature-Typ gehoert eher nach `work_kind: feature`, Kontextrolle eher `topic` oder weglassen/neu entscheiden |
| `Bug` | 2 | [[30-tasks/Zeit mit Projekt kann nicht auf Allgemein gebucht werden|Zeit mit Projekt kann nicht auf Allgemein gebucht werden]], [[30-tasks/Zeitzuordnung wird durch Sync zurückgesetzt|Zeitzuordnung wird durch Sync zurückgesetzt]] | Bug-Typ nach `work_kind: bug`, Kontextrolle eher `topic` oder neu entscheiden |
| `Iteration` | 4 | [[40-notes/Backlog|Backlog]], [[40-notes/Iteration 1|Iteration 1]], [[40-notes/Iteration 2|Iteration 2]], [[40-notes/Iteration 3|Iteration 3]] | Iteration ist Komponente `iterdef`; Kontextrolle vermutlich `project` oder `topic` |
| `Meeting` | 1 | [[40-notes/Demo Iteration 2|Demo Iteration 2]] | Meeting-Typ nach `event_kind: meeting`; Kontextrolle vermutlich `project` oder `topic` |
## C4 Base Created Format
Sollformat fuer `base_created` und `base_modified`: `YYYY-MM-DDTHH:mm`. Diese Felder werden von Obsidian automatisch gesetzt.
| Note | Aktuelles Muster | Migration |
| --- | --- | --- |
| [[30-tasks/Liste der Mehraufwände am Projekt|Liste der Mehraufwände am Projekt]] | `2026-06-17 17:22` | Leerzeichen durch `T` ersetzen |
| [[30-tasks/Personalstamm implementieren|Personalstamm implementieren]] | `2026-06-09T14:19:55` | Sekunden entfernen |
| [[30-tasks/Projektpositionen können abgeschlossen werden|Projektpositionen können abgeschlossen werden]] | `2026-06-10 13:13` | Leerzeichen durch `T` ersetzen |
| [[30-tasks/Review erfasster Mehraufwände|Review erfasster Mehraufwände]] | `2026-06-17 15:49` | Leerzeichen durch `T` ersetzen |
| [[40-notes/Backlog|Backlog]] | `2026-06-09 16:59` | Leerzeichen durch `T` ersetzen |
## C5 Iterdef Migration
Sollwerte: `iterdef_status` ist `planned`, `active`, `closed` oder `cancelled`; `iterdef_start` und `iterdef_end` sind reine Datumswerte `YYYY-MM-DD`.
| Note | Befunde | Migration |
| --- | --- | --- |
| [[40-notes/Iteration 1|Iteration 1]] | `completed`, DateTime in Start/Ende, keine `components` | `closed`, Datum kuerzen, `components: [iterdef, contextual]` |
| [[40-notes/Iteration 2|Iteration 2]] | `completed`, DateTime in Start/Ende, keine `components` | `closed`, Datum kuerzen, `components: [iterdef, contextual]` |
| [[40-notes/Iteration 3|Iteration 3]] | `started`, DateTime in Start/Ende, keine `components` | `active`, Datum kuerzen, `components: [iterdef, contextual]` |
| [[40-notes/Backlog|Backlog]] | `iterdef` ohne `contextual` | `components` um `contextual` ergaenzen |
## C6 Root Frontmatter
[[Personal OS|Personal OS]] hat kein Frontmatter. Da Root in `context-hygiene` fachlich ausgenommen ist, sollte hier ein minimales Frontmatter mit `components` und `context_role: root` festgelegt werden oder die Hygiene-Regel muss Root ohne Frontmatter tolerieren.
## Empfohlene Reihenfolge
1. C4 nach Schema-Anpassung neu bewerten und verbleibende Leerzeichen-Datumswerte korrigieren.
2. C1/C2 fuer eindeutige Typen: Contexts, Projects, Iterationen, Backlog.
3. C3 fuer Tasks: alte `Feature`/`Bug`-Rollen in `work_kind` migrieren und passende Kontextrolle entscheiden.
4. C6 Root-Note entscheiden: Frontmatter einfuehren oder Hygiene-Ausnahme erweitern.
+57
View File
@@ -0,0 +1,57 @@
---
components:
- reviewable
review_status: needs_review
review_reason: "Automatisch erzeugter Hygiene-Report"
---
# Hygiene Report
Generated: 2026-06-24T15:08:54.455Z
Checked notes: 29
Errors: 11
Warnings: 26
## Errors
- [[10-contexts/Genius.ceo|Genius.ceo]]: missing required property components
- [[10-contexts/health|health]]: missing required property components
- [[10-contexts/work|work]]: missing required property components
- [[20-projects/Avicenna|Avicenna]]: missing required property components
- [[40-notes/Austausch Dashboard Painpoints|Austausch Dashboard Painpoints]]: / must match "then" schema
- [[40-notes/Austausch Dashboard Painpoints|Austausch Dashboard Painpoints]]: missing required property event_kind
- [[40-notes/Demo Iteration 2|Demo Iteration 2]]: / must match "then" schema
- [[40-notes/Demo Iteration 2|Demo Iteration 2]]: missing required property event_kind
- [[40-notes/Onboarding von Philipp Töbelmann|Onboarding von Philipp Töbelmann]]: / must match "then" schema
- [[40-notes/Onboarding von Philipp Töbelmann|Onboarding von Philipp Töbelmann]]: missing required property event_kind
- [[Personal OS|Personal OS]]: missing frontmatter
## Warnings
- [[00-inbox/Tagesabschluss in der Zeiterfassung ermöglichen|Tagesabschluss in der Zeiterfassung ermöglichen]] `/context_role`: contextual should define context_role
- [[00-inbox/Tagesabschluss in der Zeiterfassung ermöglichen|Tagesabschluss in der Zeiterfassung ermöglichen]] `/iterbind_status`: iterbind should define iterbind_status
- [[10-contexts/Genius.ceo|Genius.ceo]] `/components` `context.required`: note should eventually include component contextual
- [[10-contexts/health|health]] `/components` `context.required`: note should eventually include component contextual
- [[10-contexts/work|work]] `/components` `context.required`: note should eventually include component contextual
- [[20-projects/Avicenna|Avicenna]] `/components` `context.required`: note should eventually include component contextual
- [[30-tasks/Arbeitszeit aufteilen|Arbeitszeit aufteilen]] `/iterbind_status`: iterbind should define iterbind_status
- [[30-tasks/Arbeitszeit Sonstiges nur mit Kommentar|Arbeitszeit Sonstiges nur mit Kommentar]] `/iterbind_status`: iterbind should define iterbind_status
- [[30-tasks/Arbeitszeit taggen|Arbeitszeit taggen]] `/iterbind_status`: iterbind should define iterbind_status
- [[30-tasks/Liste der Mehraufwände am Projekt|Liste der Mehraufwände am Projekt]] `/context_role`: contextual should define context_role
- [[30-tasks/Liste der Mehraufwände am Projekt|Liste der Mehraufwände am Projekt]] `/iterbind_status`: iterbind should define iterbind_status
- [[30-tasks/Passwort ändern|Passwort ändern]] `/iterbind_status`: iterbind should define iterbind_status
- [[30-tasks/Personalstamm implementieren|Personalstamm implementieren]] `/iterbind_status`: iterbind should define iterbind_status
- [[30-tasks/Projektpositionen können abgeschlossen werden|Projektpositionen können abgeschlossen werden]] `/iterbind_status`: iterbind should define iterbind_status
- [[30-tasks/Review erfasster Mehraufwände|Review erfasster Mehraufwände]] `/context_role`: contextual should define context_role
- [[30-tasks/Review erfasster Mehraufwände|Review erfasster Mehraufwände]] `/iterbind_status`: iterbind should define iterbind_status
- [[30-tasks/Werkstatt als Systemprojekt aufnehmen|Werkstatt als Systemprojekt aufnehmen]] `/iterbind_status`: iterbind should define iterbind_status
- [[30-tasks/Zeit mit Projekt kann nicht auf Allgemein gebucht werden|Zeit mit Projekt kann nicht auf Allgemein gebucht werden]] `/iterbind_status`: iterbind should define iterbind_status
- [[30-tasks/Zeitzuordnung wird durch Sync zurückgesetzt|Zeitzuordnung wird durch Sync zurückgesetzt]] `/iterbind_status`: iterbind should define iterbind_status
- [[40-notes/Austausch Dashboard Painpoints|Austausch Dashboard Painpoints]] `/event_status`: event should define event_status
- [[40-notes/Backlog|Backlog]] `/components`: iterdef should also include component contextual
- [[40-notes/Backlog|Backlog]] `/components` `context.required`: note should eventually include component contextual
- [[40-notes/Demo Iteration 2|Demo Iteration 2]] `/event_status`: event should define event_status
- [[40-notes/Onboarding von Philipp Töbelmann|Onboarding von Philipp Töbelmann]] `/components`: event should also include component contextual
- [[40-notes/Onboarding von Philipp Töbelmann|Onboarding von Philipp Töbelmann]] `/event_status`: event should define event_status
- [[40-notes/Onboarding von Philipp Töbelmann|Onboarding von Philipp Töbelmann]] `/components` `context.required`: note should eventually include component contextual
+13
View File
@@ -0,0 +1,13 @@
# Inbox
Entities without a `parent` — captured but not yet assigned to a context or project.
```dataview
TABLE WITHOUT ID
file.link AS "Entity",
status,
dateformat(date(created), "yyyy-MM-dd HH:mm") AS "Captured"
FROM "" AND !"90-dashboards" AND !"_templates"
WHERE !parent OR parent = "" AND !container
SORT created DESC
```
+38
View File
@@ -0,0 +1,38 @@
# Open Tasks
Tasks (signature: has `status`, no `container`) with `status = "open"`, grouped by their immediate parent. Null-parent tasks appear under "Inbox (unassigned)".
```dataviewjs
const ALL = dv.pages('""').where(p =>
p.status === "open" &&
!p.container &&
!p.file.path.startsWith("_templates/")
);
const groups = {};
for (const p of ALL) {
const key = p.parent ? p.parent.path : "__inbox__";
(groups[key] = groups[key] || []).push(p);
}
const renderGroup = (header, items) => {
dv.header(2, header);
dv.table(
["Task", "Captured"],
items
.sort((a, b) => (a.file.name > b.file.name ? 1 : -1))
.map(p => [p.file.link, p.created])
);
};
// Assigned groups, alphabetical by parent basename
for (const key of Object.keys(groups).filter(k => k !== "__inbox__").sort()) {
const header = key.split("/").pop().replace(/\.md$/, "");
renderGroup(header, groups[key]);
}
// Inbox bucket last
if (groups["__inbox__"]) {
renderGroup("Inbox (unassigned)", groups["__inbox__"]);
}
```