Migrate all repos into monorepo context folders
Bahn: aisupport, Analyse-O2C-C2S, awesome-bahn-mcp-servers, beam-mcp,
Confluence_Bot, db-planet-mcp-server, O2C-Harness, project-audit,
Projekt-KIQ-HP, teamlandkarte-mcp
Dhive: Jury-Voting
Privat: CV, NoteGraph (NOTE: NoteGraph needs complete redo after consolidation)
Shared: AI-Orchestrator, OrgMyLife, power_skills_and_more
Shared/references: symphony (read-only)
Bahn repos remain available as independent remotes - this monorepo
pulls them in via subtree, the originals are untouched.
This commit is contained in:
@@ -0,0 +1 @@
|
||||
{"specId": "2a1dd5ab-86c0-4f0f-b8fd-2c6e916fe712", "workflowType": "requirements-first", "specType": "feature"}
|
||||
@@ -0,0 +1,414 @@
|
||||
# Design Document: LinkedIn-Profil-Revamp
|
||||
|
||||
## Overview
|
||||
|
||||
Dieses Design beschreibt die technische Umsetzung eines neuen Kiro Skills `linkedin-profile` zur automatisierten Generierung und Optimierung von LinkedIn-Profilinhalten aus der bestehenden Knowledge Base. Der Skill erzeugt optimierte Texte für Headline, About-Section und Experience-Beschreibungen, generiert eine Content-Strategie und implementiert ein Tracking-System für LinkedIn-Metriken.
|
||||
|
||||
### Design-Entscheidungen
|
||||
|
||||
1. **Neuer Kiro Skill statt Standalone-Script** — Folgt dem etablierten Muster der bestehenden Skills (consultant-profile, cv-generate, talk-intro). Ermöglicht interaktive Nutzung und iterative Verfeinerung.
|
||||
2. **KB als Single Source of Truth** — Alle LinkedIn-Inhalte werden aus den bestehenden YAML-Entities generiert. Keine Duplizierung von Daten.
|
||||
3. **Tracking als YAML-Entity** — LinkedIn-Metriken werden als neue Entity-Kategorie `kb/tracking/` gespeichert, konsistent mit dem bestehenden Datenmodell.
|
||||
4. **Markdown-Output mit strukturierten Sektionen** — Output-Dateien enthalten alle generierten Profilsektionen in einem einzigen Dokument, analog zum Talk-Intro-Skill.
|
||||
5. **Constraint-Validierung zur Generierungszeit** — Zeichenlimits (220 für Headline, 2.600 für About) werden programmatisch validiert, nicht nur als Richtlinie.
|
||||
6. **Content-Strategie als Template** — Die Content-Strategie wird als wiederverwendbares Template generiert, das quartalsweise aktualisiert werden kann.
|
||||
|
||||
## Architecture
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
subgraph "Knowledge Base (kb/)"
|
||||
Profile[profiles/andre-knie.yaml]
|
||||
Experiences[experiences/*.yaml]
|
||||
Skills[skills/*.yaml]
|
||||
Projects[projects/*.yaml]
|
||||
Orgs[organizations/*.yaml]
|
||||
Tracking[tracking/*.yaml]
|
||||
end
|
||||
|
||||
subgraph "Kiro Skill (.kiro/skills/linkedin-profile/)"
|
||||
SkillMD[SKILL.md]
|
||||
end
|
||||
|
||||
subgraph "Source Modules (src/linkedin/)"
|
||||
HeadlineGen[headline-generator.ts]
|
||||
AboutGen[about-generator.ts]
|
||||
ExperienceGen[experience-generator.ts]
|
||||
ContentStrategy[content-strategy.ts]
|
||||
TrackingMgr[tracking-manager.ts]
|
||||
Constraints[constraints.ts]
|
||||
end
|
||||
|
||||
subgraph "Shared Modules (src/)"
|
||||
Validate[schemas/validate.ts]
|
||||
Types[schemas/types.ts]
|
||||
YamlUtils[io/yaml-utils.ts]
|
||||
EntityFiles[io/entity-files.ts]
|
||||
end
|
||||
|
||||
subgraph "Output (output/linkedin/)"
|
||||
ProfileDoc[profile-optimized.md]
|
||||
StrategyDoc[content-strategy.md]
|
||||
TrackingReport[tracking-report.md]
|
||||
end
|
||||
|
||||
SkillMD -->|orchestrates| HeadlineGen
|
||||
SkillMD -->|orchestrates| AboutGen
|
||||
SkillMD -->|orchestrates| ExperienceGen
|
||||
SkillMD -->|orchestrates| ContentStrategy
|
||||
SkillMD -->|orchestrates| TrackingMgr
|
||||
|
||||
HeadlineGen -->|reads| Profile
|
||||
HeadlineGen -->|reads| Experiences
|
||||
AboutGen -->|reads| Profile
|
||||
AboutGen -->|reads| Projects
|
||||
ExperienceGen -->|reads| Experiences
|
||||
ExperienceGen -->|reads| Skills
|
||||
ExperienceGen -->|reads| Projects
|
||||
ContentStrategy -->|reads| Profile
|
||||
TrackingMgr -->|reads/writes| Tracking
|
||||
|
||||
HeadlineGen -->|validates| Constraints
|
||||
AboutGen -->|validates| Constraints
|
||||
ExperienceGen -->|validates| Constraints
|
||||
|
||||
HeadlineGen -->|uses| EntityFiles
|
||||
AboutGen -->|uses| EntityFiles
|
||||
ExperienceGen -->|uses| EntityFiles
|
||||
TrackingMgr -->|uses| YamlUtils
|
||||
|
||||
HeadlineGen -->|writes| ProfileDoc
|
||||
AboutGen -->|writes| ProfileDoc
|
||||
ExperienceGen -->|writes| ProfileDoc
|
||||
ContentStrategy -->|writes| StrategyDoc
|
||||
TrackingMgr -->|writes| TrackingReport
|
||||
```
|
||||
|
||||
### Komponenten-Interaktionsfluss
|
||||
|
||||
1. **Profil-Generierung**: User aktiviert Skill → Skill liest KB-Entities → generiert optimierte Texte → validiert Constraints → schreibt Output
|
||||
2. **Content-Strategie**: User fordert Strategie an → Skill analysiert Profil und Themen → generiert Redaktionsplan → schreibt Template
|
||||
3. **Tracking**: User gibt Metriken ein → Skill speichert als YAML → berechnet Trends → generiert Report
|
||||
|
||||
## Components and Interfaces
|
||||
|
||||
### 1. LinkedIn Profile Skill (`.kiro/skills/linkedin-profile/`)
|
||||
|
||||
Orchestriert die gesamte LinkedIn-Optimierung als Kiro Skill.
|
||||
|
||||
**Interface**: Manuell aktiviert durch User-Request.
|
||||
|
||||
**Verantwortlichkeiten**:
|
||||
- Koordination der Generierungsmodule
|
||||
- Interaktive Verfeinerung mit dem User
|
||||
- Output-Management
|
||||
|
||||
### 2. Headline Generator (`src/linkedin/headline-generator.ts`)
|
||||
|
||||
Generiert optimierte LinkedIn-Headlines aus KB-Daten.
|
||||
|
||||
**Interface**:
|
||||
```typescript
|
||||
interface HeadlineOptions {
|
||||
personId: string;
|
||||
emphasis?: 'dual-role' | 'ai-expert' | 'leadership';
|
||||
variants?: number; // default: 3
|
||||
}
|
||||
|
||||
function generateHeadlines(options: HeadlineOptions): HeadlineResult;
|
||||
|
||||
interface HeadlineResult {
|
||||
variants: HeadlineVariant[];
|
||||
validation: ConstraintValidation;
|
||||
}
|
||||
|
||||
interface HeadlineVariant {
|
||||
text: string;
|
||||
charCount: number;
|
||||
keywords: string[];
|
||||
roles: string[];
|
||||
}
|
||||
```
|
||||
|
||||
**Constraints**:
|
||||
- Max 220 Zeichen
|
||||
- Muss beide Rollen enthalten (DB InfraGO + Data Hive Cassel)
|
||||
- Kein Fachjargon
|
||||
- Mindestens ein differenzierendes Element
|
||||
|
||||
### 3. About Section Generator (`src/linkedin/about-generator.ts`)
|
||||
|
||||
Generiert die About-Section mit Hook, Story und CTA.
|
||||
|
||||
**Interface**:
|
||||
```typescript
|
||||
interface AboutOptions {
|
||||
personId: string;
|
||||
tone?: 'nahbar' | 'fachlich' | 'inspirierend';
|
||||
includeStats?: boolean; // default: true
|
||||
}
|
||||
|
||||
function generateAbout(options: AboutOptions): AboutResult;
|
||||
|
||||
interface AboutResult {
|
||||
fullText: string;
|
||||
charCount: number;
|
||||
hookPreview: string; // erste 2 Zeilen (vor "mehr anzeigen")
|
||||
sections: {
|
||||
hook: string;
|
||||
mission: string;
|
||||
expertise: string;
|
||||
cta: string;
|
||||
};
|
||||
validation: ConstraintValidation;
|
||||
}
|
||||
```
|
||||
|
||||
**Constraints**:
|
||||
- Max 2.600 Zeichen
|
||||
- Hook in ersten 2 Zeilen sichtbar
|
||||
- Drei Kernthemen benannt
|
||||
- Konkrete Belege enthalten
|
||||
- CTA am Ende
|
||||
|
||||
### 4. Experience Generator (`src/linkedin/experience-generator.ts`)
|
||||
|
||||
Generiert wirkungsorientierte Experience-Beschreibungen.
|
||||
|
||||
**Interface**:
|
||||
```typescript
|
||||
interface ExperienceOptions {
|
||||
personId: string;
|
||||
experienceIds?: string[]; // specific experiences, or all if omitted
|
||||
keywords?: string[]; // SEO keywords to include
|
||||
}
|
||||
|
||||
function generateExperiences(options: ExperienceOptions): ExperienceResult[];
|
||||
|
||||
interface ExperienceResult {
|
||||
experienceId: string;
|
||||
title: string;
|
||||
organization: string;
|
||||
description: string;
|
||||
keywords: string[];
|
||||
achievements: string[];
|
||||
validation: ConstraintValidation;
|
||||
}
|
||||
```
|
||||
|
||||
**Constraints**:
|
||||
- Ergebnisse statt Aufgaben
|
||||
- Relevante Keywords für LinkedIn-Suche
|
||||
- Messbare Erfolge wo vorhanden
|
||||
|
||||
### 5. Content Strategy Generator (`src/linkedin/content-strategy.ts`)
|
||||
|
||||
Generiert einen strukturierten Content-Plan.
|
||||
|
||||
**Interface**:
|
||||
```typescript
|
||||
interface ContentStrategyOptions {
|
||||
personId: string;
|
||||
quarter: string; // e.g., "2026-Q3"
|
||||
existingFormats?: string[]; // podcast, column, etc.
|
||||
}
|
||||
|
||||
function generateContentStrategy(options: ContentStrategyOptions): ContentStrategy;
|
||||
|
||||
interface ContentStrategy {
|
||||
postingFrequency: string;
|
||||
themeCluster: ThemeCluster[];
|
||||
weeklyPlan: WeeklySlot[];
|
||||
engagementRoutine: EngagementRoutine;
|
||||
formatMix: FormatMix;
|
||||
}
|
||||
```
|
||||
|
||||
### 6. Tracking Manager (`src/linkedin/tracking-manager.ts`)
|
||||
|
||||
Verwaltet LinkedIn-Metriken als YAML-Entities.
|
||||
|
||||
**Interface**:
|
||||
```typescript
|
||||
interface TrackingEntry {
|
||||
id: string;
|
||||
type: 'linkedin-tracking';
|
||||
date: string; // ISO date
|
||||
metrics: {
|
||||
profileViews: number;
|
||||
searchAppearances: number;
|
||||
connectionRequests: number;
|
||||
postImpressions?: number;
|
||||
engagementRate?: number;
|
||||
comments?: number;
|
||||
reposts?: number;
|
||||
};
|
||||
posts?: PostMetric[];
|
||||
}
|
||||
|
||||
interface PostMetric {
|
||||
title: string;
|
||||
date: string;
|
||||
format: 'text' | 'carousel' | 'video' | 'newsletter';
|
||||
impressions: number;
|
||||
engagementRate: number;
|
||||
comments: number;
|
||||
reposts: number;
|
||||
isBestPractice?: boolean;
|
||||
}
|
||||
|
||||
function addTrackingEntry(entry: TrackingEntry): void;
|
||||
function getWeeklyReport(weekOf: string): WeeklyReport;
|
||||
function getMonthlyTrend(month: string): MonthlyTrend;
|
||||
```
|
||||
|
||||
### 7. Constraint Validator (`src/linkedin/constraints.ts`)
|
||||
|
||||
Validiert LinkedIn-spezifische Constraints.
|
||||
|
||||
**Interface**:
|
||||
```typescript
|
||||
interface ConstraintValidation {
|
||||
valid: boolean;
|
||||
errors: ConstraintError[];
|
||||
warnings: ConstraintWarning[];
|
||||
}
|
||||
|
||||
interface ConstraintError {
|
||||
field: string;
|
||||
constraint: string;
|
||||
actual: string | number;
|
||||
limit: string | number;
|
||||
}
|
||||
|
||||
function validateHeadline(text: string): ConstraintValidation;
|
||||
function validateAbout(text: string): ConstraintValidation;
|
||||
function validateExperience(text: string): ConstraintValidation;
|
||||
```
|
||||
|
||||
## Data Models
|
||||
|
||||
### LinkedIn Tracking Entity (`kb/tracking/<date>.yaml`)
|
||||
|
||||
```yaml
|
||||
id: linkedin-2026-w28
|
||||
type: linkedin-tracking
|
||||
created: 2026-07-13
|
||||
modified: 2026-07-13
|
||||
|
||||
date: 2026-07-13
|
||||
period: weekly
|
||||
|
||||
metrics:
|
||||
profile-views: 142
|
||||
search-appearances: 38
|
||||
connection-requests: 12
|
||||
post-impressions: 4500
|
||||
engagement-rate: 4.2
|
||||
comments: 23
|
||||
reposts: 8
|
||||
|
||||
posts:
|
||||
- title: "KI in der Bahn — was wirklich funktioniert"
|
||||
date: 2026-07-10
|
||||
format: text
|
||||
impressions: 2100
|
||||
engagement-rate: 5.1
|
||||
comments: 14
|
||||
reposts: 5
|
||||
is-best-practice: true
|
||||
- title: "Carousel: 5 Fehler bei der KI-Einführung"
|
||||
date: 2026-07-12
|
||||
format: carousel
|
||||
impressions: 2400
|
||||
engagement-rate: 3.8
|
||||
comments: 9
|
||||
reposts: 3
|
||||
is-best-practice: false
|
||||
```
|
||||
|
||||
### LinkedIn Profile Output (`output/linkedin/profile-optimized.md`)
|
||||
|
||||
```markdown
|
||||
# LinkedIn-Profil — Dr. Andre Knie
|
||||
Generated: 2026-07-13
|
||||
|
||||
## Headline (Variante 1)
|
||||
[Generated headline text]
|
||||
|
||||
## Headline (Variante 2)
|
||||
[Generated headline text]
|
||||
|
||||
## About Section
|
||||
[Generated about text]
|
||||
|
||||
## Experience: Experte für Digitalisierung — DB InfraGO
|
||||
[Generated experience description]
|
||||
|
||||
## Experience: Gründer & Geschäftsführer — Data Hive Cassel
|
||||
[Generated experience description]
|
||||
|
||||
...
|
||||
```
|
||||
|
||||
### Content Strategy Output (`output/linkedin/content-strategy.md`)
|
||||
|
||||
```markdown
|
||||
# Content-Strategie LinkedIn — Q3 2026
|
||||
Generated: 2026-07-13
|
||||
|
||||
## Posting-Frequenz
|
||||
2 Beiträge pro Woche (Di + Do)
|
||||
|
||||
## Themen-Cluster
|
||||
1. Innovation & Technologie (40%)
|
||||
2. Mensch & Kultur (35%)
|
||||
3. Verantwortung (25%)
|
||||
|
||||
## Wochenplan
|
||||
...
|
||||
|
||||
## Engagement-Routine
|
||||
...
|
||||
|
||||
## Format-Mix
|
||||
...
|
||||
```
|
||||
|
||||
### Erweiterung Graph Index
|
||||
|
||||
```yaml
|
||||
# Neue Entity-Typen in graph-index.yaml
|
||||
entities:
|
||||
- id: linkedin-2026-w28
|
||||
type: linkedin-tracking
|
||||
name: LinkedIn Tracking KW28 2026
|
||||
```
|
||||
|
||||
### Directory Structure (Erweiterungen)
|
||||
|
||||
```
|
||||
project-root/
|
||||
├── kb/
|
||||
│ └── tracking/ # NEU: LinkedIn-Metriken
|
||||
│ ├── linkedin-2026-w28.yaml
|
||||
│ └── linkedin-2026-w29.yaml
|
||||
├── src/
|
||||
│ └── linkedin/ # NEU: LinkedIn-Module
|
||||
│ ├── headline-generator.ts
|
||||
│ ├── about-generator.ts
|
||||
│ ├── experience-generator.ts
|
||||
│ ├── content-strategy.ts
|
||||
│ ├── tracking-manager.ts
|
||||
│ ├── constraints.ts
|
||||
│ └── linkedin.test.ts
|
||||
├── output/
|
||||
│ └── linkedin/ # NEU: LinkedIn-Outputs
|
||||
│ ├── profile-optimized.md
|
||||
│ ├── content-strategy.md
|
||||
│ └── tracking-report.md
|
||||
└── .kiro/
|
||||
└── skills/
|
||||
└── linkedin-profile/ # NEU: LinkedIn Skill
|
||||
└── SKILL.md
|
||||
```
|
||||
@@ -0,0 +1,136 @@
|
||||
# Requirements Document — LinkedIn-Profil-Revamp
|
||||
|
||||
## Einleitung
|
||||
|
||||
Dieses Dokument beschreibt die Anforderungen für die Überarbeitung des LinkedIn-Profils von Dr. Andre Knie. Ziel ist eine konsistente, professionelle und wirkungsvolle Präsenz, die seine Doppelrolle als Digitalisierungsexperte bei DB InfraGO und Gründer/Geschäftsführer von Data Hive Cassel widerspiegelt. Das Profil soll seine Expertise in KI, Change Management und Führung klar kommunizieren und ihn als Thought Leader im DACH-Raum positionieren.
|
||||
|
||||
## Glossar
|
||||
|
||||
- **Profil**: Das LinkedIn-Profil von Dr. Andre Knie (https://www.linkedin.com/in/knie)
|
||||
- **Headline**: Die Überschrift direkt unter dem Namen auf LinkedIn (max. 220 Zeichen)
|
||||
- **About_Section**: Der "Info"-Bereich des LinkedIn-Profils (max. 2.600 Zeichen)
|
||||
- **Featured_Section**: Der "Im Fokus"-Bereich für angeheftete Inhalte
|
||||
- **Experience_Section**: Der "Berufserfahrung"-Bereich mit Rollenbeschreibungen
|
||||
- **Content_Strategie**: Der Plan für regelmäßige Beiträge und Interaktionen
|
||||
- **Personal_Brand**: Die konsistente Außenwahrnehmung über alle Kanäle hinweg
|
||||
- **Zielgruppe**: Die primären Adressaten der LinkedIn-Aktivitäten
|
||||
- **Tracking_System**: Das System zur Erfassung und Auswertung von LinkedIn-Metriken
|
||||
- **KPI**: Key Performance Indicator — eine messbare Kennzahl zur Erfolgsbewertung
|
||||
|
||||
## Requirements
|
||||
|
||||
### Requirement 1: Profil-Headline
|
||||
|
||||
**User Story:** Als LinkedIn-Nutzer möchte ich eine prägnante Headline haben, damit Besucher sofort verstehen, wofür ich stehe und welchen Mehrwert ich biete.
|
||||
|
||||
#### Acceptance Criteria
|
||||
|
||||
1. THE Headline SHALL kommunizieren, dass Dr. Andre Knie an der Schnittstelle von KI, Digitalisierung und Führung arbeitet
|
||||
2. THE Headline SHALL beide Rollen (DB InfraGO und Data Hive Cassel) erkennbar machen
|
||||
3. THE Headline SHALL maximal 220 Zeichen umfassen
|
||||
4. THE Headline SHALL mindestens ein differenzierendes Element enthalten, das Neugier weckt
|
||||
5. THE Headline SHALL ohne Fachjargon für ein breites Business-Publikum verständlich sein
|
||||
|
||||
### Requirement 2: About-Section
|
||||
|
||||
**User Story:** Als LinkedIn-Nutzer möchte ich eine überzeugende About-Section haben, damit Besucher meine Geschichte, Motivation und Expertise verstehen und zum Vernetzen motiviert werden.
|
||||
|
||||
#### Acceptance Criteria
|
||||
|
||||
1. THE About_Section SHALL mit einem aufmerksamkeitsstarken Einstieg beginnen, der in den ersten zwei Zeilen (vor "mehr anzeigen") sichtbar ist
|
||||
2. THE About_Section SHALL die persönliche Mission kommunizieren: Angst vor Technologie und Veränderung überwinden und echten Mehrwert schaffen
|
||||
3. THE About_Section SHALL die drei Kernthemen (Innovation/Technologie, Mensch/Kultur, Verantwortung) klar benennen
|
||||
4. THE About_Section SHALL konkrete Belege für Expertise enthalten (60+ Publikationen, 13+ Jahre KI-Erfahrung, 50+ Projekte)
|
||||
5. THE About_Section SHALL maximal 2.600 Zeichen umfassen
|
||||
6. THE About_Section SHALL einen klaren Call-to-Action am Ende enthalten
|
||||
7. THE About_Section SHALL in einem authentischen, nahbaren Ton verfasst sein
|
||||
|
||||
### Requirement 3: Experience-Beschreibungen
|
||||
|
||||
**User Story:** Als LinkedIn-Nutzer möchte ich aussagekräftige Beschreibungen meiner Berufserfahrungen haben, damit Besucher den Wert und die Wirkung meiner Arbeit nachvollziehen können.
|
||||
|
||||
#### Acceptance Criteria
|
||||
|
||||
1. WHEN eine Experience-Beschreibung erstellt wird, THE Experience_Section SHALL konkrete Ergebnisse und Wirkung statt Aufgabenbeschreibungen enthalten
|
||||
2. WHEN eine Experience-Beschreibung erstellt wird, THE Experience_Section SHALL relevante Keywords für die LinkedIn-Suche enthalten
|
||||
3. THE Experience_Section SHALL die aktuelle Rolle bei DB InfraGO als primäre Position darstellen
|
||||
4. THE Experience_Section SHALL die Gründerrolle bei Data Hive Cassel mit messbaren Erfolgen beschreiben (50+ Projekte, 15+ Kunden, ROI über 2)
|
||||
5. THE Experience_Section SHALL das JobSharing-Experiment bei DB Netz als Innovation in Führung hervorheben
|
||||
6. THE Experience_Section SHALL die akademische Laufbahn (Promotion, Dozent) als Fundament für die KI-Expertise positionieren
|
||||
|
||||
### Requirement 4: Featured-Section-Strategie
|
||||
|
||||
**User Story:** Als LinkedIn-Nutzer möchte ich eine kuratierte Featured-Section haben, damit Besucher sofort meine besten Inhalte und Referenzen sehen.
|
||||
|
||||
#### Acceptance Criteria
|
||||
|
||||
1. THE Featured_Section SHALL maximal 5 Elemente enthalten, um Fokus zu gewährleisten
|
||||
2. THE Featured_Section SHALL mindestens einen Inhalt pro Kernthema (KI/Technologie, Mensch/Kultur, Verantwortung) enthalten
|
||||
3. THE Featured_Section SHALL regelmäßig (mindestens quartalsweise) aktualisiert werden
|
||||
4. WHEN ein neuer hochperformanter Beitrag veröffentlicht wird, THE Featured_Section SHALL geprüft und bei Bedarf aktualisiert werden
|
||||
5. THE Featured_Section SHALL eine Mischung aus Formaten enthalten (Beiträge, externe Links, Dokumente)
|
||||
|
||||
### Requirement 5: Content-Strategie
|
||||
|
||||
**User Story:** Als LinkedIn-Nutzer möchte ich eine konsistente Content-Strategie haben, damit ich regelmäßig Sichtbarkeit aufbaue und als Thought Leader wahrgenommen werde.
|
||||
|
||||
#### Acceptance Criteria
|
||||
|
||||
1. THE Content_Strategie SHALL eine Posting-Frequenz von mindestens 2 Beiträgen pro Woche vorsehen
|
||||
2. THE Content_Strategie SHALL die drei Kernthemen (Innovation/Technologie, Mensch/Kultur, Verantwortung) abdecken
|
||||
3. THE Content_Strategie SHALL bestehende Formate (Podcast "Almost Intelligent", Kolumne "Kniepunkt") als Content-Quellen einbinden
|
||||
4. THE Content_Strategie SHALL eine Mischung aus Formaten vorsehen (Text, Carousel, Video, Newsletter)
|
||||
5. THE Content_Strategie SHALL Interaktionszeiten und Engagement-Routinen definieren
|
||||
6. WHEN ein Beitrag veröffentlicht wird, THE Content_Strategie SHALL sicherstellen, dass der Beitrag einen klaren Mehrwert für die Zielgruppe bietet
|
||||
7. THE Content_Strategie SHALL Themen-Cluster definieren, die zur Personal_Brand passen
|
||||
|
||||
### Requirement 6: Skills und Endorsements
|
||||
|
||||
**User Story:** Als LinkedIn-Nutzer möchte ich eine optimierte Skills-Section haben, damit der LinkedIn-Algorithmus mein Profil für relevante Suchanfragen vorschlägt.
|
||||
|
||||
#### Acceptance Criteria
|
||||
|
||||
1. THE Profil SHALL maximal 50 Skills enthalten, priorisiert nach strategischer Relevanz
|
||||
2. THE Profil SHALL die Top-5-Skills so wählen, dass sie die Kernpositionierung widerspiegeln (KI, Digitalisierung, Change Management, Führung, Innovation)
|
||||
3. WHEN ein neuer Skill hinzugefügt wird, THE Profil SHALL sicherstellen, dass der Skill zur definierten Personal_Brand passt
|
||||
4. THE Profil SHALL eine Strategie zur aktiven Einholung von Endorsements für die Top-Skills enthalten
|
||||
|
||||
### Requirement 7: Netzwerk-Strategie
|
||||
|
||||
**User Story:** Als LinkedIn-Nutzer möchte ich eine gezielte Netzwerk-Strategie haben, damit ich relevante Kontakte aufbaue und meine Reichweite in den Zielgruppen erhöhe.
|
||||
|
||||
#### Acceptance Criteria
|
||||
|
||||
1. THE Profil SHALL eine definierte Zielgruppe für Vernetzungsanfragen haben (Entscheider in Digitalisierung, KI-Community, Startup-Ökosystem, Bahn-Branche)
|
||||
2. THE Profil SHALL personalisierte Vernetzungsnachrichten verwenden, die einen konkreten Anknüpfungspunkt benennen
|
||||
3. THE Content_Strategie SHALL aktives Kommentieren bei relevanten Thought Leadern vorsehen (mindestens 5 Kommentare pro Woche)
|
||||
4. WHEN eine Vernetzungsanfrage gesendet wird, THE Profil SHALL sicherstellen, dass die Anfrage einen Mehrwert oder gemeinsamen Kontext kommuniziert
|
||||
5. THE Profil SHALL die bestehenden Netzwerke (KI-Peergroup Nordhessen, KI-Bundesverband, Science Park Kassel) aktiv auf LinkedIn abbilden
|
||||
|
||||
### Requirement 8: Traktion und Erfolgsmessung
|
||||
|
||||
**User Story:** Als LinkedIn-Nutzer möchte ich die Performance meiner Beiträge und meines Profils systematisch messen, damit ich datenbasiert entscheiden kann, welche Inhalte und Formate am besten funktionieren.
|
||||
|
||||
#### Acceptance Criteria
|
||||
|
||||
1. THE Tracking_System SHALL definierte KPIs für Beiträge erfassen (Impressionen, Engagement-Rate, Kommentare, Reposts, Klicks)
|
||||
2. THE Tracking_System SHALL definierte KPIs für das Profil erfassen (Profilaufrufe, Suchergebnisse, Vernetzungsanfragen pro Woche)
|
||||
3. THE Tracking_System SHALL eine wöchentliche Auswertung der Beitrags-Performance ermöglichen
|
||||
4. THE Tracking_System SHALL eine monatliche Trendanalyse bereitstellen, die Wachstum und Top-Performer identifiziert
|
||||
5. WHEN ein Beitrag eine überdurchschnittliche Engagement-Rate erzielt, THE Tracking_System SHALL diesen Beitrag als Best Practice markieren
|
||||
6. THE Tracking_System SHALL die Daten in einem strukturierten Format speichern, das Vergleiche über Zeit ermöglicht
|
||||
7. THE Tracking_System SHALL Empfehlungen für Content-Optimierung auf Basis der gemessenen Daten ableiten
|
||||
|
||||
### Requirement 9: Personal Branding und Konsistenz
|
||||
|
||||
**User Story:** Als LinkedIn-Nutzer möchte ich eine konsistente Personal Brand haben, damit meine Außenwahrnehmung über alle Kanäle einheitlich und wiedererkennbar ist.
|
||||
|
||||
#### Acceptance Criteria
|
||||
|
||||
1. THE Personal_Brand SHALL ein konsistentes visuelles Erscheinungsbild definieren (Profilfoto, Banner, Farbwelt)
|
||||
2. THE Personal_Brand SHALL die Tonalität festlegen: nahbar, fachlich fundiert, inspirierend
|
||||
3. THE Personal_Brand SHALL die Doppelrolle (Konzern + Startup) als Stärke und Alleinstellungsmerkmal positionieren
|
||||
4. THE Personal_Brand SHALL mit der d-Hive Corporate Identity kompatibel sein (Schwarz/Neon-Grün als Akzente)
|
||||
5. WHEN Inhalte auf LinkedIn veröffentlicht werden, THE Personal_Brand SHALL sicherstellen, dass die Inhalte zur definierten Positionierung passen
|
||||
6. THE Personal_Brand SHALL einen wiedererkennbaren Claim oder Leitsatz enthalten
|
||||
|
||||
@@ -0,0 +1,199 @@
|
||||
# Implementation Plan: LinkedIn-Profil-Revamp
|
||||
|
||||
## Overview
|
||||
|
||||
Implementierung eines neuen Kiro Skills `linkedin-profile` zur automatisierten Generierung und Optimierung von LinkedIn-Profilinhalten. Der Skill nutzt die bestehende Knowledge Base als Datenquelle und erzeugt optimierte Texte für Headline, About-Section, Experience-Beschreibungen, eine Content-Strategie sowie ein Tracking-System für LinkedIn-Metriken. Die Implementierung folgt den etablierten Mustern der bestehenden Skills (consultant-profile, cv-generate, talk-intro).
|
||||
|
||||
## Tasks
|
||||
|
||||
- [x] 1. Constraint-Validator und Typen erstellen
|
||||
- [x] 1.1 LinkedIn-spezifische TypeScript-Interfaces in `src/linkedin/constraints.ts` definieren
|
||||
- `ConstraintValidation`, `ConstraintError`, `ConstraintWarning` Interfaces
|
||||
- Validierungsfunktionen: `validateHeadline(text)`, `validateAbout(text)`, `validateExperience(text)`
|
||||
- Headline-Limit: 220 Zeichen, About-Limit: 2.600 Zeichen
|
||||
- _Requirements: 1.3, 2.5_
|
||||
|
||||
- [x] 1.2 LinkedIn-Modul-Interfaces und Typen in `src/linkedin/types.ts` definieren
|
||||
- `HeadlineOptions`, `HeadlineResult`, `HeadlineVariant`
|
||||
- `AboutOptions`, `AboutResult`
|
||||
- `ExperienceOptions`, `ExperienceResult`
|
||||
- `ContentStrategyOptions`, `ContentStrategy`, `ThemeCluster`, `WeeklySlot`
|
||||
- `TrackingEntry`, `PostMetric`, `WeeklyReport`, `MonthlyTrend`
|
||||
- _Requirements: 1.1–1.5, 2.1–2.7, 3.1–3.6, 5.1–5.7, 8.1–8.7_
|
||||
|
||||
- [x] 1.3 Unit-Tests für Constraint-Validator schreiben
|
||||
- Teste Headline-Validierung (unter/über 220 Zeichen)
|
||||
- Teste About-Validierung (unter/über 2.600 Zeichen)
|
||||
- Teste Experience-Validierung
|
||||
- Teste Edge Cases (leere Strings, exakt am Limit)
|
||||
- _Requirements: 1.3, 2.5_
|
||||
|
||||
- [x] 2. Headline Generator implementieren
|
||||
- [x] 2.1 `src/linkedin/headline-generator.ts` erstellen
|
||||
- Funktion `generateHeadlines(options: HeadlineOptions): HeadlineResult`
|
||||
- KB-Entities lesen (Profile, Experiences) via `src/io/entity-files.ts`
|
||||
- Mehrere Varianten generieren (default: 3)
|
||||
- Beide Rollen (DB InfraGO + Data Hive Cassel) einbinden
|
||||
- Constraint-Validierung via `constraints.ts` anwenden
|
||||
- Keywords und differenzierende Elemente extrahieren
|
||||
- _Requirements: 1.1, 1.2, 1.3, 1.4, 1.5_
|
||||
|
||||
- [x] 2.2 Unit-Tests für Headline Generator schreiben
|
||||
- Teste korrekte Extraktion beider Rollen aus KB
|
||||
- Teste Zeichenlimit-Einhaltung
|
||||
- Teste Variantengenerierung
|
||||
- _Requirements: 1.1–1.5_
|
||||
|
||||
- [x] 3. About Section Generator implementieren
|
||||
- [x] 3.1 `src/linkedin/about-generator.ts` erstellen
|
||||
- Funktion `generateAbout(options: AboutOptions): AboutResult`
|
||||
- KB-Entities lesen (Profile, Projects) via `src/io/entity-files.ts`
|
||||
- Strukturierte Sektionen: Hook, Mission, Expertise, CTA
|
||||
- Hook-Preview (erste 2 Zeilen) separat bereitstellen
|
||||
- Konkrete Belege einbinden (60+ Publikationen, 13+ Jahre KI, 50+ Projekte)
|
||||
- Drei Kernthemen benennen (Innovation/Technologie, Mensch/Kultur, Verantwortung)
|
||||
- Constraint-Validierung (max. 2.600 Zeichen)
|
||||
- _Requirements: 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7_
|
||||
|
||||
- [x] 3.2 Unit-Tests für About Generator schreiben
|
||||
- Teste Zeichenlimit-Einhaltung
|
||||
- Teste Vorhandensein aller Sektionen (hook, mission, expertise, cta)
|
||||
- Teste Hook-Preview-Extraktion
|
||||
- _Requirements: 2.1–2.7_
|
||||
|
||||
- [x] 4. Checkpoint — Kernmodule validieren
|
||||
- Ensure all tests pass, ask the user if questions arise.
|
||||
|
||||
- [x] 5. Experience Generator implementieren
|
||||
- [x] 5.1 `src/linkedin/experience-generator.ts` erstellen
|
||||
- Funktion `generateExperiences(options: ExperienceOptions): ExperienceResult[]`
|
||||
- KB-Entities lesen (Experiences, Skills, Projects) via `src/io/entity-files.ts`
|
||||
- Ergebnisorientierte Beschreibungen statt Aufgabenlisten
|
||||
- Keywords für LinkedIn-Suche einbinden
|
||||
- Messbare Erfolge hervorheben (50+ Projekte, 15+ Kunden, ROI > 2)
|
||||
- DB InfraGO als primäre Position, Data Hive mit Gründer-Achievements
|
||||
- JobSharing-Experiment als Führungsinnovation positionieren
|
||||
- Akademische Laufbahn als KI-Expertise-Fundament
|
||||
- _Requirements: 3.1, 3.2, 3.3, 3.4, 3.5, 3.6_
|
||||
|
||||
- [x] 5.2 Unit-Tests für Experience Generator schreiben
|
||||
- Teste korrekte Zuordnung von Experiences aus KB
|
||||
- Teste Keyword-Einbindung
|
||||
- Teste Ergebnis-Struktur (title, organization, description, achievements)
|
||||
- _Requirements: 3.1–3.6_
|
||||
|
||||
- [x] 6. Content Strategy Generator implementieren
|
||||
- [x] 6.1 `src/linkedin/content-strategy.ts` erstellen
|
||||
- Funktion `generateContentStrategy(options: ContentStrategyOptions): ContentStrategy`
|
||||
- Posting-Frequenz: 2 Beiträge/Woche
|
||||
- Themen-Cluster mit Gewichtung (Innovation 40%, Mensch 35%, Verantwortung 25%)
|
||||
- Wochenplan mit konkreten Slots
|
||||
- Engagement-Routine (5+ Kommentare/Woche bei Thought Leadern)
|
||||
- Format-Mix (Text, Carousel, Video, Newsletter)
|
||||
- Bestehende Formate einbinden (Podcast "Almost Intelligent", Kolumne "Kniepunkt")
|
||||
- _Requirements: 5.1, 5.2, 5.3, 5.4, 5.5, 5.6, 5.7_
|
||||
|
||||
- [x] 6.2 Unit-Tests für Content Strategy Generator schreiben
|
||||
- Teste Struktur des generierten Plans
|
||||
- Teste Themen-Cluster-Vollständigkeit
|
||||
- Teste Format-Mix-Abdeckung
|
||||
- _Requirements: 5.1–5.7_
|
||||
|
||||
- [ ] 7. Tracking Manager implementieren
|
||||
- [x] 7.1 `src/linkedin/tracking-manager.ts` erstellen
|
||||
- Funktion `addTrackingEntry(entry: TrackingEntry): void`
|
||||
- Funktion `getWeeklyReport(weekOf: string): WeeklyReport`
|
||||
- Funktion `getMonthlyTrend(month: string): MonthlyTrend`
|
||||
- YAML-Entities in `kb/tracking/` lesen/schreiben via `src/io/yaml-utils.ts`
|
||||
- Best-Practice-Markierung bei überdurchschnittlicher Engagement-Rate
|
||||
- Trend-Berechnung über Zeiträume
|
||||
- Empfehlungen für Content-Optimierung ableiten
|
||||
- _Requirements: 8.1, 8.2, 8.3, 8.4, 8.5, 8.6, 8.7_
|
||||
|
||||
- [x] 7.2 KB-Verzeichnis `kb/tracking/` anlegen und Graph-Index erweitern
|
||||
- Verzeichnis `kb/tracking/` mit `.gitkeep` erstellen
|
||||
- Entity-Typ `linkedin-tracking` in `kb/graph-index.yaml` dokumentieren
|
||||
- _Requirements: 8.6_
|
||||
|
||||
- [-] 7.3 Unit-Tests für Tracking Manager schreiben
|
||||
- Teste YAML-Serialisierung/Deserialisierung von Tracking-Entries
|
||||
- Teste Weekly-Report-Aggregation
|
||||
- Teste Monthly-Trend-Berechnung
|
||||
- Teste Best-Practice-Markierung
|
||||
- _Requirements: 8.1–8.7_
|
||||
|
||||
- [x] 8. Checkpoint — Alle Module validieren
|
||||
- Ensure all tests pass, ask the user if questions arise.
|
||||
|
||||
- [ ] 9. Kiro Skill erstellen und Module verdrahten
|
||||
- [-] 9.1 `SKILL.md` für linkedin-profile Skill erstellen
|
||||
- Datei: `.kiro/skills/linkedin-profile/SKILL.md`
|
||||
- Skill-Metadaten (name, description, activation: manual)
|
||||
- Workflow-Beschreibung: Profil-Generierung, Content-Strategie, Tracking
|
||||
- Inputs dokumentieren (personId, emphasis, quarter, etc.)
|
||||
- Outputs dokumentieren (profile-optimized.md, content-strategy.md, tracking-report.md)
|
||||
- Shared Modules referenzieren
|
||||
- Rules und Constraints definieren
|
||||
- Muster von `talk-intro/SKILL.md` folgen
|
||||
- _Requirements: 1.1–1.5, 2.1–2.7, 3.1–3.6, 4.1–4.5, 5.1–5.7, 9.1–9.6_
|
||||
|
||||
- [x] 9.2 Output-Verzeichnis `output/linkedin/` anlegen
|
||||
- Verzeichnis mit `.gitkeep` erstellen
|
||||
- _Requirements: 2.5, 5.7, 8.3_
|
||||
|
||||
- [x] 9.3 Profil-Output-Generierung verdrahten
|
||||
- Headline, About und Experience Generatoren zu `output/linkedin/profile-optimized.md` zusammenführen
|
||||
- Markdown-Template mit strukturierten Sektionen
|
||||
- Generierungsdatum und Validierungsstatus einbinden
|
||||
- _Requirements: 1.1–1.5, 2.1–2.7, 3.1–3.6_
|
||||
|
||||
- [x] 9.4 Content-Strategy-Output-Generierung verdrahten
|
||||
- Content Strategy Generator zu `output/linkedin/content-strategy.md` zusammenführen
|
||||
- Quartalsweise Template-Struktur
|
||||
- _Requirements: 5.1–5.7_
|
||||
|
||||
- [x] 9.5 Tracking-Report-Output-Generierung verdrahten
|
||||
- Tracking Manager zu `output/linkedin/tracking-report.md` zusammenführen
|
||||
- Wöchentliche und monatliche Reports
|
||||
- _Requirements: 8.1–8.7_
|
||||
|
||||
- [x] 10. Integration und Abschluss
|
||||
- [x] 10.1 Export in `src/index.ts` ergänzen
|
||||
- LinkedIn-Module exportieren
|
||||
- _Requirements: alle_
|
||||
|
||||
- [x] 10.2 Integrationstests schreiben
|
||||
- Teste End-to-End-Flow: KB lesen → Generierung → Output schreiben
|
||||
- Teste Constraint-Validierung im Gesamtfluss
|
||||
- Teste Tracking-Persistenz
|
||||
- _Requirements: 1.1–1.5, 2.1–2.7, 3.1–3.6, 8.1–8.7_
|
||||
|
||||
- [x] 11. Final Checkpoint — Alle Tests und Integration validieren
|
||||
- Ensure all tests pass, ask the user if questions arise.
|
||||
|
||||
## Notes
|
||||
|
||||
- Tasks marked with `*` are optional and can be skipped for faster MVP
|
||||
- Each task references specific requirements for traceability
|
||||
- Checkpoints ensure incremental validation
|
||||
- Unit tests validate specific examples and edge cases
|
||||
- The design has no Correctness Properties section, so no property-based tests are included
|
||||
- All modules follow the existing project patterns (see `src/intro/`, `src/cv/`)
|
||||
- YAML conventions from `.kiro/steering/kb-conventions.md` apply to tracking entities
|
||||
|
||||
## Task Dependency Graph
|
||||
|
||||
```json
|
||||
{
|
||||
"waves": [
|
||||
{ "id": 0, "tasks": ["1.1", "1.2"] },
|
||||
{ "id": 1, "tasks": ["1.3", "2.1", "7.2", "9.2"] },
|
||||
{ "id": 2, "tasks": ["2.2", "3.1", "5.1", "6.1"] },
|
||||
{ "id": 3, "tasks": ["3.2", "5.2", "6.2", "7.1"] },
|
||||
{ "id": 4, "tasks": ["7.3", "9.1"] },
|
||||
{ "id": 5, "tasks": ["9.3", "9.4", "9.5"] },
|
||||
{ "id": 6, "tasks": ["10.1"] },
|
||||
{ "id": 7, "tasks": ["10.2"] }
|
||||
]
|
||||
}
|
||||
```
|
||||
@@ -0,0 +1 @@
|
||||
{"specId": "1dd1c6a8-8419-4bc6-870d-e2ca21b87d4c", "workflowType": "requirements-first", "specType": "feature"}
|
||||
@@ -0,0 +1,238 @@
|
||||
# Requirements Document
|
||||
|
||||
## Introduction
|
||||
|
||||
A personal homepage at andreknie.de for Dr. Andre Knie that serves as a central platform for trust-building, content access, speaking visibility, consulting positioning, and lead generation. The site presents the stakeholder's AI expertise in a calm, professional, hype-free manner while making content from the Kniepunkt column, Almost Intelligent podcast, talks, and consulting work persistently accessible. It reduces dependency on LinkedIn algorithms and creates a bridge between the personal brand and the Data Hive Cassel (dHive) company offering.
|
||||
|
||||
## Glossary
|
||||
|
||||
- **Homepage**: The personal website at andreknie.de serving as the stakeholder's central digital presence
|
||||
- **Stakeholder**: Dr. Andre Knie — AI expert, consultant, speaker, content author, and Managing Director of dHive
|
||||
- **dHive**: Data Hive Cassel — the company associated with the stakeholder, operating at d-hive.de
|
||||
- **Kniepunkt**: A weekly AI column authored by the stakeholder, currently at 38+ issues
|
||||
- **Almost_Intelligent**: A bi-weekly AI podcast bridging artificial and natural intelligence
|
||||
- **Content_Archive**: The collection of all content objects accessible on the homepage
|
||||
- **Content_Object**: A discrete piece of content — one of: Post, Resource, Talk, Consulting_Example, Newsletter_Issue, Podcast_Episode, or Event
|
||||
- **Post**: Written content including articles and content originating from or related to LinkedIn posts
|
||||
- **Resource**: Downloadable or otherwise useful material that supports visitors and generates leads
|
||||
- **Talk**: A speaking topic, example, or event-related credibility item
|
||||
- **Consulting_Example**: An example of advisory or consulting work presented without exposing confidential client details
|
||||
- **Newsletter_Issue**: An edition or content item related to the Kniepunkt column or newsletter communication
|
||||
- **Podcast_Episode**: An episode of Almost Intelligent
|
||||
- **Event**: A relevant appearance, date, or time-bound activity
|
||||
- **Lead_Data**: Basic visitor-provided contact information collected for resource downloads, newsletter sign-ups, or inquiries
|
||||
- **Inquiry**: A visitor's contact request or talk request submitted through the homepage
|
||||
- **Sales_Funnel**: The business process for turning visitor interest into qualified leads
|
||||
- **Content_Filter**: A business-level classification that helps visitors find content by relevant criteria
|
||||
- **Visitor**: A public user browsing the homepage
|
||||
- **Email_Confirmation**: A verification step to reduce bot submissions and improve inquiry quality
|
||||
|
||||
## Requirements
|
||||
|
||||
### Requirement 1: Personal Profile Presentation
|
||||
|
||||
**User Story:** As a visitor, I want to see a clear and prominent personal profile of Dr. Andre Knie, so that I quickly understand who he is, what he stands for, and how he frames AI.
|
||||
|
||||
#### Acceptance Criteria
|
||||
|
||||
1. THE Homepage SHALL present the Stakeholder's personal profile in a dedicated section visible without scrolling on a standard desktop viewport (1280×720 or larger), including the Stakeholder's name, a professional photo, and a summary statement of no more than 150 words
|
||||
2. THE Homepage SHALL communicate the Stakeholder's roles by explicitly naming all of the following: AI expert, consultant, speaker, content author, and Managing Director of dHive
|
||||
3. THE Homepage SHALL present AI using factual, evidence-based language and SHALL NOT use superlatives (e.g., "revolutionary", "game-changing"), apocalyptic framing (e.g., "existential threat", "will replace all jobs"), or unsubstantiated predictions
|
||||
4. THE Homepage SHALL explain the Stakeholder's perspective on sovereign AI from Germany by including a positioning statement that references at least data sovereignty, independence from non-European providers, and practical applicability for German organizations
|
||||
5. THE Homepage SHALL make the relationship between the Stakeholder's personal offer and dHive understandable by presenting both the personal brand and dHive in the same viewport, with each having its own identifiable label or heading, and neither occupying more than 70% of the shared section's visual area
|
||||
|
||||
### Requirement 2: Target Audience Orientation
|
||||
|
||||
**User Story:** As a visitor from a mid-sized company, HR, OD, IT leadership, or event organization, I want the homepage to address my context, so that I can evaluate the stakeholder's relevance for my needs.
|
||||
|
||||
#### Acceptance Criteria
|
||||
|
||||
1. THE Homepage SHALL explicitly name mid-sized companies, HR and people development, organizational development, IT leaders, and managing directors as target audiences in visible page content so that each audience segment can identify itself within 1 scroll of the landing view
|
||||
2. THE Homepage SHALL present at least 3 speaking examples including topic title, event name, and format (keynote, workshop, panel) to enable event organizers to evaluate the Stakeholder as a potential speaker
|
||||
3. THE Homepage SHALL present AI-related content using factual statements, concrete project references, or verifiable data points rather than unsubstantiated superlatives or subjective claims
|
||||
4. THE Homepage SHALL avoid superlative adjectives (e.g., "best", "leading", "unmatched"), unsubstantiated success claims without reference, and call-to-action language that urges immediate purchase or booking without prior context
|
||||
|
||||
### Requirement 3: Post and Article Access
|
||||
|
||||
**User Story:** As a visitor, I want to access posts and articles, so that I can read the stakeholder's written content on AI topics persistently without relying on LinkedIn.
|
||||
|
||||
#### Acceptance Criteria
|
||||
|
||||
1. THE Content_Archive SHALL provide access to Posts that were originally published on LinkedIn or authored independently, each containing at minimum a title, publication date, and body text
|
||||
2. WHEN a Visitor selects a Post, THE Content_Archive SHALL display the post title, publication date, and full body text including any inline formatting and hyperlinks
|
||||
3. THE Content_Archive SHALL present Posts in reverse chronological order by publication date, allowing a Visitor to browse through all available entries
|
||||
4. IF a Visitor selects a Post that is unavailable or cannot be loaded, THEN THE Content_Archive SHALL display an error message indicating that the requested content could not be found
|
||||
5. THE Content_Archive SHALL display a list of available Posts showing at minimum the title and publication date for each entry to support discovery
|
||||
|
||||
### Requirement 4: Resource Access and Lead Capture
|
||||
|
||||
**User Story:** As a visitor, I want to access downloadable resources, so that I can use practical AI-related materials, and as the stakeholder, I want lead capture on downloads to support the Sales Funnel.
|
||||
|
||||
#### Acceptance Criteria
|
||||
|
||||
1. THE Homepage SHALL display at least 1 downloadable Resource in a dedicated resource area, where each Resource shows a title, a short description (maximum 200 characters), and a download indicator
|
||||
2. THE Homepage SHALL allow Resources designated as downloadable to be accessed by Visitors only after Lead_Data submission
|
||||
3. WHEN a Visitor requests a Resource download, THE Homepage SHALL present a form requiring the following Lead_Data fields before granting access: name (maximum 100 characters), email address (validated as a correctly formatted email), and company name (maximum 150 characters)
|
||||
4. IF a Visitor submits Lead_Data that fails validation, THEN THE Homepage SHALL display an error indication next to each invalid field and retain all previously entered valid data
|
||||
5. WHEN Lead_Data is successfully collected through a Resource download, THE Homepage SHALL store the Lead_Data record associated with the downloaded Resource identifier and a timestamp, making it retrievable for Sales_Funnel development
|
||||
6. THE Homepage SHALL display the list of required Lead_Data fields and their purpose to the Visitor before the Lead_Data form is submitted
|
||||
|
||||
### Requirement 5: Talk and Speaking Content
|
||||
|
||||
**User Story:** As an event organizer, I want to see examples of talks and speaking engagements, so that I can evaluate the stakeholder as a potential speaker for my event.
|
||||
|
||||
#### Acceptance Criteria
|
||||
|
||||
1. THE Content_Archive SHALL provide access to Talks as defined Content_Objects within the browsable content structure
|
||||
2. WHEN a Visitor views Talk content, THE Homepage SHALL present for each Talk at minimum: a speaking topic title, a description of the talk content, and at least one past event or context where the talk was delivered
|
||||
3. THE Homepage SHALL present Talks in a way that allows event organizers to assess the Stakeholder's speaking relevance by showing topic coverage, target audience fit, and evidence of prior speaking engagements
|
||||
4. IF no Talks are available in the Content_Archive, THEN THE Homepage SHALL not display an empty Talk section to Visitors
|
||||
|
||||
### Requirement 6: Consulting Examples
|
||||
|
||||
**User Story:** As a potential client, I want to see examples of consulting work, so that I can assess the stakeholder's advisory relevance for my organization.
|
||||
|
||||
#### Acceptance Criteria
|
||||
|
||||
1. THE Content_Archive SHALL display a collection of at least 3 and at most 10 Consulting_Examples, each presenting a title, industry tag, organization-size category, problem domain, approach taken, and outcomes achieved
|
||||
2. WHEN a Visitor views a Consulting_Example, THE Homepage SHALL present the problem domain, approach, and outcomes without exposing client organization names, specific revenue figures, or internal project identifiers
|
||||
3. THE Homepage SHALL present each Consulting_Example with an industry tag and an organization-size category (50–5,000 employees) so that a Visitor can identify examples matching mid-sized organizations
|
||||
4. IF no Consulting_Examples are available in the Content_Archive, THEN THE Homepage SHALL display an informational message indicating that examples are currently being prepared
|
||||
|
||||
### Requirement 7: Kniepunkt Column Home
|
||||
|
||||
**User Story:** As a reader of the Kniepunkt column, I want a dedicated home for the column on the homepage, so that I can access current and past issues without depending on LinkedIn or newsletter delivery.
|
||||
|
||||
#### Acceptance Criteria
|
||||
|
||||
1. THE Homepage SHALL display a distinct, labeled section dedicated to Kniepunkt content, visually separated from other Homepage content
|
||||
2. THE Content_Archive SHALL display a list of all available Newsletter_Issues related to the Kniepunkt column, each showing at minimum the issue title and publication date
|
||||
3. THE Content_Archive SHALL present Newsletter_Issues sorted by publication date in descending order (newest first)
|
||||
4. WHEN a Visitor selects a Newsletter_Issue from the Content_Archive, THE Homepage SHALL display the full content of that issue
|
||||
|
||||
### Requirement 8: Almost Intelligent Podcast Home
|
||||
|
||||
**User Story:** As a podcast listener, I want a dedicated home for Almost Intelligent on the homepage, so that I can discover and access episodes.
|
||||
|
||||
#### Acceptance Criteria
|
||||
|
||||
1. THE Homepage SHALL display a visually distinct section for Almost_Intelligent that includes the podcast name, a brief description, and a link or entry point to the full episode listing
|
||||
2. THE Content_Archive SHALL display Podcast_Episodes in reverse-chronological order, showing for each episode at minimum: title, publication date, and a short description or summary
|
||||
3. WHEN a Visitor browses podcast content, THE Homepage SHALL present a maximum of 10 episodes per page with pagination controls to access older episodes
|
||||
4. WHEN a Visitor selects a Podcast_Episode, THE Homepage SHALL provide a direct link to the episode audio on the hosting platform or an embedded player
|
||||
5. IF no Podcast_Episodes are available, THEN THE Homepage SHALL display a message indicating that no episodes have been published yet
|
||||
|
||||
### Requirement 9: Events and Dates
|
||||
|
||||
**User Story:** As a visitor, I want to see relevant events and dates, so that I know where and when the stakeholder appears or is active.
|
||||
|
||||
#### Acceptance Criteria
|
||||
|
||||
1. THE Content_Archive SHALL store Events as entities with the following required attributes: title, date (ISO 8601), location, event type (talk, workshop, conference, appearance), and description (maximum 300 characters)
|
||||
2. WHEN a Visitor views Events, THE Content_Archive SHALL present them in reverse-chronological order grouped by year, with upcoming events (date >= today) listed before past events
|
||||
3. THE Content_Archive SHALL support a maximum of 200 stored Event entities
|
||||
4. IF an Event entity is missing any required attribute (title, date, location, event type), THEN THE Content_Archive SHALL reject the entity with an error message indicating the missing fields
|
||||
|
||||
### Requirement 10: Newsletter Subscription
|
||||
|
||||
**User Story:** As a visitor interested in the stakeholder's AI perspective, I want to subscribe to the newsletter or column, so that I receive regular updates.
|
||||
|
||||
#### Acceptance Criteria
|
||||
|
||||
1. THE Homepage SHALL display a subscription form requiring the Visitor to provide an email address to subscribe to the newsletter or Kniepunkt-related communication
|
||||
2. WHEN a Visitor submits the subscription form with a valid email address, THE Homepage SHALL create both a communication subscription and a Sales_Funnel entry
|
||||
3. WHEN a Visitor submits the subscription form, THE Homepage SHALL send a confirmation email to the provided address requiring the Visitor to confirm the subscription before it becomes active (double opt-in)
|
||||
4. IF the Visitor does not confirm the subscription within 48 hours, THEN THE Homepage SHALL discard the pending subscription and the Sales_Funnel entry
|
||||
5. IF the submitted email address does not conform to a valid email format, THEN THE Homepage SHALL display an inline error message indicating the invalid format and SHALL NOT create a subscription or Sales_Funnel entry
|
||||
6. IF the submitted email address is already associated with an active subscription, THEN THE Homepage SHALL inform the Visitor that the email is already subscribed and SHALL NOT create a duplicate entry
|
||||
|
||||
### Requirement 11: Contact Request
|
||||
|
||||
**User Story:** As a potential client or partner, I want to contact the stakeholder through the homepage, so that I can initiate a conversation without needing LinkedIn.
|
||||
|
||||
#### Acceptance Criteria
|
||||
|
||||
1. THE Homepage SHALL display a contact form requiring at minimum the Visitor's name, email address, and a message body (maximum 2000 characters)
|
||||
2. WHEN a Visitor submits the contact form, THE Homepage SHALL send a confirmation email to the Visitor's provided email address containing a unique confirmation link that expires after 24 hours
|
||||
3. WHEN the Visitor clicks the confirmation link within the expiration period, THE Homepage SHALL send an email notification containing the Visitor's name, email address, and message to the Stakeholder
|
||||
4. IF the confirmation link is not clicked within 24 hours, THEN THE Homepage SHALL discard the contact request and not deliver the message to the Stakeholder
|
||||
5. IF the contact form is submitted with any required field empty or with an invalid email format, THEN THE Homepage SHALL display a validation error indicating which fields need correction
|
||||
|
||||
### Requirement 12: Talk Request
|
||||
|
||||
**User Story:** As an event organizer, I want to request or inquire about a talk through the homepage, so that I can engage the stakeholder as a speaker.
|
||||
|
||||
#### Acceptance Criteria
|
||||
|
||||
1. THE Homepage SHALL allow Visitors to submit a talk request by providing at minimum: visitor name, visitor email address, event name, proposed topic or talk title, and a message field (maximum 2000 characters)
|
||||
2. WHEN a Visitor submits a talk request, THE Homepage SHALL send an Email_Confirmation message to the visitor's provided email address, and the visitor must confirm within 48 hours for the request to be forwarded
|
||||
3. WHEN a Visitor confirms their email within the confirmation period, THE Homepage SHALL send an email notification containing the talk request details to the Stakeholder
|
||||
4. IF a Visitor does not confirm their email within 48 hours, THEN THE Homepage SHALL discard the talk request and not notify the Stakeholder
|
||||
5. WHEN a Visitor submits a talk request, THE Homepage SHALL validate that all required fields are non-empty and that the email address matches a valid email format before initiating the Email_Confirmation step
|
||||
|
||||
### Requirement 13: Content Filtering and Browsing
|
||||
|
||||
**User Story:** As a visitor, I want to filter or group content by relevant criteria, so that I can find specific topics or content types efficiently.
|
||||
|
||||
#### Acceptance Criteria
|
||||
|
||||
1. THE Homepage SHALL allow Visitors to filter content by at least one tag-based criterion derived from content metadata (such as topic, content type, or skill area)
|
||||
2. WHEN a Visitor selects a filter criterion, THE Homepage SHALL display only content items matching that criterion within 1 second of interaction
|
||||
3. IF no content items match the selected filter criterion, THEN THE Homepage SHALL display a message indicating that no matching content is available
|
||||
4. THE Homepage SHALL derive filter criteria dynamically from the existing content metadata so that adding new content with new tags automatically extends the available filter options without requiring code changes
|
||||
5. THE Content_Filter criteria SHALL be stored as content metadata (tags or categories) on each content item rather than as a fixed enumerated list, supporting a maximum of 20 distinct filter values at any time
|
||||
|
||||
### Requirement 14: Content Management
|
||||
|
||||
**User Story:** As the stakeholder, I want to add new content to the homepage, so that the site stays current with my latest work and publications.
|
||||
|
||||
#### Acceptance Criteria
|
||||
|
||||
1. THE Homepage SHALL allow the Stakeholder to add new Content_Objects by creating a content file containing at minimum a title, a publication date, a content-area assignment, and a body
|
||||
2. WHEN the Stakeholder adds a new Content_Object and assigns it to a content area (Posts, Resources, Talks, Consulting_Examples, Newsletter_Issues, Podcast_Episodes, or Events), THE Homepage SHALL display the Content_Object within that content area after the next deployment
|
||||
3. THE content structure SHALL allow the Stakeholder to add, rename, or remove content areas without requiring changes to existing Content_Objects that belong to other areas
|
||||
4. IF the Stakeholder adds a Content_Object with a content-area value that does not match any defined content area, THEN THE Homepage SHALL reject the Content_Object and indicate the invalid content-area value along with the list of valid content areas
|
||||
5. WHEN multiple Content_Objects exist within the same content area, THE Homepage SHALL display them ordered by publication date descending (newest first)
|
||||
|
||||
### Requirement 15: Content Type Scope
|
||||
|
||||
**User Story:** As the stakeholder, I want the first version limited to confirmed content types, so that scope remains manageable and focused.
|
||||
|
||||
#### Acceptance Criteria
|
||||
|
||||
1. THE Homepage SHALL support the following Content_Object types in the first version: Post, Resource, Talk, Consulting_Example, Newsletter_Issue, Podcast_Episode, and Event
|
||||
2. THE Homepage SHALL NOT introduce additional Content_Object types beyond the confirmed list in the first version
|
||||
|
||||
### Requirement 16: Cross-Reference to dHive
|
||||
|
||||
**User Story:** As a visitor, I want to understand the connection between the stakeholder and dHive, so that I can navigate to the company offering when relevant.
|
||||
|
||||
#### Acceptance Criteria
|
||||
|
||||
1. THE Homepage SHALL include at least one visible link to the dHive company website (d-hive.de) that identifies the stakeholder's role (e.g., Founder & CEO) at the company
|
||||
2. THE Homepage SHALL present dHive references as secondary content, meaning dHive branding (logo, company name) occupies no more than 20% of any visible section's area and does not appear above or before the stakeholder's personal name and title
|
||||
3. WHEN a visitor activates a dHive link, THE Homepage SHALL navigate to https://d-hive.de in a new browser tab
|
||||
|
||||
### Requirement 17: Tone and Communication Standards
|
||||
|
||||
**User Story:** As a visitor, I want the homepage to feel professional, calm, and trustworthy, so that I can engage with the content without feeling marketed to.
|
||||
|
||||
#### Acceptance Criteria
|
||||
|
||||
1. THE Homepage SHALL use factual, declarative language across all content elements (headings, body text, calls-to-action, and labels) without superlatives (e.g., "best", "unbelievable", "revolutionary"), urgency phrases (e.g., "act now", "limited time", "don't miss out"), or unsubstantiated comparative claims
|
||||
2. THE Homepage SHALL NOT contain fearmongering language (predictions of negative consequences for inaction), countdown timers, animated promotional banners, or aggressive upselling patterns (e.g., repeated purchase prompts, pop-up offers)
|
||||
3. THE Homepage SHALL present AI as a useful tool by stating at least one concrete limitation or regulatory consideration (e.g., AI Act compliance, data sovereignty) alongside any stated capability
|
||||
4. THE Homepage SHALL NOT attribute capabilities, credentials, or results to the Stakeholder, dHive, or the offer that are not substantiated by verifiable facts present in the Knowledge_Base
|
||||
5. WHEN describing services or expertise, THE Homepage SHALL use specific, quantifiable evidence from the Knowledge_Base (e.g., project count, years of experience, certifications held) rather than subjective qualifiers (e.g., "highly experienced", "leading expert", "world-class")
|
||||
|
||||
### Requirement 18: Scope Boundaries for First Version
|
||||
|
||||
**User Story:** As the stakeholder, I want clear scope boundaries for the first version, so that development stays focused on confirmed features.
|
||||
|
||||
#### Acceptance Criteria
|
||||
|
||||
1. THE Homepage first version SHALL NOT include appointment scheduling functionality such as booking forms, time slot selection, or availability calendars
|
||||
2. THE Homepage first version SHALL NOT include a calendar displaying available time slots for any service or consultation
|
||||
3. THE Homepage first version SHALL NOT include any login-protected or access-restricted section that provides additional features to registered or subscribed users
|
||||
4. THE Homepage first version SHALL serve all content publicly without requiring user authentication or distinguishing between visitor types
|
||||
5. THE Homepage first version SHALL NOT include user account creation, login, or subscription management functionality
|
||||
@@ -0,0 +1 @@
|
||||
{"specId": "9061ba61-554c-45b6-87f0-88e69adb2038", "workflowType": "requirements-first", "specType": "feature"}
|
||||
@@ -0,0 +1,570 @@
|
||||
# Design Document: Personal Knowledge Base
|
||||
|
||||
## Overview
|
||||
|
||||
This system implements a file-based personal knowledge graph stored entirely in human-readable formats (YAML for structured data, Markdown for prose content) within a Git repository. It provides Kiro skills for CV generation, interview-based knowledge collection, talk introductions, and iterative review workflows.
|
||||
|
||||
The architecture follows the "plain text files as database" pattern — entities and relationships are stored as individual YAML files in a well-defined directory structure. Kiro skills read and write these files directly, using the file system as the query layer. Git provides version history, collaboration, and deployment triggers.
|
||||
|
||||
### Design Decisions
|
||||
|
||||
1. **YAML over JSON for data files** — YAML supports comments, multi-line strings, and produces cleaner diffs. It's more natural for human editing while remaining machine-parseable.
|
||||
2. **One file per entity** — Each person, experience, skill, etc. gets its own file. This keeps diffs focused and enables granular version history.
|
||||
3. **Relationships stored inline and in a separate index** — Entity files reference related entities by ID. A central graph index provides a queryable overview.
|
||||
4. **Kiro skills as the primary interface** — All automated operations (generation, interviews, reviews) are implemented as Kiro skills following the Agent Skills standard.
|
||||
5. **No database or build step** — The file system IS the database. No compilation, indexing, or server required.
|
||||
|
||||
## Architecture
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
subgraph "Git Repository"
|
||||
subgraph "Knowledge Base (kb/)"
|
||||
Profiles[profiles/]
|
||||
Experiences[experiences/]
|
||||
Skills[skills/]
|
||||
Orgs[organizations/]
|
||||
Projects[projects/]
|
||||
Certs[certifications/]
|
||||
Tandems[tandems/]
|
||||
Graph[graph-index.yaml]
|
||||
end
|
||||
subgraph "Kiro Skills (.kiro/skills/)"
|
||||
InterviewSkill[interview-collect/]
|
||||
CVGenSkill[cv-generate/]
|
||||
TalkIntroSkill[talk-intro/]
|
||||
ReviewSkill[kb-review/]
|
||||
end
|
||||
subgraph "Templates (templates/)"
|
||||
CVTemplate[cv-templates/]
|
||||
IntroTemplate[intro-templates/]
|
||||
end
|
||||
subgraph "Output (output/)"
|
||||
GeneratedCVs[cvs/]
|
||||
GeneratedIntros[intros/]
|
||||
end
|
||||
end
|
||||
|
||||
InterviewSkill -->|reads/writes| Profiles
|
||||
InterviewSkill -->|reads/writes| Experiences
|
||||
CVGenSkill -->|reads| Profiles
|
||||
CVGenSkill -->|reads| Experiences
|
||||
CVGenSkill -->|reads| Skills
|
||||
CVGenSkill -->|reads| Tandems
|
||||
CVGenSkill -->|writes| GeneratedCVs
|
||||
TalkIntroSkill -->|reads| Profiles
|
||||
TalkIntroSkill -->|writes| GeneratedIntros
|
||||
ReviewSkill -->|reads| Graph
|
||||
ReviewSkill -->|identifies gaps| Profiles
|
||||
```
|
||||
|
||||
### Component Interaction Flow
|
||||
|
||||
1. **Data Entry**: User runs interview skill → skill asks questions → writes YAML entity files → updates graph index
|
||||
2. **Document Generation**: User provides job posting → CV skill reads relevant entities → applies template → writes Markdown output
|
||||
3. **Review**: User runs review skill → skill reads graph index → calculates completeness → suggests interview topics
|
||||
|
||||
## Components and Interfaces
|
||||
|
||||
### 1. Knowledge Base Data Layer (`kb/`)
|
||||
|
||||
The core data store. All files are YAML with defined schemas.
|
||||
|
||||
**Interface**: File system read/write. Skills interact by reading and writing YAML files.
|
||||
|
||||
**Responsibilities**:
|
||||
- Store entity data in schema-compliant YAML files
|
||||
- Maintain referential integrity via the graph index
|
||||
- Provide human-navigable directory structure
|
||||
|
||||
### 2. Graph Index (`kb/graph-index.yaml`)
|
||||
|
||||
A single file that lists all entities and their relationships, serving as a queryable overview of the entire knowledge graph.
|
||||
|
||||
**Interface**: Read by skills to discover entities; updated when entities are added/modified.
|
||||
|
||||
**Responsibilities**:
|
||||
- List all entities with type, ID, and display name
|
||||
- List all relationships between entities
|
||||
- Enable quick lookups without scanning all files
|
||||
|
||||
### 3. Interview Collect Skill (`.kiro/skills/interview-collect/`)
|
||||
|
||||
A Kiro skill that conducts focused interview sessions to collect knowledge.
|
||||
|
||||
**Interface**: Conversational — activated by user request or slash command `/interview-collect`.
|
||||
|
||||
**Responsibilities**:
|
||||
- Identify gaps in existing profiles
|
||||
- Ask focused questions (max 10 per session)
|
||||
- Write collected data to appropriate entity files
|
||||
- Update graph index with new entities/relationships
|
||||
- Detect and surface conflicts with existing data
|
||||
|
||||
### 4. CV Generate Skill (`.kiro/skills/cv-generate/`)
|
||||
|
||||
A Kiro skill that produces tailored CVs from knowledge base data.
|
||||
|
||||
**Interface**: Activated with a job posting as input. Outputs Markdown CV files.
|
||||
|
||||
**Responsibilities**:
|
||||
- Parse job posting requirements
|
||||
- Select relevant experiences, skills, projects from the knowledge base
|
||||
- Generate individual CVs and tandem CVs
|
||||
- Apply templates for consistent formatting
|
||||
- Never fabricate content — only use data present in the knowledge base
|
||||
|
||||
### 5. Talk Intro Skill (`.kiro/skills/talk-intro/`)
|
||||
|
||||
A Kiro skill that generates speaker introductions.
|
||||
|
||||
**Interface**: Activated with talk topic and event context. Outputs Markdown intro files.
|
||||
|
||||
**Responsibilities**:
|
||||
- Generate short (2-3 sentences), medium (paragraph), and long (multi-paragraph) variants
|
||||
- Adapt tone to event context (technical, business, academic)
|
||||
- Pull relevant expertise from person profile
|
||||
|
||||
### 6. KB Review Skill (`.kiro/skills/kb-review/`)
|
||||
|
||||
A Kiro skill for iterative knowledge base maintenance.
|
||||
|
||||
**Interface**: Activated by user request. Presents review summary and suggestions.
|
||||
|
||||
**Responsibilities**:
|
||||
- Calculate completeness scores per profile
|
||||
- Identify stale information (based on last-modified dates)
|
||||
- Suggest areas for next interview session
|
||||
- Recommend relationship additions for graph consistency
|
||||
|
||||
## Data Models
|
||||
|
||||
### Entity File Schemas
|
||||
|
||||
All entity files follow a common header pattern:
|
||||
|
||||
```yaml
|
||||
# Common header for all entity files
|
||||
id: <kebab-case-unique-id>
|
||||
type: <entity-type>
|
||||
created: <ISO-8601 date>
|
||||
modified: <ISO-8601 date>
|
||||
```
|
||||
|
||||
### Person Profile (`kb/profiles/<person-id>.yaml`)
|
||||
|
||||
```yaml
|
||||
id: andre-knie
|
||||
type: person
|
||||
created: 2025-01-15
|
||||
modified: 2025-09-01
|
||||
|
||||
name:
|
||||
first: Andre
|
||||
last: Knie
|
||||
display: Andre Knie
|
||||
|
||||
contact:
|
||||
email: # optional
|
||||
linkedin: # optional
|
||||
location: # optional
|
||||
|
||||
summary: |
|
||||
Multi-line professional summary text.
|
||||
|
||||
languages:
|
||||
- language: German
|
||||
level: native
|
||||
- language: English
|
||||
level: fluent
|
||||
|
||||
education:
|
||||
- institution: # name
|
||||
degree: # degree title
|
||||
field: # field of study
|
||||
start: 2000-09
|
||||
end: 2004-06
|
||||
|
||||
# References to other entities by ID
|
||||
skills: [skill-id-1, skill-id-2]
|
||||
experiences: [exp-id-1, exp-id-2]
|
||||
certifications: [cert-id-1]
|
||||
publications: []
|
||||
```
|
||||
|
||||
### Experience (`kb/experiences/<experience-id>.yaml`)
|
||||
|
||||
```yaml
|
||||
id: db-cargo-innovation-lead
|
||||
type: experience
|
||||
created: 2025-01-15
|
||||
modified: 2025-09-01
|
||||
|
||||
title: Lead IT Innovation Development and AI
|
||||
organization: db-cargo # reference to organization entity
|
||||
start: 2023-04
|
||||
end: null # null means current
|
||||
|
||||
description: |
|
||||
Multi-line description of the role and responsibilities.
|
||||
|
||||
achievements:
|
||||
- Achievement description one
|
||||
- Achievement description two
|
||||
|
||||
skills-used: [python, machine-learning, team-leadership]
|
||||
projects: [project-id-1]
|
||||
```
|
||||
|
||||
### Skill (`kb/skills/<skill-id>.yaml`)
|
||||
|
||||
```yaml
|
||||
id: python
|
||||
type: skill
|
||||
created: 2025-01-15
|
||||
modified: 2025-01-15
|
||||
|
||||
name: Python
|
||||
category: programming-language # programming-language | framework | methodology | soft-skill | domain
|
||||
level: expert # beginner | intermediate | advanced | expert
|
||||
years: 8
|
||||
|
||||
context: |
|
||||
Optional notes on how/where this skill was developed.
|
||||
```
|
||||
|
||||
### Organization (`kb/organizations/<org-id>.yaml`)
|
||||
|
||||
```yaml
|
||||
id: db-cargo
|
||||
type: organization
|
||||
created: 2025-01-15
|
||||
modified: 2025-01-15
|
||||
|
||||
name: DB Cargo AG
|
||||
industry: logistics
|
||||
parent: deutsche-bahn # optional reference to parent org
|
||||
website: # optional
|
||||
```
|
||||
|
||||
### Project (`kb/projects/<project-id>.yaml`)
|
||||
|
||||
```yaml
|
||||
id: ai-platform-migration
|
||||
type: project
|
||||
created: 2025-01-15
|
||||
modified: 2025-06-01
|
||||
|
||||
name: AI Platform Migration
|
||||
description: |
|
||||
Project description.
|
||||
|
||||
organization: db-cargo
|
||||
start: 2024-01
|
||||
end: 2024-12
|
||||
skills-used: [python, aws, terraform]
|
||||
persons: [andre-knie]
|
||||
```
|
||||
|
||||
### Certification (`kb/certifications/<cert-id>.yaml`)
|
||||
|
||||
```yaml
|
||||
id: aws-solutions-architect
|
||||
type: certification
|
||||
created: 2025-01-15
|
||||
modified: 2025-01-15
|
||||
|
||||
name: AWS Solutions Architect Associate
|
||||
issuer: Amazon Web Services
|
||||
date: 2024-03
|
||||
expires: 2027-03 # optional
|
||||
person: andre-knie
|
||||
```
|
||||
|
||||
### Job Sharing Tandem (`kb/tandems/<tandem-id>.yaml`)
|
||||
|
||||
```yaml
|
||||
id: froldi-knie
|
||||
type: tandem
|
||||
created: 2025-01-15
|
||||
modified: 2025-04-01
|
||||
|
||||
partners: [andre-knie, claudia-froldi]
|
||||
|
||||
shared-vision: |
|
||||
Description of the tandem's shared professional vision.
|
||||
|
||||
complementary-skills: |
|
||||
How the partners' skills complement each other.
|
||||
|
||||
collaboration-model: |
|
||||
How the tandem divides and shares work.
|
||||
|
||||
combined-narrative: |
|
||||
Joint professional narrative for applications.
|
||||
|
||||
joint-competencies:
|
||||
- competency-description-1
|
||||
- competency-description-2
|
||||
```
|
||||
|
||||
### Graph Index (`kb/graph-index.yaml`)
|
||||
|
||||
```yaml
|
||||
# Auto-maintained index of all entities and relationships
|
||||
entities:
|
||||
- id: andre-knie
|
||||
type: person
|
||||
name: Andre Knie
|
||||
- id: claudia-froldi
|
||||
type: person
|
||||
name: Claudia Froldi
|
||||
- id: db-cargo
|
||||
type: organization
|
||||
name: DB Cargo AG
|
||||
# ... all entities listed
|
||||
|
||||
relationships:
|
||||
- from: andre-knie
|
||||
to: db-cargo
|
||||
type: worked_at
|
||||
context: db-cargo-innovation-lead # optional reference to experience
|
||||
- from: andre-knie
|
||||
to: claudia-froldi
|
||||
type: partners_with
|
||||
context: froldi-knie # reference to tandem
|
||||
- from: andre-knie
|
||||
to: python
|
||||
type: has_skill
|
||||
# ... all relationships listed
|
||||
```
|
||||
|
||||
### Directory Structure
|
||||
|
||||
```
|
||||
project-root/
|
||||
├── .kiro/
|
||||
│ ├── skills/
|
||||
│ │ ├── interview-collect/
|
||||
│ │ │ └── SKILL.md
|
||||
│ │ ├── cv-generate/
|
||||
│ │ │ ├── SKILL.md
|
||||
│ │ │ └── references/
|
||||
│ │ │ └── cv-formatting-guide.md
|
||||
│ │ ├── talk-intro/
|
||||
│ │ │ └── SKILL.md
|
||||
│ │ └── kb-review/
|
||||
│ │ └── SKILL.md
|
||||
│ ├── steering/
|
||||
│ │ └── kb-conventions.md
|
||||
│ └── specs/
|
||||
│ └── personal-knowledge-base/
|
||||
├── kb/
|
||||
│ ├── profiles/
|
||||
│ │ ├── andre-knie.yaml
|
||||
│ │ └── claudia-froldi.yaml
|
||||
│ ├── experiences/
|
||||
│ ├── skills/
|
||||
│ ├── organizations/
|
||||
│ ├── projects/
|
||||
│ ├── certifications/
|
||||
│ ├── tandems/
|
||||
│ │ └── froldi-knie.yaml
|
||||
│ └── graph-index.yaml
|
||||
├── templates/
|
||||
│ ├── cv-individual.md
|
||||
│ ├── cv-tandem.md
|
||||
│ └── intro-speaker.md
|
||||
├── output/
|
||||
│ ├── cvs/
|
||||
│ └── intros/
|
||||
├── sources/
|
||||
│ └── (imported PDFs/DOCX for reference)
|
||||
└── README.md
|
||||
```
|
||||
|
||||
|
||||
## Correctness Properties
|
||||
|
||||
*A property is a characteristic or behavior that should hold true across all valid executions of a system — essentially, a formal statement about what the system should do. Properties serve as the bridge between human-readable specifications and machine-verifiable correctness guarantees.*
|
||||
|
||||
### Property 1: Entity serialization round-trip
|
||||
|
||||
*For any* valid knowledge base entity (person, experience, skill, organization, project, certification, or tandem), serializing it to YAML and deserializing the result SHALL produce an equivalent entity with all attributes preserved.
|
||||
|
||||
**Validates: Requirements 2.1, 8.2**
|
||||
|
||||
### Property 2: Entity schema validation
|
||||
|
||||
*For any* entity with a declared type, the validation function SHALL accept the entity if and only if all required attributes for that type are present and correctly typed. Entities missing required fields SHALL be rejected with an error identifying the missing fields.
|
||||
|
||||
**Validates: Requirements 1.1, 1.3**
|
||||
|
||||
### Property 3: Temporal consistency
|
||||
|
||||
*For any* time-bound entity (experience, role, project, certification) where both start and end dates are present, the start date SHALL be less than or equal to the end date.
|
||||
|
||||
**Validates: Requirements 1.4**
|
||||
|
||||
### Property 4: Graph index consistency
|
||||
|
||||
*For any* set of entity files in the knowledge base, the graph index SHALL list exactly those entities (no missing, no extra). All relationships in the graph index SHALL reference entity IDs that exist in the entities list, and all relationship types SHALL be from the defined set.
|
||||
|
||||
**Validates: Requirements 1.2, 9.4**
|
||||
|
||||
### Property 5: Tandem entity integrity
|
||||
|
||||
*For any* tandem entity, it SHALL reference exactly two existing person profiles as partners, and SHALL contain all tandem-specific fields (shared vision, complementary skills, collaboration model).
|
||||
|
||||
**Validates: Requirements 2.3, 2.4**
|
||||
|
||||
### Property 6: Interview session question limit
|
||||
|
||||
*For any* interview session generated from any profile state and topic area, the number of questions SHALL not exceed 10.
|
||||
|
||||
**Validates: Requirements 4.2**
|
||||
|
||||
### Property 7: Gap detection completeness
|
||||
|
||||
*For any* person profile with missing optional or required attributes, the gap detection function SHALL identify all missing attributes. The set of detected gaps SHALL be a superset of the actually missing required fields.
|
||||
|
||||
**Validates: Requirements 4.4**
|
||||
|
||||
### Property 8: Conflict detection
|
||||
|
||||
*For any* existing entity and a proposed update that changes an existing attribute value, the conflict detection function SHALL flag the conflicting fields.
|
||||
|
||||
**Validates: Requirements 4.5**
|
||||
|
||||
### Property 9: CV relevance selection
|
||||
|
||||
*For any* job posting with specified skill requirements and any person profile, the CV generator SHALL select only experiences and skills that have non-empty intersection with the posting requirements. Selected items SHALL appear before non-matching items in the output.
|
||||
|
||||
**Validates: Requirements 5.1, 5.2**
|
||||
|
||||
### Property 10: Tandem application document set
|
||||
|
||||
*For any* tandem application to a job posting, the generator SHALL produce exactly 3 documents: one combined tandem CV referencing both partners, and one individual CV per partner. The tandem CV SHALL contain information from both partner profiles.
|
||||
|
||||
**Validates: Requirements 5.3, 5.4**
|
||||
|
||||
### Property 11: CV output validity and traceability
|
||||
|
||||
*For any* generated CV, the output SHALL be valid Markdown. Every skill name, organization name, job title, and date mentioned in the CV SHALL be traceable to an entity in the source knowledge base.
|
||||
|
||||
**Validates: Requirements 5.5, 5.6**
|
||||
|
||||
### Property 12: Introduction length variants
|
||||
|
||||
*For any* talk introduction generation request, the system SHALL produce exactly three variants where the character count satisfies: short < medium < long.
|
||||
|
||||
**Validates: Requirements 6.2**
|
||||
|
||||
### Property 13: Completeness score calculation
|
||||
|
||||
*For any* person profile, the completeness score SHALL equal the ratio of filled attributes to total defined attributes (including relationship coverage). A profile with all attributes filled SHALL score 1.0, and an empty profile SHALL score close to 0.0.
|
||||
|
||||
**Validates: Requirements 7.3**
|
||||
|
||||
### Property 14: Review prioritization ordering
|
||||
|
||||
*For any* set of entities with varying last-modified dates and completeness scores, the review prioritization SHALL rank entities with lower completeness scores and older modification dates higher than entities with higher completeness and recent modifications.
|
||||
|
||||
**Validates: Requirements 7.2**
|
||||
|
||||
### Property 15: File naming convention
|
||||
|
||||
*For any* entity ID in the knowledge base, the corresponding file name SHALL match the pattern `<entity-id>.yaml` where entity-id consists only of lowercase letters, numbers, and hyphens (kebab-case).
|
||||
|
||||
**Validates: Requirements 9.2**
|
||||
|
||||
## Error Handling
|
||||
|
||||
### File System Errors
|
||||
|
||||
| Error Condition | Handling Strategy |
|
||||
|---|---|
|
||||
| Entity file not found | Return descriptive error with entity ID and expected path |
|
||||
| YAML parse error | Return error with file path, line number, and parse message |
|
||||
| Schema validation failure | Return list of missing/invalid fields with expected types |
|
||||
| Duplicate entity ID | Reject creation, report existing entity location |
|
||||
| Broken relationship reference | Log warning, include in review skill's integrity report |
|
||||
|
||||
### Document Generation Errors
|
||||
|
||||
| Error Condition | Handling Strategy |
|
||||
|---|---|
|
||||
| Empty profile (no data to generate from) | Return error explaining minimum data requirements |
|
||||
| Job posting cannot be parsed | Return error with guidance on expected posting format |
|
||||
| Template not found | Fall back to built-in default template, log warning |
|
||||
| Referenced entity missing during generation | Skip the reference, add note to output indicating gap |
|
||||
|
||||
### Interview Session Errors
|
||||
|
||||
| Error Condition | Handling Strategy |
|
||||
|---|---|
|
||||
| Conflicting data detected | Present both values to user, ask for resolution |
|
||||
| Session interrupted (user stops early) | Persist any data collected so far, mark session incomplete |
|
||||
| Invalid user input (wrong format) | Re-ask the question with format guidance |
|
||||
|
||||
### Source Document Ingestion Errors
|
||||
|
||||
| Error Condition | Handling Strategy |
|
||||
|---|---|
|
||||
| PDF cannot be read | Report parsing failure with file name and error details |
|
||||
| DOCX cannot be read | Report parsing failure with file name and error details |
|
||||
| Extracted data ambiguous | Present multiple interpretations to user for selection |
|
||||
|
||||
## Testing Strategy
|
||||
|
||||
### Property-Based Testing
|
||||
|
||||
**Library**: [fast-check](https://github.com/dubzzz/fast-check) (TypeScript/JavaScript) — chosen because Kiro skills execute in a Node.js environment and fast-check provides excellent arbitrary generators for structured data.
|
||||
|
||||
**Configuration**: Minimum 100 iterations per property test.
|
||||
|
||||
**Tag format**: Each test tagged with `Feature: personal-knowledge-base, Property {N}: {title}`
|
||||
|
||||
Property-based tests will cover:
|
||||
- Entity serialization round-trips (Property 1)
|
||||
- Schema validation logic (Property 2)
|
||||
- Temporal consistency checks (Property 3)
|
||||
- Graph index integrity (Property 4)
|
||||
- Tandem entity validation (Property 5)
|
||||
- Interview question limits (Property 6)
|
||||
- Gap detection (Property 7)
|
||||
- Conflict detection (Property 8)
|
||||
- CV relevance selection (Property 9)
|
||||
- Tandem document generation (Property 10)
|
||||
- CV traceability (Property 11)
|
||||
- Introduction length ordering (Property 12)
|
||||
- Completeness scoring (Property 13)
|
||||
- Review prioritization (Property 14)
|
||||
- File naming validation (Property 15)
|
||||
|
||||
### Unit Tests (Example-Based)
|
||||
|
||||
Unit tests cover specific scenarios and edge cases not suited for PBT:
|
||||
- Multiple profiles coexist without conflict (Req 1.5)
|
||||
- Source document extraction with known sample files (Req 3.1, 3.2)
|
||||
- Extraction presents confirmation before persisting (Req 3.3)
|
||||
- Corrupted file produces descriptive error (Req 3.4)
|
||||
- Interview session covers single topic (Req 4.1)
|
||||
- Interview writes collected data to graph (Req 4.3)
|
||||
- Talk intro references relevant expertise (Req 6.1)
|
||||
- Tone adaptation for different contexts (Req 6.3)
|
||||
- Relationship suggestions use valid types (Req 7.4)
|
||||
|
||||
### Integration Tests
|
||||
|
||||
- Git version control preserves profile history (Req 2.2)
|
||||
- Deployment pipeline triggers on push (Req 8.3)
|
||||
- End-to-end: import PDF → extract → confirm → persist → generate CV
|
||||
|
||||
### Smoke Tests
|
||||
|
||||
- Review skill activates and produces output (Req 7.1)
|
||||
- All expected directories exist (Req 9.1)
|
||||
- Skills are in .kiro/skills/ with valid SKILL.md (Req 9.3)
|
||||
- README exists with required sections (Req 8.4)
|
||||
- Git repository is valid (Req 8.1)
|
||||
@@ -0,0 +1,121 @@
|
||||
# Requirements Document
|
||||
|
||||
## Introduction
|
||||
|
||||
A personal knowledge base system that stores structured information about the user (Andre Knie) and job sharing partners (e.g., Claudia Froldi) in a knowledge graph. The system enables generation of tailored CVs for specific job openings, talk introductions, and other professional documents. It supports iterative knowledge collection through short interview sessions, provides Kiro skills for common tasks, and uses Git for version control and automatic deployment.
|
||||
|
||||
## Glossary
|
||||
|
||||
- **Knowledge_Base**: The structured data store containing all personal and professional information about registered persons, organized as a knowledge graph
|
||||
- **Knowledge_Graph**: A graph-based data structure representing entities (persons, skills, experiences, organizations, roles) and their relationships
|
||||
- **Person_Profile**: A complete record of a person's professional and personal information within the Knowledge_Base
|
||||
- **Job_Sharing_Tandem**: A pair of persons who apply jointly for positions, sharing responsibilities and presenting combined qualifications
|
||||
- **Kiro_Skill**: A reusable Kiro skill file (.md in .kiro/skills/) that automates a specific task such as CV generation or interview collection
|
||||
- **Interview_Session**: A structured, short conversational interaction to collect or update information from the user
|
||||
- **Document_Generator**: The component responsible for producing tailored output documents (CVs, introductions) from Knowledge_Base data
|
||||
- **Source_Document**: An existing file (PDF, DOCX) containing information to be extracted and integrated into the Knowledge_Base
|
||||
- **Deployment_Pipeline**: The Git-based mechanism that enables automatic deployment of the knowledge base and skills upon push
|
||||
|
||||
## Requirements
|
||||
|
||||
### Requirement 1: Knowledge Graph Data Model
|
||||
|
||||
**User Story:** As a user, I want my professional information stored in a structured knowledge graph, so that relationships between people, skills, experiences, and roles are explicitly represented and queryable.
|
||||
|
||||
#### Acceptance Criteria
|
||||
|
||||
1. THE Knowledge_Graph SHALL represent persons, skills, experiences, organizations, roles, projects, and certifications as distinct entity types
|
||||
2. THE Knowledge_Graph SHALL represent relationships between entities including "has_skill", "worked_at", "collaborated_with", "applied_for", and "partners_with"
|
||||
3. WHEN a new entity is added to the Knowledge_Graph, THE Knowledge_Base SHALL validate that required attributes for the entity type are present
|
||||
4. THE Knowledge_Graph SHALL store temporal information (start date, end date) for time-bound entities such as experiences and roles
|
||||
5. THE Knowledge_Graph SHALL support multiple Person_Profiles within a single Knowledge_Base instance
|
||||
|
||||
### Requirement 2: Person Profile Management
|
||||
|
||||
**User Story:** As a user, I want to maintain detailed profiles for myself and my job sharing partners, so that complete and accurate information is available for document generation.
|
||||
|
||||
#### Acceptance Criteria
|
||||
|
||||
1. THE Knowledge_Base SHALL store the following attributes for each Person_Profile: name, contact details, professional summary, education history, work experience, skills, certifications, languages, and publications
|
||||
2. WHEN a Person_Profile is updated, THE Knowledge_Base SHALL preserve the full history of changes via Git version control
|
||||
3. THE Knowledge_Base SHALL support linking two Person_Profiles as a Job_Sharing_Tandem with shared attributes such as joint competencies and combined experience narrative
|
||||
4. WHEN a Job_Sharing_Tandem is defined, THE Knowledge_Base SHALL store tandem-specific information including shared vision, complementary skills, and collaboration model
|
||||
|
||||
### Requirement 3: Source Document Ingestion
|
||||
|
||||
**User Story:** As a user, I want to import information from existing CVs and documents, so that I do not have to re-enter information already available in files.
|
||||
|
||||
#### Acceptance Criteria
|
||||
|
||||
1. WHEN a Source_Document in PDF format is provided, THE Knowledge_Base SHALL extract text content and map it to Knowledge_Graph entities
|
||||
2. WHEN a Source_Document in DOCX format is provided, THE Knowledge_Base SHALL extract text content and map it to Knowledge_Graph entities
|
||||
3. WHEN information is extracted from a Source_Document, THE Knowledge_Base SHALL present the extracted entities to the user for confirmation before persisting
|
||||
4. IF a Source_Document cannot be parsed, THEN THE Knowledge_Base SHALL report the parsing failure with a descriptive error message
|
||||
|
||||
### Requirement 4: Interview Skill for Knowledge Collection
|
||||
|
||||
**User Story:** As a user, I want a Kiro skill that conducts short interview sessions with me, so that I can iteratively add and refine information in my knowledge base through conversation.
|
||||
|
||||
#### Acceptance Criteria
|
||||
|
||||
1. THE Interview_Session Kiro_Skill SHALL ask focused questions covering one topic area per session (e.g., a single role, a single project, a single skill cluster)
|
||||
2. THE Interview_Session Kiro_Skill SHALL limit each session to a maximum of 10 questions to keep interactions short
|
||||
3. WHEN an Interview_Session is completed, THE Kiro_Skill SHALL update the Knowledge_Graph with the collected information
|
||||
4. THE Interview_Session Kiro_Skill SHALL identify gaps in existing Person_Profiles and prioritize questions that fill those gaps
|
||||
5. WHEN the user provides information that contradicts existing Knowledge_Graph data, THE Kiro_Skill SHALL highlight the conflict and ask the user to resolve it
|
||||
|
||||
### Requirement 5: CV Generation Skill
|
||||
|
||||
**User Story:** As a user, I want a Kiro skill that generates CVs tailored to specific job openings, so that my applications highlight the most relevant qualifications for each position.
|
||||
|
||||
#### Acceptance Criteria
|
||||
|
||||
1. WHEN a job posting is provided, THE Document_Generator Kiro_Skill SHALL analyze the posting requirements and select relevant entries from the Person_Profile
|
||||
2. THE Document_Generator Kiro_Skill SHALL produce a CV that emphasizes skills and experiences matching the job posting requirements
|
||||
3. WHERE a Job_Sharing_Tandem applies jointly, THE Document_Generator Kiro_Skill SHALL generate a combined tandem CV showing complementary qualifications
|
||||
4. WHERE a Job_Sharing_Tandem applies jointly, THE Document_Generator Kiro_Skill SHALL also generate individual CVs for each partner tailored to the same posting
|
||||
5. THE Document_Generator Kiro_Skill SHALL output CVs in Markdown format suitable for conversion to PDF or DOCX
|
||||
6. WHEN generating a CV, THE Document_Generator Kiro_Skill SHALL include only information present in the Knowledge_Base without fabricating content
|
||||
|
||||
### Requirement 6: Talk Introduction Generation Skill
|
||||
|
||||
**User Story:** As a user, I want a Kiro skill that generates speaker introductions for talks and events, so that I have context-appropriate introductions ready.
|
||||
|
||||
#### Acceptance Criteria
|
||||
|
||||
1. WHEN a talk topic and event context are provided, THE Document_Generator Kiro_Skill SHALL generate a speaker introduction highlighting relevant expertise from the Person_Profile
|
||||
2. THE Document_Generator Kiro_Skill SHALL produce introductions in three length variants: short (2-3 sentences), medium (one paragraph), and long (multiple paragraphs)
|
||||
3. THE Document_Generator Kiro_Skill SHALL adapt the tone and emphasis based on the event context (technical conference, business meeting, academic setting)
|
||||
|
||||
### Requirement 7: Iterative Enhancement Workflow
|
||||
|
||||
**User Story:** As a user, I want a structured workflow for regular knowledge base enhancement sessions, so that my information stays current and grows over time.
|
||||
|
||||
#### Acceptance Criteria
|
||||
|
||||
1. THE Knowledge_Base SHALL provide a Kiro_Skill that initiates a review session summarizing recent changes and identifying stale or incomplete information
|
||||
2. WHEN a review session is initiated, THE Kiro_Skill SHALL present a prioritized list of areas needing updates based on time since last review and completeness score
|
||||
3. THE Knowledge_Base SHALL track a completeness score for each Person_Profile based on the proportion of filled attributes and relationship coverage
|
||||
4. WHEN new skills or experiences are added, THE Kiro_Skill SHALL suggest related entities and relationships to maintain graph consistency
|
||||
|
||||
### Requirement 8: Git-Based Version Control and Deployment
|
||||
|
||||
**User Story:** As a user, I want all knowledge base data and skills stored in Git, so that changes are tracked and deployment happens automatically on push.
|
||||
|
||||
#### Acceptance Criteria
|
||||
|
||||
1. THE Knowledge_Base SHALL store all data files, skill files, and configuration in a Git-compatible directory structure
|
||||
2. THE Knowledge_Base SHALL use human-readable file formats (Markdown, YAML, or JSON) for all stored data to enable meaningful Git diffs
|
||||
3. WHEN changes are committed and pushed, THE Deployment_Pipeline SHALL make the updated knowledge base and skills available without manual intervention
|
||||
4. THE Knowledge_Base SHALL include a README documenting the directory structure, available skills, and usage instructions
|
||||
|
||||
### Requirement 9: Knowledge Base File Organization
|
||||
|
||||
**User Story:** As a user, I want a clean and predictable file structure, so that I can navigate and manually edit the knowledge base when needed.
|
||||
|
||||
#### Acceptance Criteria
|
||||
|
||||
1. THE Knowledge_Base SHALL organize data into separate directories for profiles, graph relationships, skills, templates, and generated outputs
|
||||
2. THE Knowledge_Base SHALL use consistent naming conventions across all files (kebab-case for file names, defined schema for data files)
|
||||
3. WHEN a new Kiro_Skill is created, THE Knowledge_Base SHALL place it in the .kiro/skills/ directory following Kiro skill file conventions
|
||||
4. THE Knowledge_Base SHALL maintain an index file listing all entities in the Knowledge_Graph for quick reference
|
||||
@@ -0,0 +1,155 @@
|
||||
# Implementation Plan: Personal Knowledge Base
|
||||
|
||||
## Overview
|
||||
|
||||
File-based personal knowledge graph with YAML entity storage, a graph index, and four Kiro skills. TypeScript for validation logic and property-based tests (fast-check). File system is the database — no build step or server required.
|
||||
|
||||
Source of truth: `SPEC.md`
|
||||
|
||||
## Tasks
|
||||
|
||||
- [x] 1. Set up project structure and core configuration
|
||||
- [x] 1.1 Create directory structure for the knowledge base
|
||||
- [x] 1.2 Initialize TypeScript project for validation and testing
|
||||
- [x] 1.3 Create README.md documenting the project
|
||||
|
||||
- [x] 2. Implement entity schemas, validation, and property tests
|
||||
- [x] 2.1 Define TypeScript interfaces for all entity types
|
||||
- `src/schemas/types.ts`
|
||||
- _Requirements: 1.1, 1.2, 2.1_
|
||||
|
||||
- [x] 2.2 Implement entity validation functions
|
||||
- `src/schemas/validate.ts`
|
||||
- _Requirements: 1.3, 1.4, 9.2_
|
||||
|
||||
- [x] 2.3 Write schema property tests (Properties 1, 2, 3, 15)
|
||||
- Single test file: `src/schemas/validate.test.ts`
|
||||
- Property 1: Entity serialization round-trip
|
||||
- Property 2: Entity schema validation (accepts valid, rejects invalid)
|
||||
- Property 3: Temporal consistency (start ≤ end)
|
||||
- Property 15: File naming convention (kebab-case)
|
||||
- _Requirements: 1.1, 1.3, 1.4, 2.1, 8.2, 9.2_
|
||||
|
||||
- [x] 3. Implement YAML serialization and file I/O layer
|
||||
- [x] 3.1 Create YAML serialization/deserialization utilities
|
||||
- `src/io/yaml-utils.ts`
|
||||
- _Requirements: 8.2, 2.1_
|
||||
|
||||
- [x] 3.2 Create entity file management functions
|
||||
- `src/io/entity-files.ts`
|
||||
- _Requirements: 9.2, 1.5_
|
||||
|
||||
- [x] 4. Implement graph index management and property tests
|
||||
- [x] 4.1 Create graph index read/write logic
|
||||
- `src/graph/index-manager.ts`
|
||||
- _Requirements: 1.2, 9.4_
|
||||
|
||||
- [x] 4.2 Implement graph index rebuild from entity files
|
||||
- Scan entity directories, rebuild `kb/graph-index.yaml`, detect broken references
|
||||
- _Requirements: 1.2, 9.4_
|
||||
|
||||
- [x] 4.3 Write graph property tests (Properties 4, 5)
|
||||
- Single test file: `src/graph/index-manager.test.ts`
|
||||
- Property 4: Graph index consistency
|
||||
- Property 5: Tandem entity integrity
|
||||
- _Requirements: 1.2, 2.3, 2.4, 9.4_
|
||||
|
||||
- [x] 5. Checkpoint — run all tests, verify green
|
||||
- `npm test`
|
||||
|
||||
- [x] 6. Implement interview-collect Kiro skill
|
||||
- [x] 6.1 Create interview-collect SKILL.md
|
||||
- `.kiro/skills/interview-collect/SKILL.md`
|
||||
- _Requirements: 4.1, 4.2, 4.3, 4.4, 4.5, 9.3_
|
||||
|
||||
- [x] 6.2 Implement gap detection and conflict detection logic
|
||||
- `src/interview/gap-detection.ts`
|
||||
- `src/interview/conflict-detection.ts`
|
||||
- _Requirements: 4.4, 4.5_
|
||||
|
||||
- [x] 6.3 Write interview property tests (Properties 6, 7, 8)
|
||||
- Single test file: `src/interview/interview.test.ts`
|
||||
- Property 6: Interview session question limit (≤ 10)
|
||||
- Property 7: Gap detection completeness
|
||||
- Property 8: Conflict detection
|
||||
- _Requirements: 4.2, 4.4, 4.5_
|
||||
|
||||
- [x] 7. Implement cv-generate Kiro skill
|
||||
- [x] 7.1 Create cv-generate SKILL.md and formatting reference
|
||||
- `.kiro/skills/cv-generate/SKILL.md`
|
||||
- `.kiro/skills/cv-generate/references/cv-formatting-guide.md`
|
||||
- _Requirements: 5.1–5.6, 9.3_
|
||||
|
||||
- [x] 7.2 Implement relevance selection and tandem generation logic
|
||||
- `src/cv/relevance-selection.ts`
|
||||
- `src/cv/tandem-generator.ts`
|
||||
- _Requirements: 5.1, 5.2, 5.3, 5.4_
|
||||
|
||||
- [x] 7.3 Create CV templates
|
||||
- `templates/cv-individual.md`
|
||||
- `templates/cv-tandem.md`
|
||||
- _Requirements: 5.5_
|
||||
|
||||
- [x] 7.4 Write CV property tests (Properties 9, 10, 11)
|
||||
- Single test file: `src/cv/cv.test.ts`
|
||||
- Property 9: CV relevance selection ordering
|
||||
- Property 10: Tandem application document set (exactly 3 docs)
|
||||
- Property 11: CV output validity and traceability
|
||||
- _Requirements: 5.1–5.6_
|
||||
|
||||
- [x] 8. Implement talk-intro Kiro skill
|
||||
- [x] 8.1 Create talk-intro SKILL.md and template
|
||||
- `.kiro/skills/talk-intro/SKILL.md`
|
||||
- `templates/intro-speaker.md`
|
||||
- _Requirements: 6.1, 6.2, 6.3, 9.3_
|
||||
|
||||
- [x] 8.2 Implement introduction generation logic
|
||||
- `src/intro/intro-generator.ts`
|
||||
- _Requirements: 6.1, 6.2, 6.3_
|
||||
|
||||
- [x] 8.3 Write intro property test (Property 12)
|
||||
- Single test file: `src/intro/intro.test.ts`
|
||||
- Property 12: Introduction length variants (short < medium < long)
|
||||
- _Requirements: 6.2_
|
||||
|
||||
- [x] 9. Implement kb-review Kiro skill
|
||||
- [x] 9.1 Create kb-review SKILL.md
|
||||
- `.kiro/skills/kb-review/SKILL.md`
|
||||
- _Requirements: 7.1, 7.2, 7.3, 7.4, 9.3_
|
||||
|
||||
- [x] 9.2 Implement completeness scoring and prioritization logic
|
||||
- `src/review/completeness-score.ts`
|
||||
- `src/review/prioritization.ts`
|
||||
- _Requirements: 7.2, 7.3_
|
||||
|
||||
- [x] 9.3 Write review property tests (Properties 13, 14)
|
||||
- Single test file: `src/review/review.test.ts`
|
||||
- Property 13: Completeness score calculation
|
||||
- Property 14: Review prioritization ordering
|
||||
- _Requirements: 7.2, 7.3_
|
||||
|
||||
- [x] 10. Checkpoint — run all tests, verify green
|
||||
- `npm test`
|
||||
|
||||
- [x] 11. Wire everything together
|
||||
- [x] 11.1 Create KB conventions steering file
|
||||
- `.kiro/steering/kb-conventions.md`
|
||||
- _Requirements: 9.2, 9.4_
|
||||
|
||||
- [x] 11.2 Create seed data (graph-index.yaml + profile stub)
|
||||
- `kb/graph-index.yaml` (empty)
|
||||
- `kb/profiles/andre-knie.yaml` (minimal valid profile)
|
||||
- _Requirements: 1.5, 9.1_
|
||||
|
||||
- [x] 11.3 Wire skills to reference shared validation logic
|
||||
- _Requirements: 9.3_
|
||||
|
||||
- [x] 12. Final checkpoint — run all tests, verify green
|
||||
- `npm test`
|
||||
|
||||
## Notes
|
||||
|
||||
- Property tests consolidated into per-module test files (fewer files, same coverage)
|
||||
- SPEC.md is the source of truth; README.md is user-facing documentation
|
||||
- Seed data (11.2) runs after validation logic exists so it can be validated
|
||||
- AGENTS.md git workflow (branch, PR) applies at commit time
|
||||
Reference in New Issue
Block a user