tractatus/docs/BLOG_CURATION_WORKFLOW.md
TheFlow b9b72d99e0 docs: Add manual blog publishing workflow to curation docs
Documents the proven mongosh-based method for directly publishing
blog posts, including schema, production paths, and verification steps.

Note: Pre-commit hook flags existing example violations in this doc
(they demonstrate what inst_016/017/018 violations look like).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-08 18:08:17 +13:00

713 lines
19 KiB
Markdown

# Blog Curation Workflow Documentation
**Feature**: AI-Assisted Blog Content Generation with Human Oversight
**Policy**: TRA-OPS-0002 (AI suggests, human decides)
**Tractatus Enforcement**: inst_016, inst_017, inst_018
**Status**: Phase 4 - Production Ready
---
## Table of Contents
1. [Overview](#overview)
2. [Workflow](#workflow)
3. [Tractatus Framework Enforcement](#tractatus-framework-enforcement)
4. [Using the Admin UI](#using-the-admin-ui)
5. [API Endpoints](#api-endpoints)
6. [Troubleshooting](#troubleshooting)
---
## Overview
The Blog Curation system enables AI-assisted content generation while maintaining strict human oversight and Tractatus framework compliance. All AI-generated content undergoes mandatory validation against ethical principles before publication.
### Key Principles
1. **AI Suggests, Human Decides** (TRA-OPS-0002)
- AI generates draft content and suggestions
- All content requires human review and approval
- No automated publication without human oversight
2. **Tractatus Enforcement**
- **inst_016**: Never fabricate statistics or make unverifiable claims
- **inst_017**: Never use absolute assurance terms (guarantee, 100%, never fails)
- **inst_018**: Never claim production-ready status without evidence
3. **Editorial Quality**
- Evidence-based, transparent, honest content
- Professional tone, clear structure
- Cites sources for all claims and statistics
---
## Workflow
### High-Level Flow
```
┌─────────────────┐
│ Admin Requests │
│ Blog Draft │
└────────┬────────┘
┌─────────────────┐
│ Boundary Check │ ◄── TRA-OPS-0002
│ (BoundaryEnforcer)
└────────┬────────┘
┌─────────────────┐
│ Generate Draft │
│ (Claude API) │
└────────┬────────┘
┌─────────────────┐
│ Validate │ ◄── inst_016, inst_017, inst_018
│ (Tractatus) │
└────────┬────────┘
┌─────────────────┐
│ Queue for │
│ Human Review │
└────────┬────────┘
┌─────────────────┐
│ Human Reviews │
│ Approve/Reject │
└────────┬────────┘
[Publish]
```
### Detailed Steps
#### 1. Draft Generation
**Actor**: Admin user
**Location**: `/admin/blog-curation.html`
1. Admin fills out draft request form:
- **Topic**: Blog post topic (required)
- **Audience**: researcher/implementer/advocate/general (required)
- **Length**: short/medium/long (default: medium)
- **Focus**: Optional specific angle or focus area
2. System performs boundary check:
- Validates that content generation is within operational boundaries
- Confirms human oversight requirement
- Logs governance action
3. Claude API generates draft:
- Receives editorial guidelines and Tractatus constraints
- Generates structured blog post (title, subtitle, content, excerpt, tags, sources)
- Returns JSON-formatted draft
4. System validates draft:
- Checks for absolute guarantee terms (inst_017)
- Verifies statistics have sources (inst_016)
- Flags unverified production claims (inst_018)
- Generates validation report
5. Draft queued for review:
- Creates moderation queue entry
- Priority: HIGH if violations detected, MEDIUM otherwise
- Status: PENDING_APPROVAL
- Includes: draft, validation results, metadata
#### 2. Human Review
**Actor**: Admin user
**Location**: `/admin/blog-curation.html` (Review Queue tab)
1. Admin views pending drafts:
- Sorted by priority (HIGH violations first)
- Shows: title, audience, creation date, violation count
2. Admin opens draft for review:
- Full content preview
- Validation results (violations, warnings, strengths)
- Governance policy information
- Source citations
3. Admin takes action:
- **Approve**: Create blog post from draft
- **Reject**: Decline draft, provide reason
- **Edit**: Modify content before approval (future feature)
4. System processes decision:
- Logs governance decision
- Updates moderation queue status
- If approved: Creates blog post in database
- If rejected: Archives with reason
#### 3. Publication
**Actor**: Admin user
**Location**: Blog management interface
Once approved, draft becomes editable blog post:
- Status: draft
- Can be further edited by admin
- Published when admin manually sets status to "published"
- Final publication requires explicit admin action
---
## Tractatus Framework Enforcement
### Automated Validation
The system automatically validates all AI-generated content against three core instructions:
#### inst_016: No Fabricated Statistics
**Rule**: Never fabricate statistics or make unverifiable claims
**Detection**:
- Scans content for percentage patterns (`\d+(\.\d+)?%`)
- Checks if sources array is populated
- Warns if statistics found without citations
**Example Violations**:
```
❌ "85% of organizations use our framework" # No source cited
❌ "Studies show 90% improvement" # Vague, unverifiable
✅ "According to [Source], 85% of surveyed organizations..."
✅ "Our 2024 user survey (N=500) found 90% improvement..."
```
#### inst_017: No Absolute Guarantees
**Rule**: Never use absolute assurance terms
**Forbidden Terms**:
- guarantee / guaranteed / guarantees
- ensures 100%
- never fails
- always works
- 100% safe / 100% secure
**Detection**:
- Case-insensitive scan for forbidden terms
- Flags violations with HIGH severity
- Blocks publication if detected
**Example Violations**:
```
❌ "Our framework guarantees 100% safety"
❌ "This approach ensures perfect compliance"
❌ "The system never fails to detect issues"
✅ "Our framework aims to improve safety"
✅ "This approach helps enhance compliance"
✅ "The system detects most common issues"
```
#### inst_018: No Unverified Production Claims
**Rule**: Never claim production-ready status without evidence
**Flagged Terms** (require citations):
- battle-tested
- production-proven
- industry-standard
**Detection**:
- Flags terms if no sources provided
- Warns (doesn't block) to allow citation addition
**Example Issues**:
```
⚠️ "Our battle-tested framework..." # Needs evidence
⚠️ "The industry-standard approach..." # Needs adoption metrics
✅ "Used in production by 12 organizations (see: [Source])"
✅ "Adopted by industry leaders including [Company A, Company B]"
```
### Validation Recommendations
The validation system provides three recommendations:
| Recommendation | Meaning | Admin Action |
|----------------|---------|--------------|
| **APPROVED** | No violations or warnings | Safe to approve |
| **REVIEW_REQUIRED** | Warnings present, no violations | Review warnings, approve if acceptable |
| **REJECT** | Violations detected | Must reject or edit to fix violations |
---
## Using the Admin UI
### Accessing Blog Curation
1. Navigate to: `https://agenticgovernance.digital/admin/blog-curation.html`
2. Login with admin credentials
3. Three main tabs available:
- **Draft Content**: Generate new blog posts
- **Review Queue**: Review pending drafts
- **Guidelines**: View editorial standards
### Generating a Draft
**Steps**:
1. Go to "Draft Content" tab
2. Fill out the form:
```
Topic: "Understanding AI Boundary Enforcement in Production Systems"
Audience: Implementers
Length: Medium (1000-1500 words)
Focus: "Real-world implementation challenges" (optional)
```
3. Click "Generate Draft"
4. Wait for AI generation (typically 10-30 seconds)
5. Review preview modal:
- Check for Tractatus violations (red alerts)
- Review warnings (yellow alerts)
- Examine sources and citations
6. Click "View in Queue" to see in review queue
### Reviewing Drafts
**Steps**:
1. Go to "Review Queue" tab
2. See list of pending drafts:
- HIGH priority (violations) shown first
- Shows title, audience, creation date
- Violation count badge
3. Click "Review" on a draft
4. Review modal opens:
- Full content displayed
- Markdown rendered to HTML
- Violations highlighted
5. Take action:
- **Approve**: Creates blog post in draft status
- **Reject**: Archives with rejection reason
- **Close**: Return to queue for later review
### Editorial Guidelines
**Reference**:
View in "Guidelines" tab for quick reference:
- **Writing Standards**: Tone, voice, style
- **Core Principles**: Transparency, honesty, evidence
- **Forbidden Patterns**: What to avoid
- **Target Word Counts**: Length guidelines
---
## API Endpoints
### POST `/api/blog/draft-post`
Generate AI blog post draft.
**Authentication**: Required (admin role)
**Request Body**:
```json
{
"topic": "Understanding AI Safety Frameworks",
"audience": "researcher",
"length": "medium",
"focus": "comparative analysis" // optional
}
```
**Response** (200 OK):
```json
{
"success": true,
"message": "Blog post draft generated. Awaiting human review and approval.",
"queue_id": "68e3a7fb21af2fd194bf4c87",
"draft": {
"title": "Understanding AI Safety Frameworks: A Comparative Analysis",
"subtitle": "Examining governance approaches in modern AI systems",
"content": "# Introduction\n\n...",
"excerpt": "This article explores...",
"tags": ["AI safety", "Governance", "Frameworks"],
"tractatus_angle": "Demonstrates sovereignty principle...",
"sources": ["https://example.com/research"],
"word_count": 1250
},
"validation": {
"valid": true,
"violations": [],
"warnings": [],
"stats_found": 3,
"sources_provided": 1,
"recommendation": "APPROVED"
},
"governance": {
"policy": "TRA-OPS-0002",
"boundary_check": { ... },
"requires_approval": true,
"tractatus_enforcement": {
"inst_016": "No fabricated statistics or unverifiable claims",
"inst_017": "No absolute assurance terms (guarantee, 100%, etc.)",
"inst_018": "No unverified production-ready claims"
}
}
}
```
**Error Response** (403 Forbidden):
```json
{
"error": "Boundary Violation",
"message": "This action crosses into values territory requiring human judgment"
}
```
### POST `/api/blog/analyze-content`
Analyze existing content for Tractatus compliance.
**Authentication**: Required (admin role)
**Request Body**:
```json
{
"title": "My Blog Post Title",
"body": "Full blog post content here..."
}
```
**Response** (200 OK):
```json
{
"success": true,
"analysis": {
"compliant": false,
"violations": [
{
"type": "ABSOLUTE_CLAIM",
"severity": "HIGH",
"excerpt": "guarantees 100% safety",
"reasoning": "Violates inst_017 - absolute assurance term",
"suggested_fix": "Replace with 'aims to improve safety' or similar qualified language"
}
],
"warnings": [ ... ],
"strengths": [ "Evidence-based", "Cites sources" ],
"overall_score": 75,
"recommendation": "EDIT_REQUIRED"
},
"tractatus_enforcement": { ... }
}
```
### GET `/api/blog/editorial-guidelines`
Retrieve editorial guidelines.
**Authentication**: Required (admin or moderator role)
**Response** (200 OK):
```json
{
"success": true,
"guidelines": {
"tone": "Professional, informative, evidence-based",
"voice": "Third-person objective (AI safety framework documentation)",
"style": "Clear, accessible technical writing",
"principles": [ ... ],
"forbiddenPatterns": [ ... ],
"targetWordCounts": {
"short": "600-900 words",
"medium": "1000-1500 words",
"long": "1800-2500 words"
}
}
}
```
### GET `/api/admin/moderation-queue?type=BLOG_POST_DRAFT`
Retrieve pending blog drafts from moderation queue.
**Authentication**: Required (admin or moderator role)
**Response** (200 OK):
```json
{
"success": true,
"queue": [
{
"_id": "68e3a7fb21af2fd194bf4c87",
"type": "BLOG_POST_DRAFT",
"status": "pending",
"priority": "high",
"created_at": "2025-10-10T12:00:00Z",
"data": {
"topic": "...",
"audience": "...",
"draft": { ... },
"validation": { ... }
}
}
],
"pagination": { ... }
}
```
---
## Troubleshooting
### Common Issues
#### Issue: "Claude API key not configured"
**Cause**: `CLAUDE_API_KEY` environment variable not set
**Solution**:
```bash
# Development
export CLAUDE_API_KEY="sk-ant-api03-..."
# Production
# Set in environment variables or .env file (not committed to git)
```
#### Issue: Draft generation times out
**Cause**: Claude API slow response or network issues
**Solution**:
- Check network connectivity
- Verify Claude API status
- Try shorter length ("short" instead of "long")
- Check API rate limits
#### Issue: All drafts show HIGH violations
**Cause**: AI generating content with forbidden patterns
**Solution**:
- Review editorial guidelines
- Check if system prompt is being sent correctly
- Verify inst_016/017/018 are in system prompt
- May need to adjust temperature (currently 0.7)
#### Issue: Moderation queue not loading
**Cause**: MongoDB connection or authentication issues
**Solution**:
```bash
# Check MongoDB connection
mongosh tractatus_dev --eval "db.adminCommand('ping')"
# Check moderation queue collection
mongosh tractatus_dev --eval "db.moderation_queue.countDocuments({ type: 'BLOG_POST_DRAFT' })"
# Verify authentication token
# Check browser console for 401 errors
```
#### Issue: Tests failing with mock errors
**Cause**: Jest mocking not properly configured
**Solution**:
```bash
# Update test file to properly mock dependencies
# See: tests/unit/BlogCuration.service.test.js
# Mock should be set up before require:
jest.mock('../../src/services/ClaudeAPI.service', () => ({
sendMessage: jest.fn(),
extractJSON: jest.fn()
}));
```
### Debugging
**Enable detailed logging**:
```javascript
// In BlogCuration.service.js
logger.setLevel('debug');
```
**Check governance logs**:
```bash
mongosh tractatus_dev --eval "
db.governance_logs.find({
action: 'BLOG_POST_DRAFT'
}).sort({ timestamp: -1 }).limit(10)
"
```
**View moderation queue entries**:
```bash
mongosh tractatus_dev --eval "
db.moderation_queue.find({
type: 'BLOG_POST_DRAFT'
}).pretty()
"
```
---
## Quick Reference: Manual Blog Publishing (via mongosh)
When you have a finished blog post and want to publish it directly (bypassing the AI curation pipeline), use this method. This is the proven approach — used successfully on 2026-02-08.
### Prerequisites
- SSH access: `ssh -i ~/.ssh/tractatus_deploy ubuntu@vps-93a693da.vps.ovh.net`
- Production database: `mongodb://localhost:27017/tractatus`
- Collection: `blog_posts`
- Production app path: `/var/www/tractatus/`
### Step 1: Create a mongosh insert script
Create a local file (e.g., `/tmp/insert-blog-post.js`) with this structure:
```javascript
// /tmp/insert-blog-post.js
db = db.getSiblingDB('tractatus');
db.blog_posts.insertOne({
title: "Your Blog Post Title",
slug: "your-blog-post-title-slugified",
subtitle: "Optional subtitle",
author: "Author Name",
content: `<p>Your HTML content here.</p>
<h2>Section Heading</h2>
<p>More content...</p>`,
excerpt: "A short summary for the blog listing page.",
tags: ["tag1", "tag2", "tag3"],
status: "published",
featured: false,
publishedAt: new Date(),
createdAt: new Date(),
updatedAt: new Date()
});
print("Blog post inserted successfully");
print("URL: https://agenticgovernance.digital/blog-post.html?slug=your-blog-post-title-slugified");
```
**Important**: Content must be HTML (not markdown). The blog renders content via `innerHTML`.
### Step 2: Upload and execute on production
```bash
# Upload the script
scp -i ~/.ssh/tractatus_deploy /tmp/insert-blog-post.js \
ubuntu@vps-93a693da.vps.ovh.net:/tmp/insert-blog-post.js
# Execute it
ssh -i ~/.ssh/tractatus_deploy ubuntu@vps-93a693da.vps.ovh.net \
"mongosh --quiet mongodb://localhost:27017/tractatus /tmp/insert-blog-post.js"
# Clean up
ssh -i ~/.ssh/tractatus_deploy ubuntu@vps-93a693da.vps.ovh.net \
"rm /tmp/insert-blog-post.js"
```
### Step 3: Verify
```bash
# Check via API
curl -s "https://agenticgovernance.digital/api/blog/your-slug-here" | python3 -m json.tool | head -5
# View in browser
# https://agenticgovernance.digital/blog-post.html?slug=your-slug-here
# Also listed on: https://agenticgovernance.digital/blog.html
```
### Blog post schema fields
| Field | Type | Required | Notes |
|-------|------|----------|-------|
| `title` | String | Yes | Display title |
| `slug` | String | Yes | URL-safe, lowercase, hyphens. Must be unique |
| `subtitle` | String | No | Shown below title |
| `author` | String | Yes | Author name |
| `content` | String | Yes | **HTML** (not markdown) |
| `excerpt` | String | Yes | Short summary for listing page |
| `tags` | Array | No | String array for categorization |
| `status` | String | Yes | `"published"` or `"draft"` |
| `featured` | Boolean | No | Highlights on blog listing |
| `publishedAt` | Date | Yes | Publication timestamp |
| `createdAt` | Date | Yes | Creation timestamp |
| `updatedAt` | Date | Yes | Last update timestamp |
### Deploying frontend changes (navbar, blog page, etc.)
The Tractatus deploy script handles cache busting and rsync:
```bash
cd ~/projects/tractatus
# Frontend only (public/ directory)
./scripts/deploy.sh --frontend-only --yes
# Single file (manual scp)
scp -i ~/.ssh/tractatus_deploy public/js/components/navbar.js \
ubuntu@vps-93a693da.vps.ovh.net:/var/www/tractatus/public/js/components/navbar.js
```
**Production paths**: App root is `/var/www/tractatus/` (NOT `/home/ubuntu/tractatus/`). The `/home/ubuntu/tractatus/` directory only contains a `scripts/` folder.
---
## Next Steps
### Future Enhancements
1. **Edit Before Approval**: Allow admins to edit drafts before approval
2. **Batch Operations**: Approve/reject multiple drafts at once
3. **Draft Templates**: Pre-defined templates for common blog types
4. **Multi-language Support**: Generate drafts in multiple languages
5. **SEO Optimization**: Automated SEO suggestions
6. **Image Generation**: AI-suggested featured images
7. **Scheduled Publishing**: Queue approved posts for future publication
### Monitoring
**Metrics to track**:
- Draft generation success rate
- Average validation score
- Violation frequency by type
- Human approval rate
- Time from draft to publication
**Alerts to configure**:
- High violation frequency (>50% of drafts)
- Draft generation failures
- Queue backlog (>10 pending drafts)
- API errors or timeouts
---
## Reference Documents
- **Tractatus Framework**: `CLAUDE_Tractatus_Maintenance_Guide.md`
- **Framework Enforcement**: `docs/claude-code-framework-enforcement.md`
- **Instruction History**: `.claude/instruction-history.json`
- **API Documentation**: See controller files in `src/controllers/blog.controller.js`
---
**Last Updated**: 2025-10-10
**Version**: 1.0.0
**Status**: Production Ready
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>