docs(genome): Konzept aktualisiert + Mermaid-Diagramme, Inkonsistenzen behoben

- genome-engine.md: Script-Name, Pfade, Scope korrigiert, Mermaid-Visualisierungen
- genome-extract.py: dynamisches Pattern statt hardcoded kotlin-conventions
- SKILL.md: vollständige Dateiliste mit korrekten Pfaden
- genome.prompt.md: Referenz auf Konzept-Dokument korrigiert
This commit is contained in:
Jens Reinemann 2026-05-18 12:16:23 +02:00
parent 7ea7729f96
commit d59663a2fa
4 changed files with 157 additions and 51 deletions

View file

@ -6,7 +6,7 @@ tools: [read, edit, search, execute]
# Genome Engine
> **Skill-Referenz:** Lies `.github/skills/genome/SKILL.md` für das vollständige Konzept.
> **Konzept-Dokument:** `docs/genome-engine.md` · **Skill-Doku:** `.github/skills/genome/SKILL.md`
Du orchestrierst die 3 Phasen der Genome Engine: **Extraction → Distillation → Propagation**.

View file

@ -36,10 +36,14 @@ Der Router-Prompt fragt nach Quell-Repo und Zeitspanne, dann orchestriert er all
## Dateien
| Datei | Zweck |
| ------------------- | --------------------------------------- |
| `SKILL.md` | Diese Dokumentation |
| `genome-extract.py` | Phase 1: Git-Scanning + Trait-Erkennung |
| Datei | Ort | Zweck |
| -------------------------------------------- | ---------------------- | --------------------------------------- |
| `SKILL.md` | `.github/skills/genome/` | Diese Dokumentation |
| `genome-extract.py` | `.github/skills/genome/` | Phase 1: Git-Scanning + Trait-Erkennung |
| `genome.prompt.md` | `.github/prompts/` | Orchestrator (Router für alle 3 Phasen) |
| `genome-distill.prompt.md` | `.github/prompts/` | Phase 2: Klassifizierung + Scoring |
| `genome-propagate.prompt.md` | `.github/prompts/` | Phase 3: Patch-Generierung für Ziel |
| `genome-engine.md` | `docs/` | Vollständiges Konzept-Dokument |
## Trait-Erkennung

View file

@ -27,9 +27,11 @@ GENOME_SCOPES = [
".github/agents/",
".github/prompts/",
".github/copilot-instructions.md",
".github/kotlin-conventions.instructions.md",
]
# Dynamisches Pattern für weitere Instructions-Dateien
INSTRUCTIONS_PATTERN = re.compile(r"^\.github/[^/]+\.instructions\.md$")
MAX_DIFF_LINES = 80
@ -55,6 +57,9 @@ def is_in_genome_scope(filepath: str) -> bool:
else:
if filepath == scope:
return True
# Dynamisch: .github/*.instructions.md
if INSTRUCTIONS_PATTERN.match(filepath):
return True
return False

View file

@ -4,10 +4,32 @@
Automatische Erkennung evolutionärer Verbesserungen an Copilot-Customization-Dateien (Skills, Agents, Prompts, Instructions) über Git-History hinweg. Die erkannten Verbesserungen werden destilliert, bewertet und als Propagation-Vorschläge für andere Projekte bereitgestellt.
```mermaid
graph LR
A[Repo A<br/>Verbesserungen] -->|Git-History| E[Extraction]
E -->|raw-mutations| D[Distillation]
D -->|Growth Vectors| P[Propagation]
P -->|Patches| B[Repo B<br/>aktualisiert]
```
---
## Begriffe
```mermaid
graph TD
G[🧬 Genome<br/>Gesamtheit aller Traits] --> T1[Trait: Skill]
G --> T2[Trait: Agent]
G --> T3[Trait: Prompt]
G --> T4[Trait: Instructions]
T1 -->|Git-Delta| M1[Mutation]
T3 -->|Git-Delta| M2[Mutation]
M1 -->|destilliert| GV1[Growth Vector<br/>Score 8/10 🟡]
M2 -->|destilliert| GV2[Growth Vector<br/>Score 9/10 🔴]
GV1 --> PR[Propagation<br/>Konkrete Patches]
GV2 --> PR
```
| Begriff | Bedeutung |
| ----------------- | ----------------------------------------------------------------------------------------- |
| **Trait** | Ein Skill, Agent, Prompt(-Verbund) oder Instructions-File inkl. aller zugehörigen Dateien |
@ -26,6 +48,7 @@ Folgende Pfade bilden das Genome:
- `.github/agents/**`
- `.github/prompts/**`
- `.github/copilot-instructions.md`
- `.github/*.instructions.md`
---
@ -33,6 +56,17 @@ Folgende Pfade bilden das Genome:
Traits werden aus dem Dateipfad abgeleitet. Die Granularität hängt vom Trait-Typ ab:
```mermaid
graph TD
F[Dateipfad] --> S{Pfad-Pattern?}
S -->|.github/skills/X/...| SK["skill/X"]
S -->|.github/agents/X.agent.md| AG["agent/X"]
S -->|.github/prompts/X.prompt.md| PM{Verbund?}
S -->|.github/*.instructions.md| IN["instructions/X"]
PM -->|"X-*.prompt.md existiert"| VB["prompt/X<br/>(Verbund)"]
PM -->|Keine Sub-Prompts| SA["prompt/X<br/>(Standalone)"]
```
### Skills
Ein Skill besteht aus einem Ordner mit mehreren zusammengehörigen Dateien (SKILL.md, Scripte, Templates). Der **Ordnername** ist der Trait-Schlüssel.
@ -69,7 +103,6 @@ Einzeldateien ohne Router-Beziehung. Der **Dateiname** ist der Trait-Schlüssel.
.github/prompts/commit.prompt.md → trait: prompt/commit
.github/prompts/ship.prompt.md → trait: prompt/ship
.github/prompts/publish.prompt.md → trait: prompt/publish
.github/prompts/clean.prompt.md → trait: prompt/clean
```
**Regel:** `prompt/<dateiname-ohne-extension>` 1:1-Zuordnung Datei → Trait.
@ -81,25 +114,19 @@ Wenn eine Prompt-Datei eine Routing-Tabelle mit Verweisen auf andere `.prompt.md
```
.github/prompts/nextstep.prompt.md → trait: prompt/nextstep
.github/prompts/nextstep-implementation.prompt.md → trait: prompt/nextstep
.github/prompts/nextstep-infrastructure.prompt.md → trait: prompt/nextstep
.github/prompts/nextstep-planning.prompt.md → trait: prompt/nextstep
.github/prompts/nextstep-block-planning.prompt.md → trait: prompt/nextstep
.github/prompts/nextstep-tech-decision.prompt.md → trait: prompt/nextstep
.github/prompts/nextstep-test.prompt.md → trait: prompt/nextstep
```
**Regel:** `prompt/<router-name>` Router (`<name>.prompt.md`) + alle `<name>-*.prompt.md`-Dateien gehören zum selben Trait.
**Begründung:** Der gesamte Workflow (Router + Sub-Prompts) ist semantisch eine Einheit (~300 Zeilen). Ein neuer Sub-Workflow ist nur im Kontext des Routers sinnvoll. Bei Propagation muss der Agent immer Router + Sub-Prompts zusammen betrachten.
**Verbund-Erkennung (Namenskonvention):** Eine Datei `<name>.prompt.md` ist ein Router, wenn Dateien `<name>-*.prompt.md` im selben Verzeichnis existieren. Alle `<name>-*.prompt.md`-Dateien gehören zum selben Verbund-Trait.
**Verbund-Erkennung:** Eine Datei `<name>.prompt.md` ist ein Router, wenn Dateien `<name>-*.prompt.md` im selben Verzeichnis existieren. Alle gehören zum selben Verbund-Trait.
### Instructions
Instructions-Dateien sind Einzeldateien. Der **Dateiname** ist der Trait-Schlüssel.
```
.github/copilot-instructions.md → trait: instructions/copilot-instructions
.github/copilot-instructions.md → trait: instructions/copilot-instructions
.github/kotlin-conventions.instructions.md → trait: instructions/kotlin-conventions
```
**Regel:** `instructions/<dateiname-ohne-extension>` 1:1-Zuordnung Datei → Trait.
@ -108,41 +135,69 @@ Instructions-Dateien sind Einzeldateien. Der **Dateiname** ist der Trait-Schlüs
## Mutation-Typen
Jede Mutation wird mit einem Typ klassifiziert:
| Typ | Bedeutung | Beispiel |
| ---------------- | ------------------------------------ | ------------------------------------------------------------ |
| `content-change` | Inhalt einer Datei im Trait geändert | `nextstep-implementation.prompt.md` optimiert |
| `member-added` | Neue Datei zum Trait hinzugefügt | Neuer `nextstep-migration.prompt.md` + Router-Eintrag |
| `member-removed` | Datei aus dem Trait entfernt | `nextstep-test.prompt.md` gelöscht + Router-Eintrag entfernt |
Bei **Verbund-Traits** umfasst `member-added`/`member-removed` immer die betroffene Sub-Datei **und** die Router-Anpassung als zusammenhängende Mutation. Bei **Standalone-Traits** und **Skills** entspricht `member-added` dem Anlegen einer neuen Datei im Trait-Ordner.
| Typ | Bedeutung | Beispiel |
| ---------------- | ------------------------------------ | ----------------------------------------------------- |
| `content-change` | Inhalt einer Datei im Trait geändert | `nextstep-implementation.prompt.md` optimiert |
| `member-added` | Neue Datei zum Trait hinzugefügt | Neuer `nextstep-migration.prompt.md` + Router-Eintrag |
| `member-removed` | Datei aus dem Trait entfernt | `nextstep-test.prompt.md` gelöscht |
---
## Pipeline
```mermaid
flowchart LR
subgraph "Phase 1: Extraction"
direction TB
GIT[(Git-History)] --> SCRIPT[genome-extract.py]
SCRIPT --> RAW[raw-mutations.md]
end
subgraph "Phase 2: Distillation"
direction TB
RAW2[raw-mutations.md] --> AGENT1[KI-Agent]
AGENT1 --> |"Klassifizieren\nScoren\nSanitizen"| DIST[distilled-mutations.md]
end
subgraph "Phase 3: Propagation"
direction TB
DIST2[distilled-mutations.md] --> AGENT2[KI-Agent]
ZIEL[Ziel-Genome] --> AGENT2
AGENT2 --> PATCHES[Konkrete Patches]
end
RAW --> RAW2
DIST --> DIST2
```
### Phase 1: Extraction (Script)
**Input:** Repo-Pfad + Zeitspanne (z.B. `--since "4 days ago"`)
**Input:** Repo-Pfad + Zeitspanne (z.B. `--since "7 days ago"`)
**Output:** `raw-mutations.md`
- Scannt `git log` für Änderungen im Genome-Scope
- Gruppiert Diffs nach Trait (siehe Trait-Erkennung oben)
- Gibt pro Trait alle Commits mit Diff, Message und Autor aus
**Tool:** `genome-extract.ps1`
**Tool:** `genome-extract.py` (Python)
### Phase 2: Distillation (Agent)
**Input:** `raw-mutations.md`
**Output:** `distilled-mutations.md`
- Klassifiziert jede Mutation:
- 🔴 **Critical** Bugfixes, die andere auch treffen
- 🟡 **Evolution** Generelle Verbesserungen (bessere Prompts, neue Patterns)
- ⚪ **Specialized** Projektspezifisch, nicht übertragbar
- Scored jede Mutation (110)
```mermaid
flowchart TD
M[Mutation] --> K{Klassifizierung}
K -->|Bugfix für alle| C[🔴 Critical]
K -->|Generelle Verbesserung| E[🟡 Evolution]
K -->|Nur dieses Projekt| S[⚪ Specialized]
C --> SC[Score 110]
E --> SC
S --> X[❌ Entfernt]
SC --> SAN[Sanitization<br/>Pfade, Tokens, IDs ersetzen]
SAN --> |Score ≥ 4| OUT[→ distilled-mutations.md]
SAN --> |Score < 4| X
```
- Scored jede Mutation (110) nach Übertragungswert
- Filtert sensitive Daten (Usernames, Maschinenpfade, Tokens, projektspezifische IDs)
- Specialized Mutations werden komplett entfernt
@ -150,17 +205,19 @@ Bei **Verbund-Traits** umfasst `member-added`/`member-removed` immer die betroff
### Phase 3: Propagation (Agent)
**Input:** `distilled-mutations.md` + Ziel-Genome (`.github/` des Ziel-Repos)
**Input:** `distilled-mutations.md` + Ziel-Genome
**Output:** `propagation-proposals.md`
- Matched Traits zwischen Quell- und Ziel-Genome
- Erstellt konkrete Änderungsvorschläge pro Trait
- Formatiert als Checkliste:
- `[x]` Critical (default an)
- `[x]` Evolution mit Score ≥ 7 (default an)
- `[ ]` Evolution mit Score < 7 (default aus)
- Specialized taucht nicht auf (bereits gefiltert)
- User wählt aus, Agent wendet ausgewählte Patches an
- Formatiert als Checkliste mit Default-Auswahl:
| Kategorie | Default | Bedingung |
| ------------------ | ------- | ---------- |
| 🔴 Critical | ✅ an | immer |
| 🟡 Evolution ≥ 7 | ✅ an | Score ≥ 7 |
| 🟡 Evolution < 7 | aus | Score < 7 |
| ⚪ Specialized | — | gefiltert |
**Tool:** `genome-propagate.prompt.md`
@ -168,26 +225,66 @@ Bei **Verbund-Traits** umfasst `member-added`/`member-removed` immer die betroff
## Zeitbasierte Transferlogik
Die Zeitspanne bestimmt, welche Mutations extrahiert werden:
```mermaid
sequenceDiagram
participant R as Quell-Repo
participant T as Ziel-Repo
Note over T: Letzter .github/-Commit = T_target
R->>R: git log --since T_target
R->>R: 12 Commits an .github/ gefunden
R-->>T: Mutations extrahiert → Distillation → Propagation
```
1. Letzter `.github/`-Commit im Ziel-Repo ermitteln → `T_target`
2. Alle `.github/`-Commits im Quell-Repo seit `T_target` extrahieren
3. Das Delta zwischen `T_target` und jetzt ist der Evolutionszeitraum
**Beispiel:** bollwerk hat `.github/` zuletzt vor 4 Tagen von hva übernommen. Seitdem gab es 12 Commits an `.github/` in bollwerk. Diese 12 Commits sind die Mutations.
---
## Deliverables
## Dateistruktur
| # | Datei | Typ | Ort |
| --- | ---------------------------- | ----------------- | ------------------------ |
| 1 | `genome-extract.ps1` | PowerShell Script | `.github/genome/` |
| 2 | `genome-distill.prompt.md` | Prompt | `.github/genome/` |
| 3 | `genome-propagate.prompt.md` | Prompt | `.github/genome/` |
| 4 | `raw-mutations.md` | Generiert | `.github/genome/output/` |
| 5 | `distilled-mutations.md` | Generiert | `.github/genome/output/` |
| 6 | `propagation-proposals.md` | Generiert | `.github/genome/output/` |
```mermaid
graph TD
subgraph ".github/skills/genome/"
SK[SKILL.md<br/>Skill-Dokumentation]
EX[genome-extract.py<br/>Phase 1 Script]
end
subgraph ".github/prompts/"
OR[genome.prompt.md<br/>Orchestrator]
DI[genome-distill.prompt.md<br/>Phase 2]
PR[genome-propagate.prompt.md<br/>Phase 3]
end
subgraph ".github/genome/output/"
RM[raw-mutations.md<br/>generiert]
DM[distilled-mutations.md<br/>generiert]
PP[propagation-proposals.md<br/>generiert]
end
subgraph "docs/"
CO[genome-engine.md<br/>Dieses Konzept]
end
OR -->|"ruft auf"| EX
OR -->|"delegiert an"| DI
OR -->|"delegiert an"| PR
EX -->|"schreibt"| RM
DI -->|"liest"| RM
DI -->|"schreibt"| DM
PR -->|"liest"| DM
PR -->|"schreibt"| PP
```
| # | Datei | Typ | Ort |
| --- | ---------------------------- | ------------- | -------------------------- |
| 1 | `genome-extract.py` | Python Script | `.github/skills/genome/` |
| 2 | `genome.prompt.md` | Orchestrator | `.github/prompts/` |
| 3 | `genome-distill.prompt.md` | Prompt | `.github/prompts/` |
| 4 | `genome-propagate.prompt.md` | Prompt | `.github/prompts/` |
| 5 | `SKILL.md` | Skill-Doku | `.github/skills/genome/` |
| 6 | `genome-engine.md` | Konzept | `docs/` |
| 7 | `raw-mutations.md` | Generiert | `.github/genome/output/` |
| 8 | `distilled-mutations.md` | Generiert | `.github/genome/output/` |
| 9 | `propagation-proposals.md` | Generiert | `.github/genome/output/` |
> Generierte Dateien (79) sind gitignored.
---