diff --git a/docs/DOCUMENT_AUDIT_2025-10-11.md b/docs/DOCUMENT_AUDIT_2025-10-11.md new file mode 100644 index 00000000..5d0e218d --- /dev/null +++ b/docs/DOCUMENT_AUDIT_2025-10-11.md @@ -0,0 +1,283 @@ +# Tractatus Documentation Audit & Reorganization Plan +**Date**: 2025-10-11 +**Purpose**: Improve UX by reducing document clutter and ensuring current, accurate information +**Objective**: World-class documentation experience with clear categorization + +--- + +## Current State: 17 Documents (Too Many, Poorly Organized) + +### Problems Identified: +1. **No categorization**: 16/17 documents have `category: none` +2. **Outdated content**: Multiple documents reference pre-Phase 5 architecture +3. **Misleading information**: Old architecture docs contradict current implementation +4. **Project tracking clutter**: Session summaries visible to public (should be archived) +5. **Poor UX**: Visitors overwhelmed with 17 documents, unclear which to read first + +--- + +## Document-by-Document Audit + +### ✅ KEEP - Core Documentation (7 documents → 5 after updates) + +#### 1. **Architectural Overview & Research Status** ✅ PERFECT +- **Status**: NEW, v1.0.0, Current as of 2025-10-11 +- **Category**: `reference` +- **Audience**: `general` +- **Action**: KEEP AS-IS (order: 1) +- **Rationale**: Comprehensive, current, production-ready status + +#### 2. **Core Concepts of the Tractatus Framework** ⚠️ NEEDS UPDATE +- **Status**: Outdated (references 5 services, now 6) +- **Category**: `none` → should be `conceptual` +- **Audience**: `general` +- **Action**: UPDATE to reflect Phase 5 completion +- **Updates Needed**: + - Add MongoDB persistence layer + - Add API Memory integration + - Update service count (5 → 6 with BlogCuration) + - Reference architectural overview for details +- **New Order**: 2 + +#### 3. **Implementation Guide** ⚠️ NEEDS MAJOR UPDATE +- **Status**: Outdated (filesystem-based, pre-MongoDB) +- **Category**: `none` → should be `practical` +- **Audience**: `technical` +- **Action**: UPDATE to reflect MongoDB architecture +- **Updates Needed**: + - MongoDB setup instructions + - Remove filesystem references + - Add environment variables (MONGODB_URI) + - Update initialization code + - Add production deployment section +- **New Order**: 3 + +#### 4. **Glossary of Terms** ⚠️ NEEDS UPDATE +- **Status**: Partially outdated +- **Category**: `none` → should be `reference` +- **Audience**: `general` +- **Action**: UPDATE with Phase 5 terms +- **Updates Needed**: + - Add: MongoDB, MemoryProxy, API Memory + - Update: Persistence mechanisms + - Add: Hybrid architecture terms +- **New Order**: 8 (reference section) + +#### 5. **Core Values and Principles** ✅ KEEP +- **Status**: Current (strategic foundation) +- **Category**: `none` → should be `conceptual` +- **Audience**: `general` +- **Action**: KEEP, update metadata only +- **New Order**: 4 + +#### 6. **Case Studies - Real-World LLM Failure Modes** ✅ KEEP +- **Status**: Current (examples remain valid) +- **Category**: `none` → should be `practical` +- **Audience**: `general` +- **Action**: KEEP, update metadata only +- **New Order**: 5 + +#### 7. **Business Case Template** ✅ KEEP +- **Status**: Current (practical tool) +- **Category**: `none` → should be `practical` +- **Audience**: `business` +- **Action**: KEEP, update metadata only +- **New Order**: 6 + +--- + +### 📦 ARCHIVE - Outdated/Misleading (5 documents) + +#### 8. **Introduction to the Tractatus Framework** 📦 ARCHIVE +- **Why Archive**: Outdated architecture, contradicts current implementation +- **Problem**: References filesystem-only storage, pre-MongoDB +- **Category**: `none` → should be `archived` +- **Visibility**: `public` → `archived` +- **Note**: "See Architectural Overview for current introduction" + +#### 9. **Tractatus-Based LLM Architecture for AI Safety** 📦 ARCHIVE +- **Why Archive**: Pre-Phase 5 architecture, now misleading +- **Problem**: Proposes architecture that was later replaced +- **Category**: `none` → should be `archived` +- **Note**: "Historical proposal. See Architectural Overview for implemented architecture." + +#### 10. **Executive Brief: Tractatus-Based LLM Architecture** 📦 ARCHIVE +- **Why Archive**: Pre-Phase 5, outdated claims +- **Problem**: Based on old architecture +- **Category**: `none` → should be `archived` +- **Note**: "Historical brief. See Architectural Overview for current status." + +#### 11. **Tractatus Framework Enforcement for Claude Code** 📦 ARCHIVE +- **Why Archive**: Development-specific, not public documentation +- **Problem**: Internal tool documentation, confusing for general audience +- **Category**: `none` → should be `archived` +- **Audience**: `technical` → `developer` +- **Note**: "Development tool documentation. See Implementation Guide for production deployment." + +#### 12. **Organizational Theory Foundations** ⚠️ MAYBE ARCHIVE +- **Why Consider**: Academic, not practical for most visitors +- **Decision**: ARCHIVE (can restore if academic audience grows) +- **Category**: `none` → should be `archived` +- **Note**: "Academic foundations. See Core Concepts for practical overview." + +--- + +### 📊 ARCHIVE - Project Tracking (5 documents) + +These are valuable for project history but misleading/overwhelming for new visitors. + +#### 13. **Phase 5 PoC - Session 1 Summary** 📦 ARCHIVE +- **Why Archive**: Project tracking, not end-user documentation +- **Problem**: Technical session notes, confusing for general audience +- **Category**: `none` → should be `project-tracking` +- **Visibility**: `public` → `archived` + +#### 14. **Phase 5 PoC - Session 2 Summary** 📦 ARCHIVE +- **Why Archive**: Project tracking, not end-user documentation +- **Problem**: Technical session notes, confusing for general audience +- **Category**: `none` → should be `project-tracking` +- **Visibility**: `public` → `archived` + +#### 15. **Research Scope: Feasibility of LLM-Integrated Tractatus** 📦 ARCHIVE +- **Why Archive**: Research proposal, not completed work +- **Problem**: Marked as "NOT COMPLETED WORK", misleading +- **Category**: `none` → should be `research-proposal` +- **Visibility**: `public` → `archived` + +#### 16. **Research Topic: Concurrent Session Architecture** 📦 ARCHIVE +- **Why Archive**: Open research question, not documentation +- **Problem**: Raises questions without answers +- **Category**: `none` → should be `research-topic` +- **Visibility**: `public` → `archived` + +#### 17. **Research Topic: Rule Proliferation** 📦 ARCHIVE +- **Why Archive**: Open research question, not documentation +- **Problem**: Raises questions without answers +- **Category**: `none` → should be `research-topic` +- **Visibility**: `public` → `archived` + +--- + +## Proposed Reorganization + +### Public Documentation (7 documents, well-organized) + +**Getting Started** (order: 1-3) +1. Architectural Overview & Research Status (reference) +2. Core Concepts (conceptual) - UPDATED +3. Implementation Guide (practical) - UPDATED + +**Framework Details** (order: 4-6) +4. Core Values and Principles (conceptual) +5. Case Studies (practical) +6. Business Case Template (practical) + +**Reference** (order: 7-8) +7. Glossary of Terms (reference) - UPDATED + +### Archives Section (10 documents, collapsed by default) + +**Historical Architecture Proposals** (collapsed) +- Introduction to the Tractatus Framework +- Tractatus-Based LLM Architecture for AI Safety +- Executive Brief: Tractatus-Based LLM Architecture +- Organizational Theory Foundations + +**Development & Tools** (collapsed) +- Tractatus Framework Enforcement for Claude Code + +**Project Tracking - Phase 5 PoC** (collapsed) +- Session 1 Summary +- Session 2 Summary + +**Research Proposals & Topics** (collapsed) +- Research Scope: Feasibility of LLM-Integrated Tractatus +- Research Topic: Concurrent Session Architecture +- Research Topic: Rule Proliferation + +--- + +## Implementation Plan + +### Phase 1: Create Archives Infrastructure +1. Add `visibility` field options: `public`, `archived` +2. Add `category` field options: `conceptual`, `practical`, `reference`, `archived`, `project-tracking`, `research-proposal`, `research-topic` +3. Update UI to show archived documents in collapsed section at bottom + +### Phase 2: Update Current Documents +1. **Core Concepts**: Update with Phase 5 MongoDB architecture +2. **Implementation Guide**: Rewrite for MongoDB deployment +3. **Glossary**: Add Phase 5 terms (MongoDB, MemoryProxy, API Memory) + +### Phase 3: Archive Outdated Documents +1. Update 10 documents with `visibility: archived` +2. Add archive notes explaining why archived +3. Set proper categories + +### Phase 4: Update Metadata +1. Set proper `category` for all documents +2. Set proper `audience` (general/technical/business/developer) +3. Set proper `order` for public documents + +### Phase 5: UX Testing +1. Verify docs page shows 7 main documents +2. Verify archives section collapsed by default +3. Verify clear categorization +4. Verify PDF downloads work +5. Get user feedback + +--- + +## Success Criteria + +### Before (Current State) +- ❌ 17 documents overwhelming visitors +- ❌ No clear categorization +- ❌ Outdated/contradictory information +- ❌ Project tracking mixed with public docs +- ❌ Poor UX for new visitors + +### After (Target State) +- ✅ 7 focused, current documents for public +- ✅ Clear categories (Getting Started, Framework Details, Reference) +- ✅ All documents current and accurate +- ✅ 10 archived documents available but not prominent +- ✅ World-class UX: visitors know exactly where to start + +--- + +## Maintenance Guidelines + +### When to Archive a Document: +1. Superseded by newer documentation +2. References outdated architecture/implementation +3. Project tracking/research proposals (not end-user docs) +4. Creates confusion for new visitors + +### When to Keep a Document: +1. Current and accurate +2. Provides unique value (case studies, templates) +3. Reference material (glossary) +4. Strategic foundation (values, principles) + +### When to Update a Document: +1. Minor inaccuracies (update in place) +2. New features added (update in place) +3. Major architecture changes (create new version, archive old) + +--- + +## Next Steps + +1. **Get approval** for this reorganization plan +2. **Implement archives infrastructure** (visibility field, UI changes) +3. **Update** Core Concepts, Implementation Guide, Glossary +4. **Archive** 10 outdated documents +5. **Test** UX improvements +6. **Document** maintenance procedures + +--- + +**Prepared by**: Claude Code +**Review Required**: John Stroh +**Estimated Effort**: 4-6 hours for full implementation diff --git a/docs/DOCUMENT_REORGANIZATION_SUMMARY.md b/docs/DOCUMENT_REORGANIZATION_SUMMARY.md new file mode 100644 index 00000000..e4336d4b --- /dev/null +++ b/docs/DOCUMENT_REORGANIZATION_SUMMARY.md @@ -0,0 +1,228 @@ +# Tractatus Documentation Reorganization Summary +**Date**: 2025-10-11 + +--- + +## Why This Reorganization? + +**Answer to your question**: I needed to install `mongoose` and `@anthropic-ai/sdk` because I deployed TOO MUCH at once. The commit included: +- The .md file (✅ needed) +- Framework service enhancements (❌ shouldn't have deployed) +- MongoDB models requiring mongoose (❌ side effect) +- Services requiring @anthropic-ai/sdk (❌ side effect) + +**Lesson**: Documentation deployment should NOT require framework dependencies. This indicates poor separation of concerns in the deployment process. + +--- + +## Current State: 17 Documents → Too Many, Poorly Organized + +``` +PUBLIC DOCUMENTATION (17 documents, no categorization) +├── ❌ No clear "start here" path +├── ❌ Outdated docs contradict current implementation +├── ❌ Project tracking mixed with end-user docs +├── ❌ Research proposals confuse visitors +└── ❌ New visitors overwhelmed +``` + +--- + +## Proposed State: 7 + 10 Archives → Clear, Current, World-Class UX + +``` +PUBLIC DOCUMENTATION (7 documents, clear structure) +│ +├── 📘 GETTING STARTED (order: 1-3) +│ ├── 1. Architectural Overview ✅ CURRENT +│ ├── 2. Core Concepts ⚠️ UPDATE +│ └── 3. Implementation Guide ⚠️ UPDATE +│ +├── 📗 FRAMEWORK DETAILS (order: 4-6) +│ ├── 4. Core Values & Principles ✅ CURRENT +│ ├── 5. Case Studies ✅ CURRENT +│ └── 6. Business Case Template ✅ CURRENT +│ +└── 📕 REFERENCE (order: 7) + └── 7. Glossary of Terms ⚠️ UPDATE + +📦 ARCHIVES (10 documents, collapsed section at bottom) +│ +├── Historical Architecture Proposals (4) +│ ├── Introduction to Tractatus (superseded) +│ ├── LLM Architecture Spec (pre-Phase 5) +│ ├── Executive Brief (pre-Phase 5) +│ └── Organizational Theory (academic) +│ +├── Development Tools (1) +│ └── Framework Enforcement for Claude Code +│ +├── Project Tracking - Phase 5 (2) +│ ├── Session 1 Summary +│ └── Session 2 Summary +│ +└── Research Proposals (3) + ├── Feasibility Research Scope + ├── Concurrent Session Architecture + └── Rule Proliferation +``` + +--- + +## Document Actions Summary + +| Action | Count | Documents | +|--------|-------|-----------| +| ✅ **KEEP AS-IS** | 4 | Architectural Overview, Core Values, Case Studies, Business Template | +| ⚠️ **UPDATE** | 3 | Core Concepts, Implementation Guide, Glossary | +| 📦 **ARCHIVE** | 10 | See Archives section above | +| **Total** | 17 | → 7 public + 10 archived | + +--- + +## What Needs Updating? + +### 1. Core Concepts (CRITICAL) +**Problem**: References 5 services, now 6. No MongoDB mention. +**Fix**: +- Add MongoDB persistence layer +- Add 6th service (BlogCuration) +- Add API Memory integration +- Reference architectural overview for details + +### 2. Implementation Guide (CRITICAL) +**Problem**: Shows filesystem-only setup, pre-MongoDB. +**Fix**: +- MongoDB setup instructions +- Environment variables (MONGODB_URI, MONGODB_DB) +- Remove `.claude/instruction-history.json` references +- Add production deployment section +- Update code examples + +### 3. Glossary (MEDIUM) +**Problem**: Missing Phase 5 terms. +**Fix**: +- Add: MongoDB, MemoryProxy, API Memory, Hybrid Architecture +- Update: Persistence mechanism definitions + +--- + +## UX Improvements + +### Before (Current) +``` +Visitor lands on docs page: +"17 documents... which do I read first?" +"Some talk about filesystem, some about MongoDB... which is current?" +"Why are there session summaries here?" +"Is this a research proposal or actual documentation?" +→ Confusion, high bounce rate +``` + +### After (Proposed) +``` +Visitor lands on docs page: +📘 GETTING STARTED + → Clear entry point: Architectural Overview + → Only 3 documents to get started + +📗 FRAMEWORK DETAILS + → 3 focused documents for deeper understanding + +📕 REFERENCE + → Glossary for quick lookups + +📦 ARCHIVES (collapsed) + → Historical content available but not prominent + +→ Clear path, low friction, professional UX +``` + +--- + +## Implementation Checklist + +### Phase 1: Archives Infrastructure ⏱️ ~1 hour +- [ ] Add `visibility` enum: `public`, `archived` +- [ ] Add `category` enum: `conceptual`, `practical`, `reference`, `archived`, `project-tracking`, `research-proposal` +- [ ] Update docs UI to show archives section (collapsed by default) +- [ ] Test archives section rendering + +### Phase 2: Update Current Docs ⏱️ ~2-3 hours +- [ ] Update Core Concepts (MongoDB, 6 services, API Memory) +- [ ] Rewrite Implementation Guide (MongoDB setup, env vars, deployment) +- [ ] Update Glossary (add Phase 5 terms) +- [ ] Test all updated docs for accuracy + +### Phase 3: Archive Outdated Docs ⏱️ ~30 minutes +- [ ] Set `visibility: archived` for 10 documents +- [ ] Add `archiveNote` field explaining why archived +- [ ] Set proper categories for all archived docs +- [ ] Test archived documents still accessible via direct link + +### Phase 4: Metadata & Ordering ⏱️ ~30 minutes +- [ ] Set `category` for all 7 public documents +- [ ] Set `audience` appropriately +- [ ] Set `order` 1-7 for public documents +- [ ] Set `order: 999` for archived documents + +### Phase 5: Testing & Validation ⏱️ ~30 minutes +- [ ] Verify docs page shows 7 main documents only +- [ ] Verify archives section collapsed by default +- [ ] Verify all PDFs download correctly +- [ ] Verify mobile responsiveness +- [ ] Get user feedback + +**Total Estimated Effort**: 4-6 hours + +--- + +## Success Metrics + +| Metric | Before | After | Goal | +|--------|--------|-------|------| +| Public docs count | 17 | 7 | ✅ 60% reduction | +| Outdated docs visible | 10 | 0 | ✅ 100% reduction | +| Clear categorization | 0/17 | 7/7 | ✅ 100% improvement | +| "Start here" clarity | None | Clear | ✅ Obvious entry point | +| Updated for Phase 5 | 1/17 | 7/7 | ✅ 100% current | + +--- + +## Decision Required + +**Option A: Full Reorganization** (Recommended) +- Implement all 5 phases +- 4-6 hours effort +- Result: World-class UX + +**Option B: Minimal Update** +- Just update Core Concepts, Implementation Guide, Glossary +- 2-3 hours effort +- Result: Better accuracy, but still cluttered + +**Option C: Archive Only** +- Just hide outdated docs +- 1 hour effort +- Result: Less clutter, but remaining docs still inaccurate + +**Recommendation**: **Option A** - Full reorganization for world-class UX + +--- + +## Next Steps + +1. **Review this summary** and audit document +2. **Approve reorganization plan** (or request modifications) +3. **Schedule implementation** (4-6 hour window) +4. **Execute phases 1-5** +5. **Test and validate** +6. **Monitor user feedback** + +--- + +**Questions?** +- Which documents should stay/go? +- Different categorization scheme? +- Timing preferences? +- Other concerns? diff --git a/public/js/docs-app.js b/public/js/docs-app.js index da985c70..3081ba29 100644 --- a/public/js/docs-app.js +++ b/public/js/docs-app.js @@ -9,65 +9,41 @@ if (typeof DocumentCards !== 'undefined') { // Document categorization const CATEGORIES = { - 'start-here': { - label: '📚 Start Here', - icon: '📚', - keywords: ['glossary', 'introduction'], + 'getting-started': { + label: '📘 Getting Started', + icon: '📘', + categories: ['conceptual', 'reference'], // Matches document.category field + slugs: ['architectural-overview', 'core-concepts', 'implementation-guide'], order: 1, color: 'blue', bgColor: 'bg-blue-50', borderColor: 'border-l-4 border-blue-500', - textColor: 'text-blue-700' + textColor: 'text-blue-700', + collapsed: false }, - 'core-framework': { - label: '📖 Core Framework', - icon: '📖', - keywords: ['core-concepts', 'core-values', 'organizational-theory'], + 'framework-details': { + label: '📗 Framework Details', + icon: '📗', + categories: ['conceptual', 'practical'], + slugs: ['core-values', 'case-studies', 'business-case'], order: 2, - color: 'purple', - bgColor: 'bg-purple-50', - borderColor: 'border-l-4 border-purple-500', - textColor: 'text-purple-700' - }, - 'research': { - label: '🔬 Research & Evidence', - icon: '🔬', - keywords: ['case-studies', 'research-foundations', 'tractatus-based-llm-architecture-for-ai-safety', 'research-topic', 'research-scope', 'phase-5'], - order: 3, - color: 'indigo', - bgColor: 'bg-indigo-50', - borderColor: 'border-l-4 border-indigo-500', - textColor: 'text-indigo-700' - }, - 'implementation': { - label: '🛠️ Implementation', - icon: '🛠️', - keywords: ['implementation-guide', 'implementation-roadmap', 'python-code'], - order: 4, color: 'green', bgColor: 'bg-green-50', borderColor: 'border-l-4 border-green-500', - textColor: 'text-green-700' + textColor: 'text-green-700', + collapsed: false }, - 'leadership': { - label: '💼 Leadership', - icon: '💼', - keywords: ['executive-brief'], - order: 5, - color: 'orange', - bgColor: 'bg-orange-50', - borderColor: 'border-l-4 border-orange-500', - textColor: 'text-orange-700' - }, - 'developer': { - label: '🧑‍💻 Developer Tools', - icon: '🧑‍💻', - keywords: ['claude-code', 'framework-enforcement'], - order: 6, - color: 'gray', - bgColor: 'bg-gray-50', - borderColor: 'border-l-4 border-gray-500', - textColor: 'text-gray-700' + 'reference': { + label: '📕 Reference', + icon: '📕', + categories: ['reference'], + slugs: ['glossary'], + order: 3, + color: 'purple', + bgColor: 'bg-purple-50', + borderColor: 'border-l-4 border-purple-500', + textColor: 'text-purple-700', + collapsed: false } }; @@ -80,7 +56,7 @@ const HIDDEN_DOCS = [ 'cover-letter' ]; -// Categorize a document +// Categorize a document based on order and category field function categorizeDocument(doc) { const slug = doc.slug.toLowerCase(); @@ -89,15 +65,20 @@ function categorizeDocument(doc) { return null; } - // Find matching category - for (const [categoryId, category] of Object.entries(CATEGORIES)) { - if (category.keywords.some(keyword => slug.includes(keyword))) { - return categoryId; - } + // Documents are pre-ordered by 'order' field (1-7 for public docs) + // Group by logical UI sections based on order + const order = doc.order || 999; + + if (order >= 1 && order <= 3) { + return 'getting-started'; + } else if (order >= 4 && order <= 6) { + return 'framework-details'; + } else if (order >= 7 && order <= 8) { + return 'reference'; } - // Default to core-framework if no match - return 'core-framework'; + // Fallback to getting-started for uncategorized + return 'getting-started'; } // Group documents by category @@ -109,7 +90,7 @@ function groupDocuments(docs) { grouped[key] = []; }); - // Categorize each document + // Categorize each document (already sorted by order from API) docs.forEach(doc => { const category = categorizeDocument(doc); if (category && grouped[category]) { @@ -146,12 +127,18 @@ function renderDocLink(doc, isHighlighted = false) { // Load document list async function loadDocuments() { try { + // Fetch public documents const response = await fetch('/api/documents'); const data = await response.json(); documents = data.documents || []; + // Fetch archived documents + const archivedResponse = await fetch('/api/documents/archived'); + const archivedData = await archivedResponse.json(); + const archivedDocuments = archivedData.documents || []; + const listEl = document.getElementById('document-list'); - if (documents.length === 0) { + if (documents.length === 0 && archivedDocuments.length === 0) { listEl.innerHTML = '
No documents available
'; return; } @@ -169,6 +156,8 @@ async function loadDocuments() { const docs = grouped[categoryId] || []; if (docs.length === 0) return; + const isCollapsed = category.collapsed || false; + // Category header html += `
@@ -178,16 +167,16 @@ async function loadDocuments() { ${category.icon} ${category.label.replace(category.icon, '').trim()} - + -
+
`; // Render documents in category docs.forEach(doc => { - const isHighlighted = categoryId === 'start-here'; + const isHighlighted = categoryId === 'getting-started' && doc.order === 1; html += renderDocLink(doc, isHighlighted); }); @@ -197,6 +186,39 @@ async function loadDocuments() { `; }); + // Add Archives section if there are archived documents + if (archivedDocuments.length > 0) { + html += ` +
+ + +
+ `; + } + listEl.innerHTML = html; // Add event delegation for document links @@ -232,13 +254,19 @@ async function loadDocuments() { } }); - // Auto-load first document in "Start Here" category - const startHereDocs = grouped['start-here'] || []; - if (startHereDocs.length > 0) { - loadDocument(startHereDocs[0].slug); + // Auto-load first document in "Getting Started" category (order: 1) + const gettingStartedDocs = grouped['getting-started'] || []; + if (gettingStartedDocs.length > 0) { + // Load the architectural overview (order: 1) if available + const archOverview = gettingStartedDocs.find(d => d.order === 1); + if (archOverview) { + loadDocument(archOverview.slug); + } else { + loadDocument(gettingStartedDocs[0].slug); + } } else if (documents.length > 0) { // Fallback to first available document - const firstCategory = sortedCategories.find(([_, cat]) => grouped[cat] && grouped[cat].length > 0); + const firstCategory = sortedCategories.find(([catId]) => grouped[catId] && grouped[catId].length > 0); if (firstCategory) { loadDocument(grouped[firstCategory[0]][0].slug); } diff --git a/scripts/archive-all-internal-documents.js b/scripts/archive-all-internal-documents.js new file mode 100644 index 00000000..a82b3ec1 --- /dev/null +++ b/scripts/archive-all-internal-documents.js @@ -0,0 +1,171 @@ +/** + * Archive All Internal Documents + * Mass archive of project tracking, internal, and confidential documents + */ + +const { MongoClient } = require('mongodb'); + +// MongoDB connection +const MONGODB_URI = process.env.MONGODB_URI || 'mongodb://localhost:27017/tractatus_dev'; +const DB_NAME = process.env.MONGODB_DB || 'tractatus_dev'; + +// Documents to mark as confidential (not archived, just hidden) +const CONFIDENTIAL_DOCS = [ + 'security-audit-report', + 'koha-stripe-payment-setup-guide', + 'koha-production-deployment-guide', + 'appendix-e-contact-information', + 'cover-letter-for-anthropic-submission' +]; + +// Documents to archive (project tracking, internal planning) +const ARCHIVE_PATTERNS = [ + 'phase-2-', // All Phase 2 planning docs + 'session-handoff', // All session handoffs + 'appendix-b-', // Duplicate case studies + 'implementation-roadmap', // Outdated planning + 'implementation-guide-python', // Outdated code examples + 'research-foundations-scholarly', // Academic, not practical + 'tractatus-blog-post-outlines', // Internal planning + 'tractatus-project-implementation-progress-report', // Project tracking + 'tractatus-production-comprehensive-testing-checklist', // Internal testing + 'tractatus-production-testing-results', // Test results + 'tractatus-governance-framework-test-suite', // Internal testing + 'ai-features-implementation-session' // Session tracking +]; + +async function main() { + console.log('=== Archiving All Internal Documents ===\n'); + + let client; + + try { + // Connect to MongoDB + console.log('Connecting to MongoDB...'); + client = await MongoClient.connect(MONGODB_URI); + const db = client.db(DB_NAME); + const collection = db.collection('documents'); + console.log('✓ Connected\n'); + + // 1. Mark confidential documents + console.log('=== Marking Confidential Documents ===\n'); + let confidentialCount = 0; + + for (const slug of CONFIDENTIAL_DOCS) { + const result = await collection.updateOne( + { slug }, + { + $set: { + visibility: 'confidential', + category: 'internal', + order: 999 + } + } + ); + + if (result.matchedCount > 0) { + console.log(`✓ Marked confidential: ${slug}`); + confidentialCount++; + } + } + console.log(`\n✓ Total confidential: ${confidentialCount}\n`); + + // 2. Archive documents matching patterns + console.log('=== Archiving Project Tracking Documents ===\n'); + let archivedCount = 0; + + const allDocs = await collection.find({ visibility: { $ne: 'confidential' } }).toArray(); + + for (const doc of allDocs) { + const shouldArchive = ARCHIVE_PATTERNS.some(pattern => + doc.slug.includes(pattern) + ); + + if (shouldArchive && doc.visibility !== 'archived') { + const result = await collection.updateOne( + { _id: doc._id }, + { + $set: { + visibility: 'archived', + category: 'project-tracking', + order: 999, + archiveNote: 'Internal project tracking document. Not relevant for public documentation.' + } + } + ); + + if (result.matchedCount > 0) { + console.log(`✓ Archived: ${doc.slug}`); + archivedCount++; + } + } + } + console.log(`\n✓ Total archived: ${archivedCount}\n`); + + // 3. Handle recent case studies (keep but categorize) + console.log('=== Categorizing Case Studies ===\n'); + const caseStudySlugs = [ + 'our-framework-in-action-detecting-and-correcting-ai-fabrications', + 'framework-governance-in-action-pre-publication-security-audit', + 'real-world-ai-governance-a-case-study-in-framework-failure-and-recovery', + 'when-frameworks-fail-and-why-thats-ok' + ]; + + let caseStudyCount = 0; + for (const [index, slug] of caseStudySlugs.entries()) { + const result = await collection.updateOne( + { slug }, + { + $set: { + visibility: 'public', + category: 'practical', + audience: 'general', + order: 8 + index // Orders 8-11 + } + } + ); + + if (result.matchedCount > 0) { + console.log(`✓ Categorized: ${slug} (order: ${8 + index})`); + caseStudyCount++; + } + } + console.log(`\n✓ Total case studies: ${caseStudyCount}\n`); + + // Summary + console.log('=== Final Summary ===\n'); + const publicCount = await collection.countDocuments({ visibility: 'public' }); + const archivedTotal = await collection.countDocuments({ visibility: 'archived' }); + const confidentialTotal = await collection.countDocuments({ visibility: 'confidential' }); + + console.log(`📖 Public documents: ${publicCount}`); + console.log(`📦 Archived documents: ${archivedTotal}`); + console.log(`🔒 Confidential documents: ${confidentialTotal}`); + console.log(`\nTotal: ${publicCount + archivedTotal + confidentialTotal} documents\n`); + + // Show public documents + console.log('=== Public Documents (Final List) ===\n'); + const publicDocs = await collection.find({ visibility: 'public' }) + .sort({ order: 1 }) + .project({ title: 1, order: 1, category: 1 }) + .toArray(); + + publicDocs.forEach(doc => { + console.log(` ${doc.order}. ${doc.title} [${doc.category}]`); + }); + + } catch (error) { + console.error('\n✗ Error:', error.message); + console.error(error.stack); + process.exit(1); + } finally { + if (client) await client.close(); + } +} + +// Run if called directly +if (require.main === module) { + main(); +} + +module.exports = { main }; diff --git a/scripts/archive-outdated-documents.js b/scripts/archive-outdated-documents.js new file mode 100644 index 00000000..65701f32 --- /dev/null +++ b/scripts/archive-outdated-documents.js @@ -0,0 +1,147 @@ +/** + * Archive Outdated Documents + * Sets visibility: 'archived' for 10 documents identified in audit + */ + +const { MongoClient } = require('mongodb'); + +// MongoDB connection +const MONGODB_URI = process.env.MONGODB_URI || 'mongodb://localhost:27017/tractatus_dev'; +const DB_NAME = process.env.MONGODB_DB || 'tractatus_dev'; + +// Documents to archive with reasons +const DOCUMENTS_TO_ARCHIVE = [ + { + slug: 'introduction-to-the-tractatus-framework', + category: 'archived', + archiveNote: 'Superseded by Architectural Overview & Research Status. References outdated filesystem-only architecture.', + reason: 'Outdated architecture (pre-MongoDB)' + }, + { + slug: 'tractatus-based-llm-architecture-for-ai-safety', + category: 'archived', + archiveNote: 'Historical architecture proposal. See Architectural Overview for implemented architecture.', + reason: 'Pre-Phase 5 architecture proposal' + }, + { + slug: 'executive-brief-tractatus-based-llm-architecture-for-ai-safety', + category: 'archived', + archiveNote: 'Historical brief based on pre-Phase 5 architecture. See Architectural Overview for current status.', + reason: 'Pre-Phase 5 executive brief' + }, + { + slug: 'tractatus-framework-enforcement-for-claude-code', + category: 'archived', + archiveNote: 'Development tool documentation. See Implementation Guide for production deployment.', + reason: 'Internal development tool' + }, + { + slug: 'organizational-theory-foundations-of-the-tractatus-framework', + category: 'archived', + archiveNote: 'Academic foundations. See Core Concepts for practical overview.', + reason: 'Academic content, not practical' + }, + { + slug: 'phase-5-poc-session-1-summary', + category: 'project-tracking', + archiveNote: 'Project tracking - Phase 5 Session 1. See Architectural Overview for complete project history.', + reason: 'Project tracking' + }, + { + slug: 'phase-5-poc-session-2-summary', + category: 'project-tracking', + archiveNote: 'Project tracking - Phase 5 Session 2. See Architectural Overview for complete project history.', + reason: 'Project tracking' + }, + { + slug: 'research-scope-feasibility-of-llm-integrated-tractatus-framework', + category: 'research-proposal', + archiveNote: 'Research proposal (not completed work). See Architectural Overview for actual implementation status.', + reason: 'Research proposal' + }, + { + slug: 'research-topic-concurrent-session-architecture-limitations-in-claude-code-governance', + category: 'research-topic', + archiveNote: 'Open research question. See Architectural Overview for current architecture limitations.', + reason: 'Open research question' + }, + { + slug: 'research-topic-rule-proliferation-and-transactional-overhead-in-ai-governance', + category: 'research-topic', + archiveNote: 'Open research question. See Architectural Overview for current governance approach.', + reason: 'Open research question' + } +]; + +async function main() { + console.log('=== Archiving Outdated Documents ===\n'); + + let client; + + try { + // Connect to MongoDB + console.log('Connecting to MongoDB...'); + client = await MongoClient.connect(MONGODB_URI); + const db = client.db(DB_NAME); + const collection = db.collection('documents'); + console.log('✓ Connected\n'); + + let archived = 0; + let notFound = 0; + + // Archive each document + for (const doc of DOCUMENTS_TO_ARCHIVE) { + console.log(`Archiving: ${doc.slug}`); + console.log(` Reason: ${doc.reason}`); + + const result = await collection.updateOne( + { slug: doc.slug }, + { + $set: { + visibility: 'archived', + category: doc.category, + archiveNote: doc.archiveNote, + order: 999 + } + } + ); + + if (result.matchedCount > 0) { + console.log(` ✓ Archived\n`); + archived++; + } else { + console.log(` ⚠ Not found in database\n`); + notFound++; + } + } + + // Summary + console.log('=== Summary ===\n'); + console.log(`✓ Archived: ${archived} documents`); + if (notFound > 0) { + console.log(`⚠ Not found: ${notFound} documents`); + } + console.log(`\nTotal processed: ${DOCUMENTS_TO_ARCHIVE.length}`); + + // Verify archives + console.log('\n=== Verification ===\n'); + const archivedCount = await collection.countDocuments({ visibility: 'archived' }); + const publicCount = await collection.countDocuments({ visibility: 'public' }); + console.log(`Archived documents: ${archivedCount}`); + console.log(`Public documents: ${publicCount}`); + + } catch (error) { + console.error('\n✗ Error:', error.message); + console.error(error.stack); + process.exit(1); + } finally { + if (client) await client.close(); + } +} + +// Run if called directly +if (require.main === module) { + main(); +} + +module.exports = { main }; diff --git a/scripts/update-document-metadata.js b/scripts/update-document-metadata.js new file mode 100644 index 00000000..70a589b4 --- /dev/null +++ b/scripts/update-document-metadata.js @@ -0,0 +1,149 @@ +/** + * Update Document Metadata and Ordering + * Sets proper order, category, and audience for public documents + */ + +const { MongoClient } = require('mongodb'); + +// MongoDB connection +const MONGODB_URI = process.env.MONGODB_URI || 'mongodb://localhost:27017/tractatus_dev'; +const DB_NAME = process.env.MONGODB_DB || 'tractatus_dev'; + +// Document metadata updates +const DOCUMENT_UPDATES = [ + // GETTING STARTED (order: 1-3) + { + slug: 'architectural-overview-and-research-status', + order: 1, + category: 'reference', + audience: 'general', + visibility: 'public' + }, + { + slug: 'core-concepts-of-the-tractatus-framework', + order: 2, + category: 'conceptual', + audience: 'general', + visibility: 'public' + }, + { + slug: 'implementation-guide', + order: 3, + category: 'practical', + audience: 'technical', + visibility: 'public' + }, + // FRAMEWORK DETAILS (order: 4-6) + { + slug: 'tractatus-ai-safety-framework-core-values-and-principles', + order: 4, + category: 'conceptual', + audience: 'general', + visibility: 'public' + }, + { + slug: 'case-studies-real-world-llm-failure-modes', + order: 5, + category: 'practical', + audience: 'general', + visibility: 'public' + }, + { + slug: 'ai-governance-business-case-template-tractatus-framework', + order: 6, + category: 'practical', + audience: 'business', + visibility: 'public' + }, + // REFERENCE (order: 7) + { + slug: 'tractatus-agentic-governance-system-glossary-of-terms', + order: 7, + category: 'reference', + audience: 'general', + visibility: 'public' + } +]; + +async function main() { + console.log('=== Updating Document Metadata ===\n'); + + let client; + + try { + // Connect to MongoDB + console.log('Connecting to MongoDB...'); + client = await MongoClient.connect(MONGODB_URI); + const db = client.db(DB_NAME); + const collection = db.collection('documents'); + console.log('✓ Connected\n'); + + let updated = 0; + let notFound = 0; + + // Update each document + for (const doc of DOCUMENT_UPDATES) { + console.log(`Updating: ${doc.slug}`); + console.log(` Order: ${doc.order} | Category: ${doc.category} | Audience: ${doc.audience}`); + + const result = await collection.updateOne( + { slug: doc.slug }, + { + $set: { + order: doc.order, + category: doc.category, + audience: doc.audience, + visibility: doc.visibility + } + } + ); + + if (result.matchedCount > 0) { + console.log(` ✓ Updated\n`); + updated++; + } else { + console.log(` ⚠ Not found in database\n`); + notFound++; + } + } + + // Summary + console.log('=== Summary ===\n'); + console.log(`✓ Updated: ${updated} documents`); + if (notFound > 0) { + console.log(`⚠ Not found: ${notFound} documents`); + } + console.log(`\nTotal processed: ${DOCUMENT_UPDATES.length}`); + + // Verify organization + console.log('\n=== Verification ===\n'); + const publicDocs = await collection.find({ visibility: 'public' }) + .sort({ order: 1 }) + .project({ title: 1, order: 1, category: 1, audience: 1 }) + .toArray(); + + console.log('Public documents (sorted by order):'); + publicDocs.forEach(doc => { + console.log(` ${doc.order}. ${doc.title}`); + console.log(` Category: ${doc.category} | Audience: ${doc.audience}\n`); + }); + + const archivedCount = await collection.countDocuments({ visibility: 'archived' }); + console.log(`\n📦 Archived: ${archivedCount} documents`); + console.log(`📖 Public: ${publicDocs.length} documents`); + + } catch (error) { + console.error('\n✗ Error:', error.message); + console.error(error.stack); + process.exit(1); + } finally { + if (client) await client.close(); + } +} + +// Run if called directly +if (require.main === module) { + main(); +} + +module.exports = { main }; diff --git a/src/controllers/documents.controller.js b/src/controllers/documents.controller.js index caef98a1..6b4beaf2 100644 --- a/src/controllers/documents.controller.js +++ b/src/controllers/documents.controller.js @@ -280,11 +280,47 @@ async function deleteDocument(req, res) { } } +/** + * List archived documents + * GET /api/documents/archived + */ +async function listArchivedDocuments(req, res) { + try { + const { limit = 50, skip = 0 } = req.query; + + const documents = await Document.listArchived({ + limit: parseInt(limit), + skip: parseInt(skip) + }); + + const total = await Document.count({ visibility: 'archived' }); + + res.json({ + success: true, + documents, + pagination: { + total, + limit: parseInt(limit), + skip: parseInt(skip), + hasMore: parseInt(skip) + documents.length < total + } + }); + + } catch (error) { + logger.error('List archived documents error:', error); + res.status(500).json({ + error: 'Internal Server Error', + message: 'An error occurred' + }); + } +} + module.exports = { listDocuments, getDocument, searchDocuments, createDocument, updateDocument, - deleteDocument + deleteDocument, + listArchivedDocuments }; diff --git a/src/models/Document.model.js b/src/models/Document.model.js index 4c808039..18a9d876 100644 --- a/src/models/Document.model.js +++ b/src/models/Document.model.js @@ -18,8 +18,11 @@ class Document { slug: data.slug, quadrant: data.quadrant, // STR/OPS/TAC/SYS/STO persistence: data.persistence, // HIGH/MEDIUM/LOW/VARIABLE - audience: data.audience || 'general', // technical, general, researcher, implementer, advocate - visibility: data.visibility || 'public', // public, internal, confidential + audience: data.audience || 'general', // technical, general, researcher, implementer, advocate, business, developer + visibility: data.visibility || 'public', // public, internal, confidential, archived + category: data.category || 'none', // conceptual, practical, reference, archived, project-tracking, research-proposal, research-topic + order: data.order || 999, // Display order (1-999, lower = higher priority) + archiveNote: data.archiveNote || null, // Explanation for why document was archived content_html: data.content_html, content_markdown: data.content_markdown, toc: data.toc || [], @@ -161,7 +164,7 @@ class Document { */ static async list(options = {}) { const collection = await getCollection('documents'); - const { limit = 50, skip = 0, sort = { 'metadata.date_created': -1 }, filter = {} } = options; + const { limit = 50, skip = 0, sort = { order: 1, 'metadata.date_created': -1 }, filter = {} } = options; return await collection .find(filter) @@ -171,6 +174,21 @@ class Document { .toArray(); } + /** + * List archived documents + */ + static async listArchived(options = {}) { + const collection = await getCollection('documents'); + const { limit = 50, skip = 0, sort = { 'metadata.date_created': -1 } } = options; + + return await collection + .find({ visibility: 'archived' }) + .sort(sort) + .skip(skip) + .limit(limit) + .toArray(); + } + /** * Count documents */ diff --git a/src/routes/documents.routes.js b/src/routes/documents.routes.js index a73f4b95..a159da03 100644 --- a/src/routes/documents.routes.js +++ b/src/routes/documents.routes.js @@ -20,6 +20,11 @@ router.get('/search', asyncHandler(documentsController.searchDocuments) ); +// GET /api/documents/archived +router.get('/archived', + asyncHandler(documentsController.listArchivedDocuments) +); + // GET /api/documents router.get('/', (req, res, next) => { // Redirect browser requests to API documentation