tractatus/scripts/seed-calendar-tasks.js
TheFlow 2298d36bed fix(submissions): restructure Economist package and fix article display
- Create Economist SubmissionTracking package correctly:
  * mainArticle = full blog post content
  * coverLetter = 216-word SIR— letter
  * Links to blog post via blogPostId
- Archive 'Letter to The Economist' from blog posts (it's the cover letter)
- Fix date display on article cards (use published_at)
- Target publication already displaying via blue badge

Database changes:
- Make blogPostId optional in SubmissionTracking model
- Economist package ID: 68fa85ae49d4900e7f2ecd83
- Le Monde package ID: 68fa2abd2e6acd5691932150

Next: Enhanced modal with tabs, validation, export

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-24 08:47:42 +13:00

273 lines
9.6 KiB
JavaScript
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env node
/**
* Seed Calendar with Initial Tasks
*
* Migrates tasks from MONTHLY-REVIEW-SCHEDULE.md and adds framework analysis tasks
*
* Copyright 2025 Tractatus Project
* Licensed under Apache License 2.0
*/
const mongoose = require('mongoose');
const ScheduledTask = require('../src/models/ScheduledTask.model.js');
const MONGODB_URI = 'mongodb://localhost:27017/tractatus_dev';
/**
* Initial tasks to seed
*/
const tasksToSeed = [
// Framework Analysis Tasks (from user request)
{
title: 'Research: Auto-Compaction Impact on Claude Code Quality',
description: 'Conduct systematic research on how conversation auto-compaction affects Claude\'s code quality. Track metrics pre/post compaction to gather evidence. User specifically requested emphasis on understanding this impact.',
dueDate: new Date('2025-11-15T10:00:00'),
priority: 'HIGH',
category: 'research',
recurrence: 'once',
documentRef: 'docs/AUTONOMOUS_FRAMEWORK_WORK_2025-10-23.md',
assignedTo: 'PM',
showInSessionInit: true,
reminderDaysBefore: 14,
tags: ['framework', 'quality', 'auto-compaction'],
metadata: {
source: 'user-request-2025-10-23',
research_type: 'quality_analysis'
}
},
{
title: 'Research: Evidence for 50 Instruction Limit',
description: 'Investigate evidence supporting the 50 active instruction limit. Explore whether context-aware instruction loading (applying rules to individual tasks/prompts) could be more effective than all-instructions-always approach.',
dueDate: new Date('2025-11-20T10:00:00'),
priority: 'HIGH',
category: 'research',
recurrence: 'once',
documentRef: 'docs/AUTONOMOUS_FRAMEWORK_WORK_2025-10-23.md',
assignedTo: 'PM',
showInSessionInit: true,
reminderDaysBefore: 14,
tags: ['framework', 'instructions', 'optimization'],
metadata: {
source: 'user-request-2025-10-23',
research_type: 'architecture_analysis'
}
},
// From MONTHLY-REVIEW-SCHEDULE.md - November 2025
{
title: 'CRITICAL: Privacy-Preserving Analytics Implementation Decision',
description: 'DECISION REQUIRED: Choose analytics approach for website. Options: (A) Remove analytics claims from privacy policy, or (B) Implement Plausible Analytics ($9/month, privacy-first). This is a values-sensitive decision requiring human PM approval.',
dueDate: new Date('2025-11-01T09:00:00'),
priority: 'CRITICAL',
category: 'governance',
recurrence: 'once',
documentRef: 'docs/governance/PRIVACY-PRESERVING-ANALYTICS-PLAN.md',
assignedTo: 'PM',
showInSessionInit: true,
reminderDaysBefore: 7,
tags: ['privacy', 'analytics', 'values', 'decision-required'],
metadata: {
source: 'MONTHLY-REVIEW-SCHEDULE.md',
decision_type: 'values-sensitive',
deferred_date: '2025-10-11'
}
},
{
title: 'Monthly Review: Tractatus Governance Schedule',
description: 'Review MONTHLY-REVIEW-SCHEDULE.md for upcoming decisions, add new scheduled items, move completed reviews to archive section.',
dueDate: new Date('2025-11-01T10:00:00'),
priority: 'MEDIUM',
category: 'governance',
recurrence: 'monthly',
documentRef: 'docs/governance/MONTHLY-REVIEW-SCHEDULE.md',
assignedTo: 'PM',
showInSessionInit: true,
reminderDaysBefore: 3,
tags: ['monthly-review', 'governance']
},
// Recurring Monthly Checks - Framework Health
{
title: 'Monthly Framework Health Check',
description: 'Review framework health metrics: (1) Audit logs for boundary violations, (2) Component activity rates, (3) Instruction history growth patterns, (4) Monitor pressure checkpoints and session failures.',
dueDate: new Date('2025-11-05T10:00:00'),
priority: 'HIGH',
category: 'framework',
recurrence: 'monthly',
documentRef: 'docs/governance/MONTHLY-REVIEW-SCHEDULE.md',
assignedTo: 'PM',
showInSessionInit: true,
reminderDaysBefore: 2,
tags: ['monthly-check', 'framework-health', 'monitoring']
},
// Recurring Monthly Checks - Community Engagement
{
title: 'Monthly Community Engagement Review',
description: 'Review community engagement: (1) Media inquiry queue status, (2) Process pending case study submissions, (3) Check AI-curated blog post suggestions for human approval.',
dueDate: new Date('2025-11-10T14:00:00'),
priority: 'MEDIUM',
category: 'project',
recurrence: 'monthly',
documentRef: 'docs/governance/MONTHLY-REVIEW-SCHEDULE.md',
assignedTo: 'PM',
showInSessionInit: true,
reminderDaysBefore: 3,
tags: ['monthly-check', 'community', 'engagement']
},
// Recurring Monthly Checks - Security & Privacy
{
title: 'Monthly Security & Privacy Audit',
description: 'Security audit: (1) Review server logs for suspicious activity (90-day retention), (2) Verify HTTPS certificate renewals, (3) Check backup integrity, (4) Audit admin access logs.',
dueDate: new Date('2025-11-15T09:00:00'),
priority: 'HIGH',
category: 'security',
recurrence: 'monthly',
documentRef: 'docs/governance/MONTHLY-REVIEW-SCHEDULE.md',
assignedTo: 'PM',
showInSessionInit: true,
reminderDaysBefore: 5,
tags: ['monthly-check', 'security', 'privacy', 'compliance']
},
// Annual Reviews - October 2026
{
title: 'ANNUAL REVIEW: Core Values and Principles',
description: 'Comprehensive annual evaluation of Tractatus core values and principles. Scope: Assess values relevance, implementation effectiveness, community alignment. Authority: Human PM with community input. Outcome: Updated version or reaffirmation.',
dueDate: new Date('2026-10-06T10:00:00'),
priority: 'CRITICAL',
category: 'governance',
recurrence: 'yearly',
documentRef: 'docs/governance/TRA-VAL-0001-core-values-principles-v1-0.md',
assignedTo: 'PM',
showInSessionInit: true,
reminderDaysBefore: 30,
tags: ['annual-review', 'values', 'governance', 'community'],
metadata: {
review_type: 'annual',
created_date: '2025-10-06',
review_cycle: 'yearly'
}
},
// Calendar System Implementation Completion Task
{
title: 'Document Autonomous Framework Work in Calendar',
description: 'Add reference to AUTONOMOUS_FRAMEWORK_WORK_2025-10-23.md to calendar system. This task tracks the successful completion of autonomous framework improvements (test suite, inst_076) and calendar system implementation.',
dueDate: new Date('2025-10-24T12:00:00'),
priority: 'MEDIUM',
category: 'framework',
recurrence: 'once',
documentRef: 'docs/AUTONOMOUS_FRAMEWORK_WORK_2025-10-23.md',
assignedTo: 'PM',
showInSessionInit: true,
reminderDaysBefore: 1,
tags: ['calendar', 'documentation', 'framework'],
metadata: {
source: 'calendar-implementation',
auto_complete: true
}
}
];
/**
* Main seeding function
*/
async function seedCalendar() {
console.log('━'.repeat(70));
console.log(' 📅 Seeding Calendar with Initial Tasks');
console.log('━'.repeat(70));
console.log('');
try {
// Connect to MongoDB
console.log('Connecting to MongoDB...');
await mongoose.connect(MONGODB_URI);
console.log('✓ Connected to tractatus_dev');
console.log('');
// Check existing tasks
const existingCount = await ScheduledTask.countDocuments();
console.log(`📊 Current task count: ${existingCount}`);
if (existingCount > 0) {
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
const answer = await new Promise(resolve => {
rl.question('\n⚠ Calendar already has tasks. Add these tasks anyway? (y/n): ', answer => {
rl.close();
resolve(answer.toLowerCase());
});
});
if (answer !== 'y' && answer !== 'yes') {
console.log('\n✗ Seeding cancelled by user');
await mongoose.connection.close();
process.exit(0);
}
}
console.log('');
console.log(`Adding ${tasksToSeed.length} tasks to calendar...`);
console.log('');
let successCount = 0;
let errorCount = 0;
for (const taskData of tasksToSeed) {
try {
const task = new ScheduledTask(taskData);
await task.save();
console.log(` ✓ Added: ${taskData.title.substring(0, 60)}...`);
console.log(` Due: ${taskData.dueDate.toLocaleDateString()} | Priority: ${taskData.priority} | ${taskData.category}`);
successCount++;
} catch (err) {
console.log(` ✗ Failed: ${taskData.title.substring(0, 60)}...`);
console.log(` Error: ${err.message}`);
errorCount++;
}
}
console.log('');
console.log('━'.repeat(70));
console.log(` Seeding Complete: ${successCount} added, ${errorCount} failed`);
console.log('━'.repeat(70));
console.log('');
// Show summary by category
const summary = await ScheduledTask.aggregate([
{ $match: { status: { $in: ['pending', 'overdue'] } } },
{ $group: { _id: '$category', count: { $sum: 1 } } },
{ $sort: { count: -1 } }
]);
console.log('📊 Active Tasks by Category:');
summary.forEach(item => {
console.log(` ${item._id}: ${item.count}`);
});
console.log('');
console.log('✓ Calendar system ready');
console.log(' View at: http://localhost:9000/admin/calendar.html');
console.log('');
await mongoose.connection.close();
process.exit(0);
} catch (err) {
console.error('');
console.error('✗ Seeding failed:', err.message);
console.error('');
await mongoose.connection.close();
process.exit(1);
}
}
// Run seeding
seedCalendar();