import vault
This commit is contained in:
@@ -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 ?? ""])
|
||||
);
|
||||
}
|
||||
```
|
||||
@@ -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.
|
||||
@@ -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
|
||||
@@ -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
|
||||
```
|
||||
@@ -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__"]);
|
||||
}
|
||||
```
|
||||
Reference in New Issue
Block a user