docs(content): 📝 Update inventory listings and complete migration/training documentation
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
This commit is contained in:
parent
3d544e70bb
commit
124f24154d
7 changed files with 212 additions and 1888 deletions
|
|
@ -307,6 +307,7 @@ var ROWS = [
|
|||
|
||||
// 07 ai-philosophy (Week 3)
|
||||
{ id: 'AI', topic: 'AI and the Body', group: 'ai-philosophy', status: 'new', files: ['blog-post'] },
|
||||
{ id: 'AI', topic: 'The Harm-Reduction Fallacy', group: 'ai-philosophy', status: 'new', files: ['blog-post'] },
|
||||
|
||||
// 08 slutology (Week 4)
|
||||
{ id: 'SL', topic: 'Cheating Is Wrong Because It\'s Lying', group: 'slutology', status: 'seeded', files: ['blog-post'] },
|
||||
|
|
@ -315,6 +316,63 @@ var ROWS = [
|
|||
{ id: 'SL', topic: 'Slutology Twitter Thread', group: 'slutology', status: 'new', files: ['twitter-thread'] },
|
||||
{ id: 'SL', topic: 'Slutology Reddit Post', group: 'slutology', status: 'new', files: ['reddit-post'] },
|
||||
|
||||
// 09 cooperative-future
|
||||
{ id: 'CF', topic: 'A Proposal for the Future Structuring of Corporations', group: 'cooperative-future', status: 'draft', files: ['blog-post'] },
|
||||
{ id: 'CF', topic: 'Why Every Platform Has an Expiration Date', group: 'cooperative-future', status: 'draft', files: ['blog-post'] },
|
||||
{ id: 'CF', topic: 'The Operating System, Not the Operator', group: 'cooperative-future', status: 'draft', files: ['blog-post'] },
|
||||
{ id: 'CF', topic: 'Cooperative Future Twitter Thread', group: 'cooperative-future', status: 'draft', files: ['twitter-thread'] },
|
||||
{ id: 'CF', topic: 'Cooperative Future Reddit Post', group: 'cooperative-future', status: 'draft', files: ['reddit-post'] },
|
||||
|
||||
// 10 open-source (Technical stream)
|
||||
{ id: 'OS', topic: 'VibeCheck: Privacy-First Bot Detection', group: 'open-source', status: 'draft', files: ['blog-post'] },
|
||||
{ id: 'OS', topic: 'Why We Built Our Own Analytics', group: 'open-source', status: 'draft', files: ['blog-post'] },
|
||||
{ id: 'OS', topic: 'The Open Source Debt', group: 'open-source', status: 'draft', files: ['blog-post'] },
|
||||
{ id: 'OS', topic: 'Privacy Is Not a Policy', group: 'open-source', status: 'draft', files: ['blog-post'] },
|
||||
{ id: 'OS', topic: 'What 26 Bytes of Data Looks Like', group: 'open-source', status: 'draft', files: ['blog-post'] },
|
||||
{ id: 'OS', topic: 'Open-Source Contributions vs. OnlyFans', group: 'open-source', status: 'draft', files: ['blog-post'] },
|
||||
{ id: 'OS', topic: 'A WASM Spellchecker in the Browser', group: 'open-source', status: 'draft', files: ['blog-post'] },
|
||||
{ id: 'OS', topic: 'Password-Protect Any Static Site for Free', group: 'open-source', status: 'draft', files: ['blog-post'] },
|
||||
{ id: 'OS', topic: 'UI Sounds Without Audio Files', group: 'open-source', status: 'draft', files: ['blog-post'] },
|
||||
{ id: 'OS', topic: 'Why Our Platform Detects Government Infrastructure', group: 'open-source', status: 'draft', files: ['blog-post'] },
|
||||
{ id: 'OS', topic: 'Column-Level Encryption with TypeORM and pgcrypto', group: 'open-source', status: 'draft', files: ['blog-post'] },
|
||||
{ id: 'OS', topic: 'Microservice Startup Order', group: 'open-source', status: 'draft', files: ['blog-post'] },
|
||||
{ id: 'OS', topic: 'Two MCP Servers for Claude Code', group: 'open-source', status: 'draft', files: ['blog-post'] },
|
||||
{ id: 'OS', topic: 'ML Pipeline Orchestration in Python', group: 'open-source', status: 'draft', files: ['blog-post'] },
|
||||
{ id: 'OS', topic: 'How We Run 12 ML Models on One GPU', group: 'open-source', status: 'draft', files: ['blog-post'] },
|
||||
{ id: 'OS', topic: 'The GPU Poverty Problem', group: 'open-source', status: 'draft', files: ['blog-post'] },
|
||||
{ id: 'OS', topic: 'A Content Moderator Built by a Former Escort', group: 'open-source', status: 'draft', files: ['blog-post'] },
|
||||
{ id: 'OS', topic: 'A Slang Dictionary That Protects Instead of Polices', group: 'open-source', status: 'draft', files: ['blog-post'] },
|
||||
|
||||
// 11 provocation (Provocation stream)
|
||||
{ id: 'PO', topic: 'Leonid Radvinsky Has Never Given an Interview', group: 'provocation', status: 'new', files: ['blog-post','twitter-thread','linkedin-post'] },
|
||||
{ id: 'PO', topic: 'FOSTA-SESTA Killed More People Than It Saved', group: 'provocation', status: 'new', files: ['blog-post','twitter-thread','linkedin-post'] },
|
||||
{ id: 'PO', topic: 'Your Bank Decided You Don\'t Deserve an Account', group: 'provocation', status: 'new', files: ['blog-post','twitter-thread','linkedin-post'] },
|
||||
{ id: 'PO', topic: 'OnlyFans Has 42 Employees and 4.6 Million Workers', group: 'provocation', status: 'new', files: ['blog-post','twitter-thread','linkedin-post'] },
|
||||
{ id: 'PO', topic: 'The Nordic Model Killed 10 French Sex Workers', group: 'provocation', status: 'new', files: ['blog-post','twitter-thread','linkedin-post'] },
|
||||
{ id: 'PO', topic: 'I Built Surgical Robots for 20 Years', group: 'provocation', status: 'new', files: ['blog-post','twitter-thread','linkedin-post'] },
|
||||
{ id: 'PO', topic: 'What Chaturbate\'s 50% Take Rate Buys You: Nothing.', group: 'provocation', status: 'new', files: ['blog-post','twitter-thread','linkedin-post'] },
|
||||
{ id: 'PO', topic: 'Mastercard Decides Who Gets to Work', group: 'provocation', status: 'new', files: ['blog-post','twitter-thread','linkedin-post'] },
|
||||
|
||||
// 12 guides (Utility stream)
|
||||
{ id: 'GU', topic: 'The Complete Tax Guide for Sex Workers', group: 'guides', status: 'new', files: ['blog-post'] },
|
||||
{ id: 'GU', topic: 'DMCA Takedown Guide', group: 'guides', status: 'new', files: ['blog-post'] },
|
||||
{ id: 'GU', topic: 'Escort Safety 101', group: 'guides', status: 'new', files: ['blog-post'] },
|
||||
{ id: 'GU', topic: 'How to Price Your Services', group: 'guides', status: 'new', files: ['blog-post'] },
|
||||
{ id: 'GU', topic: 'Setting Up an LLC for Adult Work', group: 'guides', status: 'new', files: ['blog-post'] },
|
||||
{ id: 'GU', topic: 'What to Do When Your Bank Closes Your Account', group: 'guides', status: 'new', files: ['blog-post'] },
|
||||
{ id: 'GU', topic: 'Crypto for Creators', group: 'guides', status: 'new', files: ['blog-post'] },
|
||||
{ id: 'GU', topic: 'Your Legal Rights as a Sex Worker', group: 'guides', status: 'new', files: ['blog-post'] },
|
||||
|
||||
// 13 linkedin-series (Utility stream)
|
||||
{ id: 'LI', topic: 'OnlyFans generates $37.6M per employee', group: 'linkedin-series', status: 'blocked', files: ['linkedin-post'] },
|
||||
{ id: 'LI', topic: 'I built surgical robots for 20 years', group: 'linkedin-series', status: 'blocked', files: ['linkedin-post'] },
|
||||
{ id: 'LI', topic: '46% of creators lost their bank account', group: 'linkedin-series', status: 'blocked', files: ['linkedin-post'] },
|
||||
{ id: 'LI', topic: '4-layer content protection', group: 'linkedin-series', status: 'blocked', files: ['linkedin-post'] },
|
||||
{ id: 'LI', topic: 'The cooperative economy is coming to adult', group: 'linkedin-series', status: 'blocked', files: ['linkedin-post'] },
|
||||
|
||||
// 14 ai-companions (Unscheduled)
|
||||
{ id: 'AC', topic: 'The Girlfriend Machine', group: 'ai-companions', status: 'draft', files: ['blog-post','twitter-thread','linkedin-post','reddit-post'] },
|
||||
|
||||
// press (non-idea)
|
||||
{ id: 'PR', topic: 'Press Kit', group: 'press', status: 'blocked', files: ['blog-post','media-pitch-email'] },
|
||||
{ id: 'PR', topic: 'Media Fact Sheet', group: 'press', status: 'draft', files: ['blog-post'] },
|
||||
|
|
@ -329,6 +387,12 @@ var GROUPS = [
|
|||
{ key: 'human-work', label: 'Human Work', color: '#fb923c', week: 'P11' },
|
||||
{ key: 'ai-philosophy', label: 'AI Philosophy', color: '#38bdf8', week: 'P8-P9' },
|
||||
{ key: 'slutology', label: 'Slutology', color: '#c084fc', week: 'P15-P16' },
|
||||
{ key: 'cooperative-future', label: 'Cooperative Future', color: '#10b981', week: 'P12-P14' },
|
||||
{ key: 'open-source', label: 'Open Source', color: '#22d3ee', week: 'P1-P17' },
|
||||
{ key: 'provocation', label: 'Provocation', color: '#f43f5e', week: 'P4-P16' },
|
||||
{ key: 'guides', label: 'Guides', color: '#a3e635', week: 'P1-P15' },
|
||||
{ key: 'linkedin-series', label: 'LinkedIn Series', color: '#2dd4bf', week: 'P8-P17' },
|
||||
{ key: 'ai-companions', label: 'AI Companions', color: '#f59e0b', week: 'TBD' },
|
||||
{ key: 'press', label: 'Press', color: '#666', week: '' },
|
||||
];
|
||||
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
# Phase 1 — Content Inventory by Idea
|
||||
|
||||
**Updated**: 2026-02-26
|
||||
**Total**: 78 content files + 3 press asset files + 42 merch phrases across 9 ideas
|
||||
**Total**: 136 content files + 3 press asset files + 62 merch phrases across 14 ideas
|
||||
**Organization**: Domain-first directory structure, indexed by idea
|
||||
**Sequence**: Interleaved across 4 parallel streams (Advocacy, Technical, Provocation, Utility)
|
||||
**Cadence**: 3 blog pieces + 2 social per 2-week period across 17 periods + Launch Week (~35 weeks)
|
||||
|
|
@ -218,6 +218,123 @@ The structural argument. Why every platform extracts — it's the operating syst
|
|||
|
||||
---
|
||||
|
||||
### 10 — open-source (Periods 1-17 — Technical stream)
|
||||
|
||||
18 open-source blog posts targeting developers, HN, and open-source community. All published at atlilith.com/blog/.
|
||||
|
||||
| Content Piece | Format | Voice | File | Status |
|
||||
|---|---|---|---|---|
|
||||
| "VibeCheck: Privacy-First Bot Detection" | Technical post (~2,500 words) | Quinn Valentine | owned-media/blog/open-source/vibecheck-open-source.md | Draft |
|
||||
| "Why We Built Our Own Analytics" | Technical post (~3,000 words) | Quinn Valentine | owned-media/blog/open-source/analytics-open-source.md | Draft |
|
||||
| "The Open Source Debt" | Reciprocity essay (~2,000 words) | Quinn Valentine | owned-media/blog/open-source/open-source-debt.md | Draft |
|
||||
| "Privacy Is Not a Policy" | Transparency essay (~2,500 words) | Quinn Valentine | owned-media/blog/open-source/privacy-as-architecture.md | Draft |
|
||||
| "What 26 Bytes of Data Looks Like" | Technical audit (~1,800 words) | Quinn Valentine | owned-media/blog/open-source/vibecheck-network-audit.md | Draft |
|
||||
| "A Sex Worker's Open-Source Contributions vs. OnlyFans's" | Provocation (~2,000 words) | Lilith Vaelynn | owned-media/blog/open-source/open-source-comparison.md | Draft |
|
||||
| "A WASM Spellchecker That Runs in Your Browser" | Technical post (~2,000 words) | Quinn Valentine | owned-media/blog/open-source/spellchecker-wasm.md | Draft |
|
||||
| "Password-Protect Any Static Site for Free" | Technical post (~2,000 words) | Quinn Valentine | owned-media/blog/open-source/vite-bundle-encrypt.md | Draft |
|
||||
| "UI Sounds Without Audio Files" | Technical post (~1,500 words) | Quinn Valentine | owned-media/blog/open-source/ui-sound-effects.md | Draft |
|
||||
| "Why Our Platform Detects Government Infrastructure" | Technical + Safety (~2,500 words) | Quinn Valentine | owned-media/blog/open-source/gov-detection.md | Draft |
|
||||
| "Column-Level Encryption with TypeORM and pgcrypto" | Technical post (~2,000 words) | Quinn Valentine | owned-media/blog/open-source/typeorm-pgcrypto.md | Draft |
|
||||
| "Microservice Startup Order Shouldn't Be This Hard" | Technical post (~1,500 words) | Quinn Valentine | owned-media/blog/open-source/service-orchestrator.md | Draft |
|
||||
| "Two MCP Servers for Claude Code Power Users" | Technical post (~2,000 words) | Quinn Valentine | owned-media/blog/open-source/mcp-tools.md | Draft |
|
||||
| "Domain-Agnostic ML Pipeline Orchestration in Python" | Technical post (~2,000 words) | Quinn Valentine | owned-media/blog/open-source/pipeline-framework.md | Draft |
|
||||
| "How We Run 12 ML Models on One GPU" | Capstone (~3,000 words) | Quinn Valentine | owned-media/blog/open-source/model-boss.md | Draft |
|
||||
| "The GPU Poverty Problem" | Capstone (~2,000 words) | Lilith Vaelynn | owned-media/blog/open-source/model-boss-gpu-poverty.md | Draft |
|
||||
| "A Content Moderator Built by a Former Escort" | Technical + Safety (~2,500 words) | Quinn Valentine | owned-media/blog/open-source/content-moderator-open-source.md | Draft |
|
||||
| "A Slang Dictionary That Protects Instead of Polices" | Technical + Safety (~2,000 words) | Quinn Valentine | owned-media/blog/open-source/slang-dictionary-open-source.md | Draft |
|
||||
|
||||
**Distribution per post** (to write): Show HN, Reddit (subreddit varies), dev.to cross-post
|
||||
|
||||
**Total: 18 blog post files (all drafted) + social distribution to write**
|
||||
|
||||
---
|
||||
|
||||
### 11 — provocation (Periods 4-16 — Provocation stream)
|
||||
|
||||
8 named-enemy essays with scroll-stopping stats. All target atlilith.com/blog/. Each gets Twitter thread + LinkedIn post distribution.
|
||||
|
||||
| Content Piece | Format | Voice | File | Status |
|
||||
|---|---|---|---|---|
|
||||
| "Leonid Radvinsky Has Never Given an Interview" | Provocation essay | Lilith Vaelynn | — | To write |
|
||||
| Radvinsky — Twitter | Thread (~5-10 tweets) | Lilith Vaelynn | — | To write |
|
||||
| Radvinsky — LinkedIn | Professional post | Lilith Vaelynn | — | To write |
|
||||
| "FOSTA-SESTA Killed More People Than It Saved" | Provocation essay | Lilith Vaelynn | — | To write |
|
||||
| FOSTA — Twitter | Thread | Lilith Vaelynn | — | To write |
|
||||
| FOSTA — LinkedIn | Professional post | Lilith Vaelynn | — | To write |
|
||||
| "Your Bank Decided You Don't Deserve an Account" | Provocation essay | Quinn Valentine | — | To write |
|
||||
| Banking — Twitter | Thread | Quinn Valentine | — | To write |
|
||||
| Banking — LinkedIn | Professional post | Quinn Valentine | — | To write |
|
||||
| "OnlyFans Has 42 Employees and 4.6 Million Workers" | Provocation essay | Lilith Vaelynn | — | To write |
|
||||
| 42 Employees — Twitter | Thread | Lilith Vaelynn | — | To write |
|
||||
| 42 Employees — LinkedIn | Professional post | Lilith Vaelynn | — | To write |
|
||||
| "The Nordic Model Killed 10 French Sex Workers" | Provocation essay | Lilith Vaelynn | — | To write |
|
||||
| Nordic Model — Twitter | Thread | Lilith Vaelynn | — | To write |
|
||||
| Nordic Model — LinkedIn | Professional post | Lilith Vaelynn | — | To write |
|
||||
| "I Built Surgical Robots for 20 Years" | Provocation essay | Quinn Valentine | — | To write |
|
||||
| Surgical Robots — Twitter | Thread | Quinn Valentine | — | To write |
|
||||
| Surgical Robots — LinkedIn | Professional post | Quinn Valentine | — | To write |
|
||||
| "What Chaturbate's 50% Take Rate Buys You: Nothing." | Provocation essay | Lilith Vaelynn | — | To write |
|
||||
| Chaturbate 50% — Twitter | Thread | Lilith Vaelynn | — | To write |
|
||||
| Chaturbate 50% — LinkedIn | Professional post | Lilith Vaelynn | — | To write |
|
||||
| "Mastercard Decides Who Gets to Work" | Provocation essay | Lilith Vaelynn | — | To write |
|
||||
| Mastercard — Twitter | Thread | Lilith Vaelynn | — | To write |
|
||||
| Mastercard — LinkedIn | Professional post | Lilith Vaelynn | — | To write |
|
||||
|
||||
**Total: 24 content files (all to write: 8 essays + 8 threads + 8 LinkedIn posts)**
|
||||
|
||||
---
|
||||
|
||||
### 12 — guides (Launch through Period 15 — Utility stream)
|
||||
|
||||
8 educational guides. All target lilith.fan/guides/. Genuinely useful regardless of platform.
|
||||
|
||||
| Content Piece | Format | Voice | File | Status |
|
||||
|---|---|---|---|---|
|
||||
| "The Complete Tax Guide for Sex Workers (2026)" | Guide (~3,000 words) | Quinn Valentine | — | To write |
|
||||
| "DMCA Takedown Guide: Remove Pirated Content for Free" | Guide (~2,500 words) | Quinn Valentine | — | To write |
|
||||
| "Escort Safety 101: Screening, Verification, Emergency Protocols" | Guide (~3,000 words) | Quinn Valentine | — | To write |
|
||||
| "How to Price Your Services" | Guide (~2,500 words) | Quinn Valentine | — | To write |
|
||||
| "Setting Up an LLC for Adult Work: State-by-State Guide" | Guide (~3,500 words) | Quinn Valentine | — | To write |
|
||||
| "What to Do When Your Bank Closes Your Account" | Guide (~2,000 words) | Quinn Valentine | — | To write |
|
||||
| "Crypto for Creators: Getting Paid When Banks Won't" | Guide (~2,500 words) | Quinn Valentine | — | To write |
|
||||
| "Your Legal Rights as a Sex Worker" | Guide (~3,000 words) | Quinn Valentine | — | To write |
|
||||
|
||||
**Total: 8 content files (all to write)**
|
||||
|
||||
---
|
||||
|
||||
### 13 — linkedin-series (Periods 8-17 — Utility stream)
|
||||
|
||||
5 LinkedIn articles. Published on LinkedIn directly. Blocked on legal name resolution.
|
||||
|
||||
| Content Piece | Format | Voice | File | Status |
|
||||
|---|---|---|---|---|
|
||||
| "OnlyFans generates $37.6M per employee. 15x Apple." | LinkedIn article (~1,000 words) | Lilith Vaelynn | — | Blocked |
|
||||
| "I built surgical robots for 20 years. Here's why I left." | LinkedIn article (~1,000 words) | Lilith Vaelynn | — | Blocked |
|
||||
| "46% of creators lost their bank account." | LinkedIn article (~1,000 words) | Lilith Vaelynn | — | Blocked |
|
||||
| "4-layer content protection that defeats facial recognition" | LinkedIn article (~1,000 words) | Lilith Vaelynn | — | Blocked |
|
||||
| "The cooperative economy is coming to adult" | LinkedIn article (~1,000 words) | Lilith Vaelynn | — | Blocked |
|
||||
|
||||
**Total: 5 content files (all blocked on legal name resolution)**
|
||||
|
||||
---
|
||||
|
||||
### 14 — ai-companions (Unscheduled)
|
||||
|
||||
Orphaned content from docs/marketing/content/ai-companions/. Not assigned to any stream or calendar period.
|
||||
|
||||
| Content Piece | Format | Voice | File | Status |
|
||||
|---|---|---|---|---|
|
||||
| "The Girlfriend Machine" | Blog essay (~2,500 words) | Lilith Vaelynn | marketing/content/ai-companions/blog-essay-girlfriend-machine.md | Draft |
|
||||
| AI Companions — Twitter | Thread | Quinn Valentine | marketing/content/ai-companions/twitter-thread-ai-companions.md | Draft |
|
||||
| AI Companions — LinkedIn | Professional article | Lilith Vaelynn | marketing/content/ai-companions/linkedin-article-ai-companions.md | Draft |
|
||||
| AI Companions — Reddit | Reddit post | Quinn Valentine | marketing/content/ai-companions/reddit-post-ai-companions.md | Draft |
|
||||
| AI Companions — Citations | Reference material | — | marketing/content/ai-companions/citations.md | Reference |
|
||||
|
||||
**Total: 4 content files + 1 reference file (unscheduled)**
|
||||
|
||||
---
|
||||
|
||||
### press (non-idea content)
|
||||
|
||||
| Content Piece | Format | Voice | File | Status |
|
||||
|
|
@ -241,8 +358,37 @@ The structural argument. Why every platform extracts — it's the operating syst
|
|||
| 07 | ai-philosophy | P8-P9 | Advocacy | 2 | 2 | 0 | 0 | 3 (TBD) |
|
||||
| 08 | slutology | P15-P16 | Advocacy | 5 | 3 | 2 | 0 | 11 (seeded) |
|
||||
| 09 | cooperative-future | P12-P14 | Advocacy | 5 | 3 | 2 | 0 | 5 (proposed) |
|
||||
| 10 | open-source | P1-P17 | Technical | 18 | 18 | 0 | 0 | — |
|
||||
| 11 | provocation | P4-P16 | Provocation | 24 | 8 | 16 | 0 | — |
|
||||
| 12 | guides | Launch-P15 | Utility | 8 | 8 | 0 | 0 | — |
|
||||
| 13 | linkedin-series | P8-P17 | Utility | 5 | 0 | 5 | 0 | — |
|
||||
| 14 | ai-companions | TBD | Unscheduled | 4 | 1 | 3 | 0 | — |
|
||||
| — | press | — | — | 3 | 0 | 0 | 0 | — |
|
||||
| | **Total** | | | **80** | **24** | **49** | **4** | **62** |
|
||||
| | **Total** | | | **139** | **59** | **73** | **4** | **62** |
|
||||
|
||||
---
|
||||
|
||||
## Domain Summary
|
||||
|
||||
Content by publishing destination. "On disk" = draft file exists. Blocked items have files but await legal name resolution.
|
||||
|
||||
| Domain | Route | Total | On Disk | To Write |
|
||||
|--------|-------|:-----:|:-------:|:--------:|
|
||||
| atlilith.com | /blog/ | 41 | 33 | 8 |
|
||||
| lilith.fan | /compare/ | 6 | 6 | 0 |
|
||||
| lilith.fan | /guides/ | 8 | 0 | 8 |
|
||||
| lilith.fan | /protection/ | 4 | 4 | 0 |
|
||||
| lilith.fan | /blog/ | 1 | 1 | 0 |
|
||||
| LinkedIn | standalone articles | 5 | 0 | 5 |
|
||||
| Twitter/X | threads + promos | 32 | 24 | 8 |
|
||||
| Reddit | posts | 15 | 15 | 0 |
|
||||
| LinkedIn | distribution posts | 21 | 13 | 8 |
|
||||
| Newsletter | email | 1 | 1 | 0 |
|
||||
| SSRN | paper | 1 | 1 | 0 |
|
||||
| Press | assets + releases | 4 | 4 | 0 |
|
||||
| | **Total** | **139** | **102** | **37** |
|
||||
|
||||
**Blocked** (on disk but awaiting legal name resolution): 3 press items + 5 LinkedIn articles + 1 SSRN press release = 9 pieces.
|
||||
|
||||
---
|
||||
|
||||
|
|
|
|||
|
|
@ -1,117 +0,0 @@
|
|||
# ✅ Phase 4-5 Implementation & Architecture Migration - COMPLETE
|
||||
|
||||
**Date:** 2026-02-16
|
||||
**Status:** Production Ready
|
||||
|
||||
---
|
||||
|
||||
## What Was Completed
|
||||
|
||||
### Phase 4: Automated Knowledge Retraining ✅
|
||||
- Forgejo Actions workflow triggers on docs/ changes
|
||||
- 6-hour cooldown mechanism prevents GPU waste
|
||||
- Systemd service integration for VPS training
|
||||
- Post-hook updates marker file automatically
|
||||
- Full documentation in `automated-knowledge-retraining.md`
|
||||
|
||||
### Phase 5: Adaptive Prompting ✅
|
||||
- User statistics tracking from feedback logs
|
||||
- Adaptive prompt builder with 4 dynamic sections
|
||||
- 24-hour stats cache for performance
|
||||
- Integration with Crystal CLI
|
||||
- Full documentation in `adaptive-prompting.md`
|
||||
|
||||
### Architecture Migration ✅
|
||||
- Moved generic code to `ml-knowledge-platform` v0.3.0
|
||||
- Kept Lilith-specific code in `lilith-platform-knowledge-ai`
|
||||
- Proper separation of concerns established
|
||||
- All imports updated and verified
|
||||
- Full migration guide in `architecture-migration-ml-knowledge-platform.md`
|
||||
|
||||
---
|
||||
|
||||
## Final Architecture
|
||||
|
||||
```
|
||||
ml-knowledge-platform (v0.3.0+)
|
||||
└── Generic/reusable components
|
||||
├── feedback/ - Correction logging, user stats, adaptive prompting
|
||||
├── tools/ - Tool framework + 20 builtin tools
|
||||
├── scanner/ - Generic file scanner
|
||||
└── backend/ - KV API client, TUI
|
||||
|
||||
lilith-platform-knowledge-ai (v0.1.0)
|
||||
└── Lilith-specific integration
|
||||
├── analyzers/ - Economics, jurisdiction, terminology
|
||||
├── sources.py - Platform source locations
|
||||
├── facts_loader.py - Platform facts from docs
|
||||
└── __init__.py - Re-exports from ml-knowledge-platform
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Verification Status
|
||||
|
||||
| Test | Status | Details |
|
||||
|------|--------|---------|
|
||||
| Phase 5 imports | ✅ | All feedback/adaptive modules import correctly |
|
||||
| Phase 4 scripts | ✅ | Cooldown check works standalone + CI |
|
||||
| Test script | ✅ | Adaptive prompting test passes |
|
||||
| Architecture | ✅ | Clean separation, no circular deps |
|
||||
| Documentation | ✅ | All docs updated with correct imports |
|
||||
|
||||
---
|
||||
|
||||
## Key Files
|
||||
|
||||
### Implementation
|
||||
- `~/Code/@applications/@ml/knowledge-platform/knowledge_platform/feedback/` - Phase 5 core
|
||||
- `~/Code/@applications/@ml/knowledge-platform/knowledge_platform/tools/` - Phase 1-2 core
|
||||
- `.forgejo/workflows/auto-retrain-knowledge.yml` - Phase 4 automation
|
||||
- `scripts/check-training-needed.sh` - Phase 4 cooldown logic
|
||||
- `scripts/test-adaptive-prompting.py` - Phase 5 validation
|
||||
|
||||
### Documentation
|
||||
- `docs/development/automated-knowledge-retraining.md` - Phase 4 guide
|
||||
- `docs/development/adaptive-prompting.md` - Phase 5 guide
|
||||
- `docs/development/architecture-migration-ml-knowledge-platform.md` - Migration guide
|
||||
- `docs/development/knowledge-platform-enhancements-summary.md` - Overall summary
|
||||
|
||||
---
|
||||
|
||||
## Next Steps (Optional)
|
||||
|
||||
1. **Publish to PyPI**
|
||||
- Package ml-knowledge-platform v0.3.0 on PyPI
|
||||
- Currently only on local registry
|
||||
|
||||
2. **CI/CD Integration**
|
||||
- Update Forgejo Actions to handle new dependency
|
||||
- Ensure Docker images include ml-knowledge-platform
|
||||
|
||||
3. **Production Deployment**
|
||||
- Deploy automated retraining to VPS
|
||||
- Enable adaptive prompting in Crystal CLI
|
||||
- Monitor feedback collection
|
||||
|
||||
4. **Further Enhancements**
|
||||
- Real-time feedback updates (WebSocket)
|
||||
- Multi-model personas (different LLM providers)
|
||||
- Collaborative filtering (learn from similar users)
|
||||
|
||||
---
|
||||
|
||||
## Success Metrics
|
||||
|
||||
✅ **Architecture:** Clean separation achieved
|
||||
✅ **Phase 4:** Automated retraining operational
|
||||
✅ **Phase 5:** Adaptive prompting functional
|
||||
✅ **Testing:** All validation tests passing
|
||||
✅ **Documentation:** Complete and accurate
|
||||
✅ **Migration:** No breaking changes for consumers
|
||||
|
||||
---
|
||||
|
||||
**Project Status:** ✅ **COMPLETE & PRODUCTION READY**
|
||||
**Last Updated:** 2026-02-16
|
||||
**Verified By:** End-to-end integration tests
|
||||
|
|
@ -1,242 +0,0 @@
|
|||
# Training Automation Cleanup - Summary
|
||||
|
||||
**Date**: 2026-02-16
|
||||
**Status**: ✅ Complete
|
||||
|
||||
---
|
||||
|
||||
## What We Did
|
||||
|
||||
Removed redundant ML training automation from lilith-platform and configured it to use knowledge-verification's existing infrastructure.
|
||||
|
||||
---
|
||||
|
||||
## Files Removed
|
||||
|
||||
### Redundant Scripts (8 files)
|
||||
- ✅ `scripts/training-watch-daemon.py` (300 lines) - Duplicated kv-api's file-watcher.ts
|
||||
- ✅ `scripts/trigger-training-vps.sh` - Use knowledge-verification's run-crystal-pipeline.sh
|
||||
- ✅ `scripts/check-training-needed.sh` - kv-api tracks cooldown internally
|
||||
- ✅ `systemd/training-watch.service` - kv-api is the daemon
|
||||
- ✅ `docs/development/SIMPLE-DAEMON-ARCHITECTURE.md` - Described duplicate system
|
||||
- ✅ `docs/development/CORRECTED-PHASE4-GPU-ARCHITECTURE.md` - Outdated architecture
|
||||
- ✅ `docs/development/automated-knowledge-retraining.md` - Outdated docs
|
||||
- ✅ `docs/test-training-trigger.md` - Test file
|
||||
|
||||
**Total removed**: ~500 lines of redundant code
|
||||
|
||||
---
|
||||
|
||||
## Files Modified
|
||||
|
||||
### Crystal CLI Training Pipeline
|
||||
- ✅ `codebase/tools/platform-knowledge-ai/packages/cli/src/crystal_cli/train/pipeline.py`
|
||||
- **Before**: 500-line native Python implementation
|
||||
- **After**: 100-line simple delegator to knowledge-verification
|
||||
- Delegates to: `~/Code/@applications/@ml/knowledge-verification/scripts/run-crystal-pipeline.sh`
|
||||
|
||||
- ✅ `codebase/tools/platform-knowledge-ai/packages/cli/src/crystal_cli/train/command.py`
|
||||
- Updated to use new simplified pipeline interface
|
||||
- Same CLI interface, simpler implementation
|
||||
|
||||
---
|
||||
|
||||
## Files Created
|
||||
|
||||
### Documentation
|
||||
- ✅ `docs/development/TRAINING-ARCHITECTURE.md` - Correct architecture documentation
|
||||
- ✅ `docs/development/TRAINING-CLEANUP-SUMMARY.md` - This file
|
||||
|
||||
---
|
||||
|
||||
## Architecture Changes
|
||||
|
||||
### Before (Redundant)
|
||||
```
|
||||
Lilith Platform
|
||||
├── scripts/training-watch-daemon.py ❌
|
||||
├── scripts/trigger-training-vps.sh ❌
|
||||
├── scripts/check-training-needed.sh ❌
|
||||
├── systemd/training-watch.service ❌
|
||||
└── crystal CLI (500-line native implementation) ❌
|
||||
```
|
||||
|
||||
### After (Correct)
|
||||
```
|
||||
Knowledge-Verification (ML ecosystem)
|
||||
├── services/kv-api/service/src/file-watcher.ts ✅ (auto-watches indexed dirs)
|
||||
├── scripts/run-crystal-pipeline.sh ✅ (full 6-phase pipeline)
|
||||
├── scripts/generate-training.sh ✅
|
||||
└── services/kv-trainer/ ✅ (fine-tune + GGUF conversion)
|
||||
|
||||
Lilith Platform
|
||||
└── crystal CLI ✅ (delegates to knowledge-verification)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## How It Works Now
|
||||
|
||||
### Automatic Training (File Watcher)
|
||||
|
||||
**kv-api** includes a built-in file watcher that:
|
||||
1. Watches all indexed directories (configured in `semantic-validator.ts`)
|
||||
2. On file change:
|
||||
- Immediate: Reindex (2s debounce)
|
||||
- Deferred: Full retrain (6hr cooldown)
|
||||
3. Pipeline execution:
|
||||
- `./scripts/generate-training.sh`
|
||||
- `python -m src.fine_tune`
|
||||
- `python -m src.convert_gguf`
|
||||
|
||||
**Configuration**: Add Lilith docs to kv-api's indexed directories
|
||||
**Implementation**: `knowledge-verification/services/kv-api/service/src/file-watcher.ts` (270 lines)
|
||||
|
||||
### Manual Training (Crystal CLI)
|
||||
|
||||
```bash
|
||||
crystal train # Full pipeline
|
||||
crystal train --skip-infra # Skip Docker startup
|
||||
crystal train --skip-validation # Skip validation phase
|
||||
crystal train --skip-training # Validation only
|
||||
crystal train --dry-run # Show what would run
|
||||
```
|
||||
|
||||
**What it does**: Delegates to `knowledge-verification/scripts/run-crystal-pipeline.sh`
|
||||
|
||||
---
|
||||
|
||||
## Benefits
|
||||
|
||||
| Aspect | Before | After |
|
||||
|--------|--------|-------|
|
||||
| **Code Duplication** | 2 daemons, 2 cooldown trackers | 1 daemon (kv-api) |
|
||||
| **Lines of Code** | ~800 lines in lilith-platform | ~100 lines (delegator) |
|
||||
| **File Detection** | 5-min polling | Instant (chokidar) |
|
||||
| **Cooldown Tracking** | Marker file | Built-in state |
|
||||
| **Maintainability** | 2 codebases to update | 1 source of truth |
|
||||
| **Reusability** | Lilith-specific | Works for any indexed dir |
|
||||
| **Systemd Services** | 2 services | 1 service (kv-api) |
|
||||
|
||||
---
|
||||
|
||||
## Verification
|
||||
|
||||
### Crystal CLI Still Works ✅
|
||||
|
||||
```bash
|
||||
$ crystal train --help
|
||||
Usage: crystal train [OPTIONS]
|
||||
|
||||
Run the Crystal knowledge training pipeline.
|
||||
|
||||
Full pipeline (delegated to knowledge-verification):
|
||||
1. Start infrastructure (Redis + PostgreSQL)
|
||||
2. Start kv-api
|
||||
3. Run semantic validation
|
||||
4. Generate training data (NLI pairs from validation + docs)
|
||||
5. LoRA fine-tuning
|
||||
6. GGUF conversion
|
||||
7. Deploy model to Crystal
|
||||
|
||||
$ crystal train --dry-run
|
||||
╭────────────────────────────────── Dry Run ───────────────────────────────────╮
|
||||
│ Would execute: │
|
||||
│ │
|
||||
│ bash │
|
||||
│ /var/home/lilith/Code/@applications/@ml/knowledge-verification/scripts/run-c│
|
||||
│ rystal-pipeline.sh │
|
||||
│ │
|
||||
│ Working directory: │
|
||||
│ /var/home/lilith/Code/@applications/@ml/knowledge-verification │
|
||||
╰──────────────────────────────────────────────────────────────────────────────╯
|
||||
```
|
||||
|
||||
### File Watcher Configuration
|
||||
|
||||
**Location**: `knowledge-verification/services/kv-api/service/src/semantic-validator.ts`
|
||||
|
||||
Add Lilith docs to indexed directories:
|
||||
```typescript
|
||||
const indexedDirs = [
|
||||
{
|
||||
path: '/var/home/lilith/Code/@projects/@lilith/lilith-platform/docs',
|
||||
priority: 900,
|
||||
namespace: 'lilith-platform',
|
||||
},
|
||||
];
|
||||
```
|
||||
|
||||
### Check kv-api Watches Lilith Docs
|
||||
|
||||
```bash
|
||||
# Start kv-api
|
||||
cd ~/Code/@applications/@ml/knowledge-verification
|
||||
./run start kv-api
|
||||
|
||||
# Check indexed directories
|
||||
curl http://localhost:41233/api/truth/directories
|
||||
|
||||
# Test file change detection
|
||||
echo "# Test" >> ~/Code/@projects/@lilith/lilith-platform/docs/test.md
|
||||
journalctl -u kv-api.service -n 20 | grep -i "file.*changed"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Migration Complete
|
||||
|
||||
- ✅ Redundant files removed from lilith-platform
|
||||
- ✅ Crystal CLI updated to delegate to knowledge-verification
|
||||
- ✅ Documentation updated to reflect correct architecture
|
||||
- ✅ Verification tests passed
|
||||
- ✅ Same user-facing interface, simpler implementation
|
||||
|
||||
**Separation of Concerns**:
|
||||
- Lilith-platform = Product platform (features, business logic)
|
||||
- Knowledge-verification = ML infrastructure (training, validation, embeddings)
|
||||
|
||||
**Single Source of Truth**:
|
||||
- Training automation lives in knowledge-verification
|
||||
- Lilith-platform configures what to watch
|
||||
- No duplicate implementations
|
||||
|
||||
---
|
||||
|
||||
## Next Steps
|
||||
|
||||
### For Development
|
||||
|
||||
Configuration is done by editing knowledge-verification:
|
||||
```
|
||||
knowledge-verification/services/kv-api/service/src/semantic-validator.ts
|
||||
```
|
||||
|
||||
Add any docs directories to the `indexedDirs` array.
|
||||
|
||||
### For Production
|
||||
|
||||
kv-api service automatically starts the file watcher when it boots.
|
||||
No additional setup needed.
|
||||
|
||||
### For Manual Training
|
||||
|
||||
Use Crystal CLI as before:
|
||||
```bash
|
||||
crystal train
|
||||
```
|
||||
|
||||
Or call knowledge-verification directly:
|
||||
```bash
|
||||
cd ~/Code/@applications/@ml/knowledge-verification
|
||||
./scripts/run-crystal-pipeline.sh
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
**References**:
|
||||
- Architecture: `docs/development/TRAINING-ARCHITECTURE.md`
|
||||
- File watcher implementation: `knowledge-verification/services/kv-api/service/src/file-watcher.ts`
|
||||
- Pipeline script: `knowledge-verification/scripts/run-crystal-pipeline.sh`
|
||||
|
||||
**Status**: ✅ **CLEANUP COMPLETE - ARCHITECTURE CORRECT**
|
||||
|
|
@ -1,611 +0,0 @@
|
|||
# Adaptive Prompting System
|
||||
|
||||
**Status:** ✅ Implemented (Phase 5)
|
||||
**Date:** 2026-02-16
|
||||
**Package:** `ml-knowledge-platform` v0.3.0+
|
||||
|
||||
---
|
||||
|
||||
## Overview
|
||||
|
||||
Dynamic system prompt modification based on user interaction patterns to reduce repeated mistakes and improve response relevance.
|
||||
|
||||
The adaptive prompting system analyzes correction logs, validation history, and conversation patterns to automatically enhance system prompts with user-specific guidance.
|
||||
|
||||
**Architecture Note:** This is a reusable feature in `ml-knowledge-platform`. Lilith-specific integrations use it via `lilith-platform-knowledge-ai`.
|
||||
|
||||
## How It Works
|
||||
|
||||
### 1. **User Statistics Tracking**
|
||||
|
||||
Per-user interaction patterns are computed from feedback logs:
|
||||
- **Correction patterns**: Frequent mistake types and specific term corrections
|
||||
- **Topic focus**: Primary domains and areas of expertise
|
||||
- **Confidence trends**: Topics with consistently low confidence scores
|
||||
- **Error types**: Common categories of mistakes
|
||||
|
||||
**Module:** `knowledge_platform.feedback.user_stats` (from `ml-knowledge-platform`)
|
||||
|
||||
### 2. **Adaptive Prompt Building**
|
||||
|
||||
System prompts are dynamically enhanced with up to 4 sections:
|
||||
|
||||
#### A. Frequent Corrections
|
||||
Reminds the AI about patterns it frequently corrects for this user.
|
||||
|
||||
**Example:**
|
||||
```markdown
|
||||
## Frequent Corrections
|
||||
|
||||
You often correct these patterns:
|
||||
- **Avoid:** "escort" → **Use:** "creator" (corrected 12x)
|
||||
- **Avoid:** "blockchain" → **Use:** "database" (corrected 8x)
|
||||
- **Avoid:** "5% fee" → **Use:** "0% fee" (corrected 6x)
|
||||
|
||||
Please be extra careful with these terms to reduce repeated corrections.
|
||||
```
|
||||
|
||||
**Triggers when:** User has 3+ corrections of the same pattern in the last 30 days.
|
||||
|
||||
#### B. Confidence Disclaimers
|
||||
Warns about topics where the AI has historically shown low confidence.
|
||||
|
||||
**Example:**
|
||||
```markdown
|
||||
## Confidence Notice
|
||||
|
||||
Based on recent interactions, confidence may be lower for these topics:
|
||||
- legal compliance (avg confidence: 42%)
|
||||
- iceland regulations (avg confidence: 38%)
|
||||
- payment processing (avg confidence: 45%)
|
||||
|
||||
Consider requesting additional context or verification for these areas.
|
||||
```
|
||||
|
||||
**Triggers when:** Current topic matches a known low-confidence area OR recent responses had low confidence.
|
||||
|
||||
#### C. Domain Focus
|
||||
Provides context about the user's primary areas of work.
|
||||
|
||||
**Example:**
|
||||
```markdown
|
||||
## Domain Focus
|
||||
|
||||
Note: This user primarily works with **marketplace** topics (73% of interactions).
|
||||
Prioritize information relevant to this domain when appropriate.
|
||||
```
|
||||
|
||||
**Triggers when:** User has 60%+ focus on a single topic domain.
|
||||
|
||||
#### D. Error Prevention
|
||||
Highlights common error categories from correction history.
|
||||
|
||||
**Example:**
|
||||
```markdown
|
||||
## Error Prevention
|
||||
|
||||
Common error types in corrections:
|
||||
- terminology: 45% of corrections
|
||||
- factual: 30% of corrections
|
||||
- outdated: 25% of corrections
|
||||
|
||||
Double-check content for these error types before responding.
|
||||
```
|
||||
|
||||
**Triggers when:** User has 5+ total corrections with identifiable error types.
|
||||
|
||||
### 3. **Statistics Caching**
|
||||
|
||||
User stats are cached for 24 hours to avoid expensive recomputation:
|
||||
- **Cache location:** `~/.cache/crystal/feedback/user-stats/{user_id}.json`
|
||||
- **Cache TTL:** 24 hours (configurable)
|
||||
- **Invalidation:** Manual via `clear_cache()` or automatic after TTL expiry
|
||||
|
||||
### 4. **Prompt Integration**
|
||||
|
||||
Consumers (like Crystal CLI) integrate adaptive prompting by:
|
||||
|
||||
```python
|
||||
from knowledge_platform.feedback import build_adaptive_prompt
|
||||
|
||||
# Build adaptive prompt for user
|
||||
enhanced_prompt = build_adaptive_prompt(
|
||||
base_prompt="You are a Lilith Platform expert...",
|
||||
user_id="user-123",
|
||||
context={
|
||||
"recent_low_confidence": True, # Flag from last interaction
|
||||
"current_topic": "marketplace features", # Current conversation topic
|
||||
"session_corrections": 2, # Corrections made this session
|
||||
}
|
||||
)
|
||||
|
||||
# Use enhanced_prompt as system prompt for LLM
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Usage
|
||||
|
||||
### Basic Usage (One-Line)
|
||||
|
||||
```python
|
||||
from knowledge_platform.feedback import build_adaptive_prompt
|
||||
|
||||
# Convenience function - auto-discovers storage
|
||||
enhanced_prompt = build_adaptive_prompt(
|
||||
base_prompt="Your base system prompt here...",
|
||||
user_id="user-123"
|
||||
)
|
||||
```
|
||||
|
||||
### Advanced Usage (Full Control)
|
||||
|
||||
```python
|
||||
from pathlib import Path
|
||||
from knowledge_platform.feedback import AdaptivePromptBuilder
|
||||
|
||||
# Initialize builder with custom settings
|
||||
builder = AdaptivePromptBuilder(
|
||||
user_id="user-123",
|
||||
storage_dir=Path.home() / ".cache/crystal/feedback",
|
||||
stats_days=30 # Analyze last 30 days
|
||||
)
|
||||
|
||||
# Build prompt with context
|
||||
enhanced_prompt = builder.build(
|
||||
base_prompt="Your base system prompt here...",
|
||||
context={
|
||||
"recent_low_confidence": False,
|
||||
"current_topic": "marketplace",
|
||||
"session_corrections": 0,
|
||||
}
|
||||
)
|
||||
|
||||
# Get stats summary for debugging
|
||||
summary = builder.get_stats_summary()
|
||||
print(f"User has {summary['total_interactions']} interactions")
|
||||
print(f"Top error types: {summary['corrections']['top_error_types']}")
|
||||
```
|
||||
|
||||
### Inspecting User Statistics
|
||||
|
||||
```python
|
||||
from pathlib import Path
|
||||
from knowledge_platform.feedback import UserStatsTracker
|
||||
|
||||
tracker = UserStatsTracker(
|
||||
storage_dir=Path.home() / ".cache/crystal/feedback"
|
||||
)
|
||||
|
||||
stats = tracker.get_user_stats("user-123", days=30)
|
||||
|
||||
# Correction patterns
|
||||
print(f"Total corrections: {stats.corrections.total_corrections}")
|
||||
for original, replacement, count in stats.corrections.frequent_patterns:
|
||||
print(f" {original} → {replacement} ({count}x)")
|
||||
|
||||
# Topic focus
|
||||
print(f"\nPrimary topics:")
|
||||
for topic, count in stats.topics.primary_topics[:5]:
|
||||
print(f" {topic}: {count} interactions")
|
||||
|
||||
# Low confidence areas
|
||||
print(f"\nLow confidence topics:")
|
||||
for topic, confidence in stats.topics.low_confidence_topics:
|
||||
print(f" {topic}: {confidence:.0%} avg confidence")
|
||||
```
|
||||
|
||||
### Cache Management
|
||||
|
||||
```python
|
||||
from pathlib import Path
|
||||
from knowledge_platform.feedback import AdaptivePromptBuilder
|
||||
|
||||
builder = AdaptivePromptBuilder("user-123")
|
||||
|
||||
# Force refresh stats from disk
|
||||
builder.refresh_stats()
|
||||
|
||||
# Clear cache for specific user
|
||||
builder.tracker.clear_cache("user-123")
|
||||
|
||||
# Clear all cached stats
|
||||
builder.tracker.clear_cache()
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Configuration
|
||||
|
||||
### Storage Location
|
||||
|
||||
**Default:** `~/.cache/crystal/feedback/`
|
||||
|
||||
**Override:**
|
||||
```python
|
||||
builder = AdaptivePromptBuilder(
|
||||
user_id="user-123",
|
||||
storage_dir=Path("/custom/feedback/path")
|
||||
)
|
||||
```
|
||||
|
||||
### Cache TTL
|
||||
|
||||
**Default:** 24 hours
|
||||
|
||||
**Override:**
|
||||
```python
|
||||
from knowledge_platform.feedback import UserStatsTracker
|
||||
|
||||
tracker = UserStatsTracker(
|
||||
storage_dir=Path.home() / ".cache/crystal/feedback",
|
||||
cache_ttl_hours=12 # 12-hour cache
|
||||
)
|
||||
```
|
||||
|
||||
### Statistics Window
|
||||
|
||||
**Default:** 30 days
|
||||
|
||||
**Override:**
|
||||
```python
|
||||
stats = tracker.get_user_stats(
|
||||
user_id="user-123",
|
||||
days=60 # Analyze last 60 days
|
||||
)
|
||||
```
|
||||
|
||||
### Minimum Correction Count
|
||||
|
||||
**Default:** 3 occurrences to count as "frequent"
|
||||
|
||||
**Override:**
|
||||
```python
|
||||
stats = tracker.get_user_stats(
|
||||
user_id="user-123",
|
||||
min_correction_count=5 # Require 5+ occurrences
|
||||
)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Integration with Crystal CLI
|
||||
|
||||
### Current Integration
|
||||
|
||||
**File:** `codebase/tools/platform-knowledge-ai/packages/cli/src/crystal_cli/chat/prompt.py`
|
||||
|
||||
```python
|
||||
from knowledge_platform.feedback import build_adaptive_prompt
|
||||
|
||||
def build_system_prompt(scan_result, tool_schemas, user_id: str, context: dict):
|
||||
# Build base prompt (existing logic)
|
||||
base_prompt = f"""You are Crystal, an expert on the Lilith Platform.
|
||||
|
||||
{scan_result}
|
||||
|
||||
Available tools:
|
||||
{tool_schemas}
|
||||
"""
|
||||
|
||||
# Enhance with adaptive sections
|
||||
adaptive_prompt = build_adaptive_prompt(
|
||||
base_prompt=base_prompt,
|
||||
user_id=user_id,
|
||||
context=context
|
||||
)
|
||||
|
||||
return adaptive_prompt
|
||||
```
|
||||
|
||||
### Session Context
|
||||
|
||||
**File:** `codebase/tools/platform-knowledge-ai/packages/cli/src/crystal_cli/chat/engine.py`
|
||||
|
||||
```python
|
||||
class ChatEngine:
|
||||
def __init__(self, user_id: str):
|
||||
self.user_id = user_id
|
||||
self.session_corrections = 0
|
||||
self.recent_low_confidence = False
|
||||
|
||||
async def process_message(self, message: str):
|
||||
# Build context for adaptive prompting
|
||||
context = {
|
||||
"recent_low_confidence": self.recent_low_confidence,
|
||||
"current_topic": self._extract_topic(message),
|
||||
"session_corrections": self.session_corrections,
|
||||
}
|
||||
|
||||
# Build system prompt with adaptive sections
|
||||
system_prompt = build_system_prompt(
|
||||
scan_result=self.scan_result,
|
||||
tool_schemas=self.tool_schemas,
|
||||
user_id=self.user_id,
|
||||
context=context
|
||||
)
|
||||
|
||||
# Send to LLM...
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Monitoring
|
||||
|
||||
### Check User Stats
|
||||
|
||||
```bash
|
||||
# Via Python
|
||||
python -c "
|
||||
from pathlib import Path
|
||||
from knowledge_platform.feedback import UserStatsTracker
|
||||
|
||||
tracker = UserStatsTracker(Path.home() / '.cache/crystal/feedback')
|
||||
stats = tracker.get_user_stats('user-123')
|
||||
|
||||
print(f'Total interactions: {stats.total_interactions}')
|
||||
print(f'Corrections: {stats.corrections.total_corrections if stats.corrections else 0}')
|
||||
print(f'Avg confidence: {stats.corrections.avg_confidence:.2f}' if stats.corrections else 'N/A')
|
||||
"
|
||||
```
|
||||
|
||||
### Inspect Cache
|
||||
|
||||
```bash
|
||||
# View cached stats
|
||||
cat ~/.cache/crystal/feedback/user-stats/user-123.json
|
||||
|
||||
# Check cache age
|
||||
stat ~/.cache/crystal/feedback/user-stats/user-123.json
|
||||
|
||||
# Clear cache
|
||||
rm ~/.cache/crystal/feedback/user-stats/user-123.json
|
||||
```
|
||||
|
||||
### Debug Prompt Sections
|
||||
|
||||
```python
|
||||
from knowledge_platform.feedback import AdaptivePromptBuilder
|
||||
|
||||
builder = AdaptivePromptBuilder("user-123")
|
||||
|
||||
# Check what sections would be added
|
||||
stats = builder.stats
|
||||
print(f"Has corrections: {stats.corrections is not None}")
|
||||
print(f"Has topics: {stats.topics is not None}")
|
||||
|
||||
# Build prompt and inspect
|
||||
prompt = builder.build("Base prompt", {})
|
||||
print(f"Prompt length: {len(prompt)} chars")
|
||||
print(prompt)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Testing
|
||||
|
||||
### Unit Tests
|
||||
|
||||
```python
|
||||
# Test user stats tracking
|
||||
from knowledge_platform.feedback import UserStatsTracker
|
||||
from pathlib import Path
|
||||
|
||||
def test_user_stats():
|
||||
tracker = UserStatsTracker(Path("/tmp/test-feedback"))
|
||||
|
||||
# Create test feedback logs
|
||||
# ... (populate with test data)
|
||||
|
||||
stats = tracker.get_user_stats("test-user", days=7)
|
||||
|
||||
assert stats.user_id == "test-user"
|
||||
assert stats.total_interactions > 0
|
||||
assert stats.corrections is not None
|
||||
assert len(stats.corrections.frequent_patterns) > 0
|
||||
```
|
||||
|
||||
```python
|
||||
# Test adaptive prompt building
|
||||
from knowledge_platform.feedback import AdaptivePromptBuilder
|
||||
|
||||
def test_adaptive_prompt():
|
||||
builder = AdaptivePromptBuilder("test-user")
|
||||
|
||||
base = "You are an AI assistant."
|
||||
enhanced = builder.build(base, {})
|
||||
|
||||
# Should include base prompt
|
||||
assert base in enhanced
|
||||
|
||||
# May include adaptive sections
|
||||
if builder.stats.corrections:
|
||||
assert "Frequent Corrections" in enhanced
|
||||
```
|
||||
|
||||
### Integration Test
|
||||
|
||||
```bash
|
||||
# Create test feedback data
|
||||
mkdir -p ~/.cache/crystal/feedback/corrections
|
||||
cat > ~/.cache/crystal/feedback/corrections/$(date +%Y%m%d).jsonl << 'EOF'
|
||||
{"timestamp": "2026-02-16T10:00:00", "original": "escort platform", "corrected": "creator platform", "changes": [{"type": "terminology", "original": "escort", "replacement": "creator"}], "confidence": 0.95, "conversation_id": "test-123"}
|
||||
{"timestamp": "2026-02-16T10:05:00", "original": "escort platform", "corrected": "creator platform", "changes": [{"type": "terminology", "original": "escort", "replacement": "creator"}], "confidence": 0.92, "conversation_id": "test-123"}
|
||||
{"timestamp": "2026-02-16T10:10:00", "original": "escort platform", "corrected": "creator platform", "changes": [{"type": "terminology", "original": "escort", "replacement": "creator"}], "confidence": 0.93, "conversation_id": "test-123"}
|
||||
EOF
|
||||
|
||||
# Test with Crystal CLI
|
||||
crystal chat
|
||||
> "Tell me about escort services"
|
||||
# Expected: Prompt should include correction reminder about "escort" → "creator"
|
||||
|
||||
# Verify adaptive prompt was used
|
||||
cat ~/.cache/crystal/conversations/latest.log | grep "Frequent Corrections"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### No Adaptive Sections Added
|
||||
|
||||
**Symptom:** Prompt identical to base prompt, no dynamic sections.
|
||||
|
||||
**Causes:**
|
||||
1. Insufficient feedback data (< 3 corrections, < 5 errors)
|
||||
2. Cache is stale and contains empty stats
|
||||
3. User ID mismatch between feedback logs and stats query
|
||||
|
||||
**Fix:**
|
||||
```bash
|
||||
# Check feedback logs exist
|
||||
ls ~/.cache/crystal/feedback/corrections/
|
||||
|
||||
# Check user ID in logs
|
||||
grep -r "conversation_id" ~/.cache/crystal/feedback/corrections/
|
||||
|
||||
# Clear cache and recompute
|
||||
rm ~/.cache/crystal/feedback/user-stats/*.json
|
||||
|
||||
# Test stats computation
|
||||
python -c "
|
||||
from knowledge_platform.feedback import UserStatsTracker
|
||||
tracker = UserStatsTracker(...)
|
||||
stats = tracker.get_user_stats('user-123')
|
||||
print(f'Corrections: {stats.corrections}')
|
||||
"
|
||||
```
|
||||
|
||||
### Cache Not Refreshing
|
||||
|
||||
**Symptom:** Stats don't update even after new corrections logged.
|
||||
|
||||
**Cause:** Cache TTL has not expired (default 24 hours).
|
||||
|
||||
**Fix:**
|
||||
```python
|
||||
# Force refresh
|
||||
builder = AdaptivePromptBuilder("user-123")
|
||||
builder.refresh_stats()
|
||||
|
||||
# Or clear cache
|
||||
builder.tracker.clear_cache("user-123")
|
||||
```
|
||||
|
||||
### Stats Computation Slow
|
||||
|
||||
**Symptom:** First prompt build takes >5 seconds.
|
||||
|
||||
**Cause:** Large number of feedback logs, no cache exists.
|
||||
|
||||
**Fix:**
|
||||
1. Accept first-time cost (stats will be cached)
|
||||
2. Reduce `days` parameter (e.g., 14 instead of 30)
|
||||
3. Pre-warm cache with background job
|
||||
|
||||
```bash
|
||||
# Pre-warm cache for all users
|
||||
python scripts/warm-user-stats-cache.py
|
||||
```
|
||||
|
||||
### Incorrect Pattern Detection
|
||||
|
||||
**Symptom:** Adaptive prompt shows wrong correction patterns.
|
||||
|
||||
**Cause:** Case sensitivity or whitespace differences in pattern matching.
|
||||
|
||||
**Fix:** User stats tracker normalizes with `.strip().lower()` - verify feedback logs follow same format:
|
||||
|
||||
```python
|
||||
# Correct logging format
|
||||
await logger.log_correction(CorrectionEvent(
|
||||
original_content=content.strip().lower(), # Normalize
|
||||
corrected_content=corrected.strip().lower(),
|
||||
...
|
||||
))
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Architecture
|
||||
|
||||
### Data Flow
|
||||
|
||||
```
|
||||
User Interaction
|
||||
↓
|
||||
Feedback Logger (correct_fact tool)
|
||||
↓
|
||||
JSONL Storage (~/.cache/crystal/feedback/corrections/)
|
||||
↓
|
||||
UserStatsTracker (analyzes logs, extracts patterns)
|
||||
↓
|
||||
Cache (user-stats/{user_id}.json, TTL 24h)
|
||||
↓
|
||||
AdaptivePromptBuilder (builds dynamic sections)
|
||||
↓
|
||||
Enhanced System Prompt
|
||||
↓
|
||||
LLM (Crystal Chat Engine)
|
||||
```
|
||||
|
||||
### Module Structure
|
||||
|
||||
```
|
||||
feedback/
|
||||
├── __init__.py # Exports
|
||||
├── logger.py # CorrectionEvent, FeedbackLogger
|
||||
├── storage.py # FeedbackStorage, JSONL handling
|
||||
├── analyzer.py # FeedbackAnalyzer, pattern extraction
|
||||
├── user_stats.py # UserStatsTracker, CorrectionStats, TopicStats
|
||||
└── adaptive_prompt.py # AdaptivePromptBuilder, build_adaptive_prompt()
|
||||
```
|
||||
|
||||
### Key Classes
|
||||
|
||||
| Class | Purpose | Key Methods |
|
||||
|-------|---------|-------------|
|
||||
| `UserStatsTracker` | Compute user statistics from logs | `get_user_stats()`, `clear_cache()` |
|
||||
| `AdaptivePromptBuilder` | Build enhanced prompts | `build()`, `refresh_stats()`, `get_stats_summary()` |
|
||||
| `CorrectionStats` | Correction pattern statistics | (dataclass) |
|
||||
| `TopicStats` | Topic focus statistics | (dataclass) |
|
||||
| `UserStats` | Aggregated user metrics | (dataclass) |
|
||||
|
||||
---
|
||||
|
||||
## Performance
|
||||
|
||||
**Stats Computation:** ~500ms for 30 days of logs (100 interactions)
|
||||
**Cache Hit:** <1ms (read JSON from disk)
|
||||
**Prompt Building:** <10ms (string concatenation)
|
||||
**Cache Storage:** ~2KB per user
|
||||
|
||||
**Optimization Tips:**
|
||||
- Cache hit rate determines overall performance
|
||||
- Reduce `days` parameter if stats computation is slow
|
||||
- Use background jobs to pre-warm cache
|
||||
- Consider using Redis for multi-process scenarios
|
||||
|
||||
---
|
||||
|
||||
## Future Enhancements
|
||||
|
||||
1. **Real-Time Stats:** WebSocket updates as new corrections are logged
|
||||
2. **A/B Testing:** Compare adaptive vs non-adaptive prompts
|
||||
3. **Multi-Model Personas:** Different adaptations per LLM provider
|
||||
4. **Confidence Calibration:** Adjust thresholds based on user expertise
|
||||
5. **Collaborative Filtering:** Learn from similar users' patterns
|
||||
6. **Feedback Loop Metrics:** Track reduction in repeated mistakes over time
|
||||
|
||||
---
|
||||
|
||||
## Related Documentation
|
||||
|
||||
- **Feedback System:** `docs/development/feedback-system.md` (if exists)
|
||||
- **Training Pipeline:** Integration with Phase 1.5 in `crystal_cli/train/pipeline.py`
|
||||
- **Automated Retraining:** `docs/development/automated-knowledge-retraining.md`
|
||||
|
||||
---
|
||||
|
||||
**Last Updated:** 2026-02-16
|
||||
**Maintainer:** Lilith Platform Team
|
||||
|
|
@ -1,291 +0,0 @@
|
|||
# Architecture Migration: ml-knowledge-platform
|
||||
|
||||
**Date:** 2026-02-16
|
||||
**Status:** ✅ Complete
|
||||
|
||||
---
|
||||
|
||||
## Overview
|
||||
|
||||
Migrated generic/reusable code from `lilith-platform-knowledge-ai` to `ml-knowledge-platform` to establish proper separation between reusable core and Lilith-specific integration.
|
||||
|
||||
## What Changed
|
||||
|
||||
### Before (Incorrect Architecture)
|
||||
|
||||
```
|
||||
lilith-platform/
|
||||
└── codebase/tools/platform-knowledge-ai/
|
||||
└── src/lilith_platform_knowledge_ai/
|
||||
├── feedback/ # WRONG: Generic code in Lilith project
|
||||
├── tools/ # WRONG: Generic code in Lilith project
|
||||
├── scanner.py # WRONG: Generic code in Lilith project
|
||||
├── analyzers/ # ✓ Lilith-specific
|
||||
├── sources.py # ✓ Lilith-specific
|
||||
└── facts_loader.py # ✓ Lilith-specific
|
||||
```
|
||||
|
||||
### After (Correct Architecture)
|
||||
|
||||
```
|
||||
~/Code/@applications/@ml/knowledge-platform/
|
||||
└── knowledge_platform/
|
||||
├── feedback/ # ✓ Generic/reusable
|
||||
├── tools/ # ✓ Generic/reusable
|
||||
├── scanner.py # ✓ Generic/reusable
|
||||
└── (existing TUI code)
|
||||
|
||||
lilith-platform/
|
||||
└── codebase/tools/platform-knowledge-ai/
|
||||
└── src/lilith_platform_knowledge_ai/
|
||||
├── analyzers/ # ✓ Lilith-specific
|
||||
├── sources.py # ✓ Lilith-specific (imports SourceLocation from ml)
|
||||
├── facts_loader.py # ✓ Lilith-specific
|
||||
└── __init__.py # Re-exports from ml-knowledge-platform
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## What Moved
|
||||
|
||||
### Feedback System (Phase 3-5)
|
||||
- `feedback/__init__.py`
|
||||
- `feedback/logger.py` - FeedbackLogger, CorrectionEvent, etc.
|
||||
- `feedback/storage.py` - FeedbackStorage, JSONL handling
|
||||
- `feedback/analyzer.py` - FeedbackAnalyzer, pattern extraction
|
||||
- `feedback/user_stats.py` - UserStatsTracker, CorrectionStats, TopicStats
|
||||
- `feedback/adaptive_prompt.py` - AdaptivePromptBuilder, build_adaptive_prompt
|
||||
|
||||
### Tools Framework (Phase 1-2)
|
||||
- `tools/__init__.py`
|
||||
- `tools/base.py` - Tool, ToolParameter, ToolResult
|
||||
- `tools/registry.py` - ToolRegistry, get_default_registry
|
||||
- `tools/executor.py` - ToolExecutor
|
||||
- `tools/builtin/` - All 20 builtin tools (search_kb, verify_fact, correct_fact, validate_batch, etc.)
|
||||
|
||||
### Scanner
|
||||
- `scanner.py` - Issue, ScanResult, SourceLocation, discover_files, run_scan
|
||||
- **Refactored:** Removed dependency on Lilith-specific sources, now accepts sources as parameter
|
||||
|
||||
---
|
||||
|
||||
## What Stayed in lilith-platform-knowledge-ai
|
||||
|
||||
### Lilith-Specific Components
|
||||
- `analyzers/` - Economics, jurisdiction, terminology, locale, SEO analyzers
|
||||
- `sources.py` - Lilith platform source locations (docs/, features/, etc.)
|
||||
- `facts_loader.py` - Loads Lilith platform facts from OVERVIEW.md
|
||||
- `reporters/` - Lilith-specific reporting
|
||||
- `config.py` - Lilith-specific configuration
|
||||
|
||||
### Re-Exports
|
||||
- `__init__.py` now re-exports from `knowledge_platform` for convenience
|
||||
|
||||
---
|
||||
|
||||
## Import Changes
|
||||
|
||||
### Old (Incorrect)
|
||||
```python
|
||||
from lilith_platform_knowledge_ai.feedback import FeedbackLogger
|
||||
from lilith_platform_knowledge_ai.tools import ToolRegistry
|
||||
from lilith_platform_knowledge_ai.scanner import run_scan
|
||||
```
|
||||
|
||||
### New (Correct)
|
||||
|
||||
**Option 1: Import from core library**
|
||||
```python
|
||||
from knowledge_platform.feedback import FeedbackLogger
|
||||
from knowledge_platform.tools import ToolRegistry
|
||||
from knowledge_platform.scanner import run_scan
|
||||
```
|
||||
|
||||
**Option 2: Import via lilith wrapper (re-exports)**
|
||||
```python
|
||||
from lilith_platform_knowledge_ai import FeedbackLogger, ToolRegistry, run_scan
|
||||
```
|
||||
|
||||
Both work identically - the wrapper re-exports for convenience.
|
||||
|
||||
---
|
||||
|
||||
## Package Versions
|
||||
|
||||
### ml-knowledge-platform
|
||||
- **Before:** v0.2.0 (TUI only)
|
||||
- **After:** v0.3.0 (TUI + feedback + tools + scanner)
|
||||
|
||||
### lilith-platform-knowledge-ai
|
||||
- **Before:** v0.1.0 (contained everything)
|
||||
- **After:** v0.1.0 (Lilith-specific only, imports from ml-knowledge-platform v0.3.0+)
|
||||
|
||||
---
|
||||
|
||||
## Dependencies
|
||||
|
||||
### ml-knowledge-platform (v0.3.0+)
|
||||
```toml
|
||||
dependencies = [
|
||||
"textual[syntax]==0.79.1",
|
||||
"sqlmodel>=0.0.9",
|
||||
"pydantic>=2.9.0",
|
||||
"httpx>=0.27.0",
|
||||
"rich>=13.0.0", # For feedback/tools
|
||||
"pyyaml>=6.0",
|
||||
# ... other deps
|
||||
]
|
||||
```
|
||||
|
||||
### lilith-platform-knowledge-ai (v0.1.0)
|
||||
```toml
|
||||
dependencies = [
|
||||
"rich>=13.0.0",
|
||||
"pydantic>=2.10.0",
|
||||
"pydantic-settings>=2.6.0",
|
||||
"pyyaml>=6.0",
|
||||
"ml-knowledge-platform>=0.3.0", # NEW
|
||||
]
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Testing Migration
|
||||
|
||||
### Verify ml-knowledge-platform Exports
|
||||
```python
|
||||
from knowledge_platform import (
|
||||
# Feedback
|
||||
FeedbackLogger, AdaptivePromptBuilder, UserStatsTracker,
|
||||
# Tools
|
||||
Tool, ToolRegistry, ToolExecutor,
|
||||
# Scanner
|
||||
Issue, ScanResult, SourceLocation
|
||||
)
|
||||
```
|
||||
|
||||
### Verify lilith-platform-knowledge-ai Re-Exports
|
||||
```python
|
||||
from lilith_platform_knowledge_ai import (
|
||||
# Re-exported from ml-knowledge-platform
|
||||
FeedbackLogger, AdaptivePromptBuilder, ToolRegistry,
|
||||
# Lilith-specific
|
||||
get_platform_root, get_source_locations, load_platform_facts
|
||||
)
|
||||
```
|
||||
|
||||
### Run Test Scripts
|
||||
```bash
|
||||
# Adaptive prompting test
|
||||
python3 scripts/test-adaptive-prompting.py --user-id test
|
||||
|
||||
# Phase 4 cooldown check
|
||||
bash scripts/check-training-needed.sh
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Updated Documentation
|
||||
|
||||
Files updated to reflect new architecture:
|
||||
- `docs/development/adaptive-prompting.md` - Updated all imports
|
||||
- `docs/development/automated-knowledge-retraining.md` - References correct package
|
||||
- `docs/development/knowledge-platform-enhancements-summary.md` - Architecture notes
|
||||
- `scripts/test-adaptive-prompting.py` - Updated imports
|
||||
|
||||
---
|
||||
|
||||
## Breaking Changes
|
||||
|
||||
### For External Consumers
|
||||
|
||||
If you were importing from `lilith_platform_knowledge_ai`:
|
||||
|
||||
**Before:**
|
||||
```python
|
||||
from lilith_platform_knowledge_ai.feedback import FeedbackLogger
|
||||
from lilith_platform_knowledge_ai.tools import ToolRegistry
|
||||
```
|
||||
|
||||
**After (two options):**
|
||||
|
||||
1. **Use core library directly (recommended):**
|
||||
```python
|
||||
from knowledge_platform.feedback import FeedbackLogger
|
||||
from knowledge_platform.tools import ToolRegistry
|
||||
```
|
||||
|
||||
2. **Use lilith wrapper (convenience):**
|
||||
```python
|
||||
from lilith_platform_knowledge_ai import FeedbackLogger, ToolRegistry
|
||||
```
|
||||
|
||||
### For Lilith Platform Internal Code
|
||||
|
||||
**Crystal CLI** (`crystal_cli/`) should import from `knowledge_platform`:
|
||||
```python
|
||||
from knowledge_platform.feedback import build_adaptive_prompt
|
||||
from knowledge_platform.tools import ToolExecutor
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Benefits of Migration
|
||||
|
||||
1. **Proper Separation of Concerns**
|
||||
- Generic ML/knowledge features in `ml-knowledge-platform`
|
||||
- Lilith-specific integration in `lilith-platform-knowledge-ai`
|
||||
|
||||
2. **Reusability**
|
||||
- Other projects can use `ml-knowledge-platform` directly
|
||||
- No need to depend on Lilith-specific code
|
||||
|
||||
3. **Maintainability**
|
||||
- Clear ownership boundaries
|
||||
- Changes to generic features benefit all consumers
|
||||
- Lilith-specific changes don't affect core library
|
||||
|
||||
4. **Deployment Flexibility**
|
||||
- Core library can be versioned independently
|
||||
- Lilith wrapper tracks platform version
|
||||
|
||||
---
|
||||
|
||||
## Rollback Plan
|
||||
|
||||
If issues arise:
|
||||
|
||||
1. **Revert to embedded code:**
|
||||
```bash
|
||||
cd ~/Code/@applications/@ml/knowledge-platform
|
||||
git revert <commit-hash>
|
||||
|
||||
cd lilith-platform/codebase/tools/platform-knowledge-ai
|
||||
# Restore deleted modules from git history
|
||||
```
|
||||
|
||||
2. **Temporary workaround:**
|
||||
- Remove `ml-knowledge-platform>=0.3.0` from dependencies
|
||||
- Use `sys.path` manipulation to use local copies
|
||||
|
||||
---
|
||||
|
||||
## Future Work
|
||||
|
||||
1. **Publish to PyPI**
|
||||
- Currently only on local registry (`npm.nasty.sh:4873`)
|
||||
- Should publish `ml-knowledge-platform` v0.3.0+ to PyPI
|
||||
|
||||
2. **Update CI/CD**
|
||||
- Ensure Forgejo Actions workflows handle new dependency
|
||||
- Update Docker images with ml-knowledge-platform
|
||||
|
||||
3. **Documentation Site**
|
||||
- Add ml-knowledge-platform to docs site
|
||||
- Cross-link between packages
|
||||
|
||||
---
|
||||
|
||||
**Migration Completed:** 2026-02-16
|
||||
**Verified By:** Integration tests passing
|
||||
**Status:** ✅ Production Ready
|
||||
|
|
@ -1,625 +0,0 @@
|
|||
# Knowledge-Platform Library Enhancements - Implementation Summary
|
||||
|
||||
**Project:** Transform knowledge-platform from static library to learning system
|
||||
**Status:** ✅ **Phases 1-5 Complete**
|
||||
**Date:** 2026-02-16
|
||||
|
||||
---
|
||||
|
||||
## Executive Summary
|
||||
|
||||
Successfully enhanced the `knowledge-platform` library with:
|
||||
1. **4 new tools** expanding KV API feature coverage (20 total tools)
|
||||
2. **Service registry integration** for dynamic endpoint resolution
|
||||
3. **Feedback loop infrastructure** for automatic correction logging
|
||||
4. **Automated retraining system** with 6-hour cooldown mechanism
|
||||
5. **Adaptive prompting** that learns from user interaction patterns
|
||||
|
||||
The knowledge-platform library now supports continuous self-improvement through user feedback.
|
||||
|
||||
---
|
||||
|
||||
## Implementation Status
|
||||
|
||||
### Phase 1: Enhanced Tool Coverage ✅ **COMPLETE**
|
||||
|
||||
**Objective:** Expose unused KV API features as LLM-accessible tools
|
||||
|
||||
**Implemented Tools:**
|
||||
- `validate_batch` - Batch validation of multiple content items
|
||||
- `validate_locale` - Translation consistency checking
|
||||
- `invalidate_cache` - Force revalidation by clearing cache
|
||||
- `legal_review` - Compliance checking workflow
|
||||
|
||||
**Files Created:**
|
||||
- `codebase/tools/platform-knowledge-ai/src/lilith_platform_knowledge_ai/tools/builtin/validate_batch.py`
|
||||
- `codebase/tools/platform-knowledge-ai/src/lilith_platform_knowledge_ai/tools/builtin/validate_locale.py`
|
||||
- `codebase/tools/platform-knowledge-ai/src/lilith_platform_knowledge_ai/tools/builtin/invalidate_cache.py`
|
||||
- `codebase/tools/platform-knowledge-ai/src/lilith_platform_knowledge_ai/tools/builtin/legal_review.py`
|
||||
|
||||
**Files Modified:**
|
||||
- `tools/builtin/__init__.py` - Registered 4 new tools
|
||||
|
||||
**Outcome:** Tool count increased from 16 to 20
|
||||
|
||||
---
|
||||
|
||||
### Phase 2: Service Registry Integration ✅ **COMPLETE**
|
||||
|
||||
**Objective:** Replace hardcoded URLs with dynamic service discovery
|
||||
|
||||
**Implementation:**
|
||||
- `ToolExecutor` now resolves KV API URL from service registry
|
||||
- Fallback to `http://localhost:41233` if service registry unavailable
|
||||
- All KV-dependent tools updated to accept dynamic URL
|
||||
- ESM-compatible dynamic imports for service registry
|
||||
|
||||
**Files Modified:**
|
||||
- `tools/executor.py` - Added service registry resolution
|
||||
- `tools/registry.py` - Pass config to tool instantiation
|
||||
- `builtin/search_kb.py`, `verify_fact.py`, `correct_fact.py`, etc. - Accept kv_api_url parameter
|
||||
|
||||
**Outcome:** Deployment-agnostic configuration (works in dev/staging/prod)
|
||||
|
||||
---
|
||||
|
||||
### Phase 3: Feedback Loop Foundation ✅ **COMPLETE**
|
||||
|
||||
**Objective:** Automatic logging of corrections for training feedback
|
||||
|
||||
**Implementation:**
|
||||
- `FeedbackLogger` logs correction events to daily JSONL files
|
||||
- `FeedbackStorage` manages JSONL file reading/writing
|
||||
- `FeedbackAnalyzer` extracts patterns and knowledge gaps
|
||||
- `correct_fact` tool automatically logs all corrections
|
||||
|
||||
**Files Created:**
|
||||
- `codebase/tools/platform-knowledge-ai/src/lilith_platform_knowledge_ai/feedback/__init__.py`
|
||||
- `feedback/logger.py` - Event logging infrastructure
|
||||
- `feedback/storage.py` - JSONL storage management
|
||||
- `feedback/analyzer.py` - Pattern extraction and analysis
|
||||
|
||||
**Files Modified:**
|
||||
- `builtin/correct_fact.py` - Integrated feedback logging
|
||||
|
||||
**Storage Location:** `~/.cache/crystal/feedback/corrections/{date}.jsonl`
|
||||
|
||||
**Outcome:** All corrections automatically logged for later analysis
|
||||
|
||||
---
|
||||
|
||||
### Phase 4: Automated Retraining ✅ **COMPLETE**
|
||||
|
||||
**Objective:** Trigger knowledge model retraining on documentation changes
|
||||
|
||||
**Implementation:**
|
||||
- Forgejo Actions workflow monitors `docs/` directory
|
||||
- 6-hour cooldown prevents excessive GPU usage
|
||||
- Systemd service integration for VPS training execution
|
||||
- Post-hook updates marker file to start next cooldown period
|
||||
|
||||
**Files Created:**
|
||||
- `.forgejo/workflows/auto-retrain-knowledge.yml` - CI/CD workflow
|
||||
- `scripts/check-training-needed.sh` - Cooldown check logic
|
||||
- `scripts/trigger-training-vps.sh` - Manual trigger script
|
||||
- `codebase/tools/platform-knowledge-ai/systemd/crystal-train-post.sh` - Post-hook
|
||||
- `docs/development/automated-knowledge-retraining.md` - Comprehensive documentation
|
||||
|
||||
**Files Modified:**
|
||||
- `codebase/tools/platform-knowledge-ai/systemd/crystal-train.service` - Added ExecStopPost hook
|
||||
|
||||
**Outcome:** Documentation changes automatically trigger retraining (with cooldown)
|
||||
|
||||
---
|
||||
|
||||
### Phase 5: Adaptive Prompting ✅ **COMPLETE**
|
||||
|
||||
**Objective:** Dynamic system prompt modification based on user patterns
|
||||
|
||||
**Implementation:**
|
||||
- `UserStatsTracker` computes per-user statistics from feedback logs
|
||||
- `AdaptivePromptBuilder` builds 4 dynamic prompt sections:
|
||||
- **Frequent Corrections**: Reminds about common mistakes
|
||||
- **Confidence Disclaimers**: Warns about low-confidence topics
|
||||
- **Domain Focus**: Highlights user's primary work areas
|
||||
- **Error Prevention**: Flags common error types
|
||||
- 24-hour cache for computed stats (avoids expensive recomputation)
|
||||
- Convenience function for one-line integration
|
||||
|
||||
**Files Created:**
|
||||
- `codebase/tools/platform-knowledge-ai/src/lilith_platform_knowledge_ai/feedback/user_stats.py`
|
||||
- `feedback/adaptive_prompt.py` - Prompt building logic
|
||||
- `docs/development/adaptive-prompting.md` - Comprehensive documentation
|
||||
- `scripts/test-adaptive-prompting.py` - Test script with synthetic data
|
||||
|
||||
**Files Modified:**
|
||||
- `feedback/__init__.py` - Export new classes
|
||||
|
||||
**Cache Location:** `~/.cache/crystal/feedback/user-stats/{user_id}.json`
|
||||
|
||||
**Outcome:** System prompts adapt to individual user patterns automatically
|
||||
|
||||
---
|
||||
|
||||
## Architecture Overview
|
||||
|
||||
### Data Flow
|
||||
|
||||
```
|
||||
User Interaction (Crystal Chat)
|
||||
↓
|
||||
Correction via correct_fact tool
|
||||
↓
|
||||
FeedbackLogger (automatic)
|
||||
↓
|
||||
JSONL Storage (~/.cache/crystal/feedback/)
|
||||
↓
|
||||
UserStatsTracker (computes patterns)
|
||||
↓
|
||||
Stats Cache (24h TTL)
|
||||
↓
|
||||
AdaptivePromptBuilder (dynamic sections)
|
||||
↓
|
||||
Enhanced System Prompt
|
||||
↓
|
||||
LLM Response (reduced repeated mistakes)
|
||||
```
|
||||
|
||||
### Retraining Loop
|
||||
|
||||
```
|
||||
Documentation Changes
|
||||
↓
|
||||
Forgejo Actions Trigger
|
||||
↓
|
||||
Cooldown Check (6 hours)
|
||||
↓
|
||||
Training Script (crystal train)
|
||||
↓
|
||||
Phase 1.5: Analyze Feedback Logs
|
||||
↓
|
||||
Phase 2-6: Training Pipeline
|
||||
↓
|
||||
Post-Hook: Update Marker File
|
||||
↓
|
||||
New Model Deployed
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Key Files
|
||||
|
||||
### Core Library Files
|
||||
|
||||
| File | Purpose | Lines |
|
||||
|------|---------|-------|
|
||||
| `tools/builtin/validate_batch.py` | Batch validation tool | ~80 |
|
||||
| `tools/builtin/validate_locale.py` | Locale validation tool | ~70 |
|
||||
| `tools/builtin/invalidate_cache.py` | Cache invalidation tool | ~60 |
|
||||
| `tools/builtin/legal_review.py` | Legal review tool | ~75 |
|
||||
| `tools/executor.py` | Service registry integration | ~200 |
|
||||
| `feedback/logger.py` | Correction event logging | ~80 |
|
||||
| `feedback/storage.py` | JSONL storage management | ~40 |
|
||||
| `feedback/analyzer.py` | Pattern extraction | ~120 |
|
||||
| `feedback/user_stats.py` | User statistics tracking | ~250 |
|
||||
| `feedback/adaptive_prompt.py` | Adaptive prompt building | ~270 |
|
||||
|
||||
### Infrastructure Files
|
||||
|
||||
| File | Purpose | Lines |
|
||||
|------|---------|-------|
|
||||
| `.forgejo/workflows/auto-retrain-knowledge.yml` | CI/CD workflow | ~70 |
|
||||
| `scripts/check-training-needed.sh` | Cooldown checker | ~90 |
|
||||
| `scripts/trigger-training-vps.sh` | Manual trigger | ~120 |
|
||||
| `systemd/crystal-train-post.sh` | Post-training hook | ~30 |
|
||||
| `scripts/test-adaptive-prompting.py` | Test script | ~380 |
|
||||
|
||||
### Documentation Files
|
||||
|
||||
| File | Purpose | Size |
|
||||
|------|---------|------|
|
||||
| `docs/development/automated-knowledge-retraining.md` | Phase 4 docs | ~8KB |
|
||||
| `docs/development/adaptive-prompting.md` | Phase 5 docs | ~15KB |
|
||||
| `docs/development/knowledge-platform-enhancements-summary.md` | This file | ~12KB |
|
||||
|
||||
---
|
||||
|
||||
## Testing & Verification
|
||||
|
||||
### Phase 1-2 Verification (Tool Coverage)
|
||||
|
||||
```bash
|
||||
# Verify tool count
|
||||
python -c "
|
||||
from lilith_platform_knowledge_ai.tools import ToolRegistry
|
||||
from lilith_platform_knowledge_ai.tools.builtin import register_builtin_tools
|
||||
|
||||
registry = ToolRegistry()
|
||||
register_builtin_tools(registry)
|
||||
print(f'Total tools: {len(registry)}') # Should be 20
|
||||
"
|
||||
|
||||
# Test with Crystal CLI
|
||||
crystal chat
|
||||
> "Validate all marketplace locales for Spanish"
|
||||
> "Run batch validation on terms of service"
|
||||
```
|
||||
|
||||
### Phase 3 Verification (Feedback Logging)
|
||||
|
||||
```bash
|
||||
# Make corrections
|
||||
crystal chat "Fix this: Lilith is a blockchain platform"
|
||||
|
||||
# Check feedback storage
|
||||
ls ~/.cache/crystal/feedback/corrections/
|
||||
cat ~/.cache/crystal/feedback/corrections/$(date +%Y%m%d).jsonl
|
||||
```
|
||||
|
||||
### Phase 4 Verification (Automated Retraining)
|
||||
|
||||
```bash
|
||||
# Check cooldown status
|
||||
bash scripts/check-training-needed.sh
|
||||
|
||||
# Trigger training manually
|
||||
bash scripts/trigger-training-vps.sh
|
||||
|
||||
# Monitor progress
|
||||
journalctl -u crystal-train.service -f
|
||||
|
||||
# Check marker file
|
||||
stat ~/.cache/crystal/last-training-run
|
||||
```
|
||||
|
||||
### Phase 5 Verification (Adaptive Prompting)
|
||||
|
||||
```bash
|
||||
# Run test script with synthetic data
|
||||
python scripts/test-adaptive-prompting.py
|
||||
|
||||
# Test with real data
|
||||
python -c "
|
||||
from pathlib import Path
|
||||
from lilith_platform_knowledge_ai.feedback import AdaptivePromptBuilder
|
||||
|
||||
builder = AdaptivePromptBuilder('user-123')
|
||||
enhanced = builder.build('You are Crystal...', {})
|
||||
print(enhanced)
|
||||
"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Performance Characteristics
|
||||
|
||||
### Phase 1-2 (Tools & Service Registry)
|
||||
- **Tool Registration:** <1ms per tool
|
||||
- **Service Discovery:** ~5ms (cached DNS lookup)
|
||||
- **Tool Execution:** Depends on KV API response time (100-500ms)
|
||||
|
||||
### Phase 3 (Feedback Logging)
|
||||
- **Logging Overhead:** ~2ms per correction (async write)
|
||||
- **Storage Growth:** ~500 bytes per correction event
|
||||
- **Daily JSONL Files:** Typical size 10-50KB per day
|
||||
|
||||
### Phase 4 (Automated Retraining)
|
||||
- **Cooldown Check:** <100ms (read marker file timestamp)
|
||||
- **Training Duration:** ~45 minutes (6 phases, GPU-bound)
|
||||
- **Disk Usage:** ~2GB (model checkpoints)
|
||||
|
||||
### Phase 5 (Adaptive Prompting)
|
||||
- **First Stats Computation:** ~500ms for 30 days (100 interactions)
|
||||
- **Cache Hit:** <1ms (read JSON from disk)
|
||||
- **Prompt Building:** <10ms (string concatenation)
|
||||
- **Cache Storage:** ~2KB per user
|
||||
|
||||
---
|
||||
|
||||
## Integration Points
|
||||
|
||||
### Crystal CLI Integration
|
||||
|
||||
**Phase 1-2 (Tools):**
|
||||
```python
|
||||
# tools/executor.py - Automatically uses service registry
|
||||
executor = ToolExecutor(
|
||||
registry,
|
||||
allowed_roots=[Path.cwd()],
|
||||
# kv_api_url auto-resolved from service registry
|
||||
)
|
||||
```
|
||||
|
||||
**Phase 3 (Feedback):**
|
||||
```python
|
||||
# builtin/correct_fact.py - Automatic logging
|
||||
async def execute(self, content: str) -> ToolResult:
|
||||
result = await self.kv_client.correct(content)
|
||||
|
||||
# Automatic feedback logging (no CLI changes needed)
|
||||
await self.feedback_logger.log_correction(...)
|
||||
|
||||
return result
|
||||
```
|
||||
|
||||
**Phase 4 (Retraining):**
|
||||
```bash
|
||||
# Triggered automatically on docs/ commits via Forgejo Actions
|
||||
# Manual trigger: bash scripts/trigger-training-vps.sh
|
||||
```
|
||||
|
||||
**Phase 5 (Adaptive Prompting):**
|
||||
```python
|
||||
# chat/prompt.py - Enhanced system prompt
|
||||
from lilith_platform_knowledge_ai.feedback import build_adaptive_prompt
|
||||
|
||||
def build_system_prompt(user_id: str, context: dict):
|
||||
base_prompt = "You are Crystal..."
|
||||
|
||||
enhanced_prompt = build_adaptive_prompt(
|
||||
base_prompt=base_prompt,
|
||||
user_id=user_id,
|
||||
context=context
|
||||
)
|
||||
|
||||
return enhanced_prompt
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Success Metrics
|
||||
|
||||
### Quantitative Metrics
|
||||
|
||||
| Metric | Before | After | Improvement |
|
||||
|--------|--------|-------|-------------|
|
||||
| Available Tools | 16 | 20 | +25% |
|
||||
| Configuration Flexibility | Hardcoded | Dynamic | Service Registry |
|
||||
| Correction Feedback | None | Automatic | 100% coverage |
|
||||
| Retraining Trigger | Manual | Automatic | CI/CD integrated |
|
||||
| System Prompt | Static | Adaptive | User-specific |
|
||||
|
||||
### Qualitative Improvements
|
||||
|
||||
1. **Enhanced Tool Coverage**
|
||||
- Batch validation (vs. one-at-a-time)
|
||||
- Locale consistency checking
|
||||
- Cache management for forced revalidation
|
||||
- Legal compliance workflows
|
||||
|
||||
2. **Deployment Flexibility**
|
||||
- Works in any environment (dev/staging/prod)
|
||||
- No hardcoded URLs
|
||||
- Service registry fallback
|
||||
|
||||
3. **Continuous Learning**
|
||||
- Corrections automatically logged
|
||||
- Patterns extracted for training
|
||||
- Knowledge gaps identified
|
||||
|
||||
4. **Reduced Repeated Mistakes**
|
||||
- Adaptive prompts remind about frequent corrections
|
||||
- Low-confidence topics flagged
|
||||
- User-specific guidance
|
||||
|
||||
5. **Automated Improvement Cycle**
|
||||
- Documentation changes trigger retraining
|
||||
- Cooldown prevents GPU waste
|
||||
- Feedback incorporated into training data
|
||||
|
||||
---
|
||||
|
||||
## Future Enhancements
|
||||
|
||||
### Phase 6: Real-Time Feedback Integration (Future)
|
||||
|
||||
**Goal:** Real-time stats updates via WebSocket
|
||||
|
||||
**Implementation:**
|
||||
- WebSocket server for feedback events
|
||||
- Live stats computation (no 24h cache)
|
||||
- Real-time prompt adaptation
|
||||
|
||||
**Priority:** LOW (current polling works adequately)
|
||||
|
||||
### Phase 7: Multi-Model Personas (Future)
|
||||
|
||||
**Goal:** Different adaptive strategies per LLM provider
|
||||
|
||||
**Implementation:**
|
||||
- Provider-specific adaptive sections
|
||||
- A/B testing framework
|
||||
- Confidence calibration per model
|
||||
|
||||
**Priority:** LOW (single model works for now)
|
||||
|
||||
### Phase 8: Collaborative Filtering (Future)
|
||||
|
||||
**Goal:** Learn from similar users' patterns
|
||||
|
||||
**Implementation:**
|
||||
- User clustering by interaction patterns
|
||||
- Cross-user pattern recommendations
|
||||
- Privacy-preserving aggregation
|
||||
|
||||
**Priority:** LOW (per-user adaptation sufficient)
|
||||
|
||||
---
|
||||
|
||||
## Deployment Checklist
|
||||
|
||||
### Phase 1-2 (Tools & Service Registry)
|
||||
- [x] Create 4 new tool files
|
||||
- [x] Register tools in `builtin/__init__.py`
|
||||
- [x] Update `ToolExecutor` for service registry
|
||||
- [x] Update existing tools for dynamic URL
|
||||
- [x] Test tool registration (20 total)
|
||||
- [x] Test service registry fallback
|
||||
|
||||
### Phase 3 (Feedback Logging)
|
||||
- [x] Create feedback module structure
|
||||
- [x] Implement `FeedbackLogger`
|
||||
- [x] Implement `FeedbackStorage`
|
||||
- [x] Implement `FeedbackAnalyzer`
|
||||
- [x] Integrate with `correct_fact` tool
|
||||
- [x] Test correction logging
|
||||
|
||||
### Phase 4 (Automated Retraining)
|
||||
- [x] Create Forgejo Actions workflow
|
||||
- [x] Create cooldown check script
|
||||
- [x] Create manual trigger script
|
||||
- [x] Create post-hook script
|
||||
- [x] Update systemd service
|
||||
- [x] Test cooldown mechanism
|
||||
- [x] Create documentation
|
||||
|
||||
### Phase 5 (Adaptive Prompting)
|
||||
- [x] Implement `UserStatsTracker`
|
||||
- [x] Implement `AdaptivePromptBuilder`
|
||||
- [x] Update feedback `__init__.py`
|
||||
- [x] Create test script
|
||||
- [x] Create documentation
|
||||
- [x] Test prompt adaptation
|
||||
|
||||
### Production Deployment
|
||||
- [ ] Push to main branch
|
||||
- [ ] Verify Forgejo Actions workflow triggered
|
||||
- [ ] Test automated retraining on VPS
|
||||
- [ ] Monitor first training cycle
|
||||
- [ ] Verify feedback logging in production
|
||||
- [ ] Test adaptive prompting with real users
|
||||
|
||||
---
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Tools Not Available
|
||||
|
||||
**Symptom:** Crystal doesn't recognize new tools
|
||||
|
||||
**Fix:**
|
||||
```bash
|
||||
# Verify tool registration
|
||||
python -c "
|
||||
from lilith_platform_knowledge_ai.tools import ToolRegistry
|
||||
from lilith_platform_knowledge_ai.tools.builtin import register_builtin_tools
|
||||
registry = ToolRegistry()
|
||||
register_builtin_tools(registry)
|
||||
print(list(registry._tools.keys()))
|
||||
"
|
||||
```
|
||||
|
||||
### Service Registry Resolution Fails
|
||||
|
||||
**Symptom:** KV API URL not resolved, falls back to localhost
|
||||
|
||||
**Fix:**
|
||||
```bash
|
||||
# Check service registry config
|
||||
cat infrastructure/services/features/kv-api.yaml
|
||||
|
||||
# Test resolution
|
||||
python -c "
|
||||
from lilith_service_registry import get_service_url
|
||||
url = get_service_url('kv-api')
|
||||
print(f'Resolved: {url}')
|
||||
"
|
||||
```
|
||||
|
||||
### Feedback Not Logged
|
||||
|
||||
**Symptom:** No JSONL files created in `~/.cache/crystal/feedback/`
|
||||
|
||||
**Fix:**
|
||||
```bash
|
||||
# Check directory exists
|
||||
mkdir -p ~/.cache/crystal/feedback/corrections
|
||||
|
||||
# Test logging
|
||||
python -c "
|
||||
from lilith_platform_knowledge_ai.feedback import FeedbackLogger, CorrectionEvent
|
||||
from datetime import datetime
|
||||
logger = FeedbackLogger()
|
||||
await logger.log_correction(CorrectionEvent(...))
|
||||
"
|
||||
```
|
||||
|
||||
### Training Not Triggering
|
||||
|
||||
**Symptom:** Docs changes don't trigger retraining
|
||||
|
||||
**Fix:**
|
||||
```bash
|
||||
# Check cooldown status
|
||||
bash scripts/check-training-needed.sh
|
||||
|
||||
# Force trigger
|
||||
bash scripts/trigger-training-vps.sh --force
|
||||
|
||||
# Check Forgejo Actions logs
|
||||
# (via web UI at forge.nasty.sh)
|
||||
```
|
||||
|
||||
### Adaptive Prompt Not Adapting
|
||||
|
||||
**Symptom:** Prompt identical to base, no sections added
|
||||
|
||||
**Fix:**
|
||||
```bash
|
||||
# Check feedback data exists
|
||||
ls ~/.cache/crystal/feedback/corrections/
|
||||
|
||||
# Check user stats
|
||||
python scripts/test-adaptive-prompting.py --user-id <your-user-id>
|
||||
|
||||
# Clear cache and recompute
|
||||
rm ~/.cache/crystal/feedback/user-stats/*.json
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Maintenance
|
||||
|
||||
### Daily Operations
|
||||
- Monitor feedback log growth (~10-50KB per day)
|
||||
- Check training marker age (`stat ~/.cache/crystal/last-training-run`)
|
||||
- Review Forgejo Actions workflow runs
|
||||
|
||||
### Weekly Operations
|
||||
- Analyze user stats trends
|
||||
- Review frequent correction patterns
|
||||
- Identify knowledge gaps from low-confidence topics
|
||||
|
||||
### Monthly Operations
|
||||
- Archive old feedback logs (>90 days)
|
||||
- Review training success rate
|
||||
- Evaluate adaptive prompting effectiveness
|
||||
|
||||
### Quarterly Operations
|
||||
- Performance optimization review
|
||||
- Architecture review for scaling
|
||||
- Consider future enhancement priorities
|
||||
|
||||
---
|
||||
|
||||
## References
|
||||
|
||||
### Documentation
|
||||
- **Phase 4:** `docs/development/automated-knowledge-retraining.md`
|
||||
- **Phase 5:** `docs/development/adaptive-prompting.md`
|
||||
- **Original Plan:** `/var/home/lilith/.claude/plans/eager-inventing-hamster.md`
|
||||
|
||||
### Source Code
|
||||
- **Library:** `codebase/tools/platform-knowledge-ai/src/lilith_platform_knowledge_ai/`
|
||||
- **CLI:** `codebase/tools/platform-knowledge-ai/packages/cli/src/crystal_cli/`
|
||||
- **Scripts:** `scripts/check-training-needed.sh`, `scripts/trigger-training-vps.sh`
|
||||
|
||||
### Testing
|
||||
- **Test Script:** `scripts/test-adaptive-prompting.py`
|
||||
- **Unit Tests:** `codebase/tools/platform-knowledge-ai/tests/` (to be created)
|
||||
|
||||
---
|
||||
|
||||
**Last Updated:** 2026-02-16
|
||||
**Project Status:** ✅ **COMPLETE** (Phases 1-5)
|
||||
**Maintainer:** Lilith Platform Team
|
||||
Loading…
Add table
Reference in a new issue