tractatus/src/routes/governance.routes.js
TheFlow 426fde1ac5 feat(infra): semantic versioning and systemd service implementation
**Cache-Busting Improvements:**
- Switched from timestamp-based to semantic versioning (v1.0.2)
- Updated all HTML files: index.html, docs.html, leader.html
- CSS: tailwind.css?v=1.0.2
- JS: navbar.js, document-cards.js, docs-app.js v1.0.2
- Professional versioning approach for production stability

**systemd Service Implementation:**
- Created tractatus-dev.service for development environment
- Created tractatus-prod.service for production environment
- Added install-systemd.sh script for easy deployment
- Security hardening: NoNewPrivileges, PrivateTmp, ProtectSystem
- Resource limits: 1GB dev, 2GB prod memory limits
- Proper logging integration with journalctl
- Automatic restart on failure (RestartSec=10)

**Why systemd over pm2:**
1. Native Linux integration, no additional dependencies
2. Better OS-level security controls (ProtectSystem, ProtectHome)
3. Superior logging with journalctl integration
4. Standard across Linux distributions
5. More robust process management for production

**Usage:**
  # Development:
  sudo ./scripts/install-systemd.sh dev

  # Production:
  sudo ./scripts/install-systemd.sh prod

  # View logs:
  sudo journalctl -u tractatus -f

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-09 09:16:22 +13:00

201 lines
4 KiB
JavaScript

/**
* Tractatus Governance Routes
* API endpoints for framework status and testing
*/
const express = require('express');
const router = express.Router();
const { governanceStatus } = require('../middleware/tractatus/governance.middleware');
const { authenticateToken, requireAdmin } = require('../middleware/auth.middleware');
const { asyncHandler } = require('../middleware/error.middleware');
// Import services for testing endpoints
const {
classifier,
validator,
enforcer,
monitor,
verifier,
getFrameworkStatus
} = require('../services');
/**
* GET /api/governance
* Get framework status (admin only - contains sensitive runtime data)
*/
router.get('/',
authenticateToken,
requireAdmin,
(req, res, next) => {
// Redirect browser requests to API documentation
const acceptsHtml = req.accepts('html');
const acceptsJson = req.accepts('json');
if (acceptsHtml && !acceptsJson) {
return res.redirect(302, '/api-reference.html#governance');
}
next();
},
governanceStatus
);
/**
* GET /api/governance/status
* Detailed governance status (admin only)
*/
router.get('/status',
authenticateToken,
requireAdmin,
asyncHandler(async (req, res) => {
const status = getFrameworkStatus();
res.json({
success: true,
...status,
uptime: process.uptime(),
environment: process.env.NODE_ENV
});
})
);
/**
* POST /api/governance/classify
* Test instruction classification (admin only)
*/
router.post('/classify',
authenticateToken,
requireAdmin,
asyncHandler(async (req, res) => {
const { text, context } = req.body;
if (!text) {
return res.status(400).json({
error: 'Bad Request',
message: 'text field is required'
});
}
const classification = classifier.classify({
text,
context: context || {},
timestamp: new Date(),
source: 'test'
});
res.json({
success: true,
classification
});
})
);
/**
* POST /api/governance/validate
* Test action validation (admin only)
*/
router.post('/validate',
authenticateToken,
requireAdmin,
asyncHandler(async (req, res) => {
const { action, context } = req.body;
if (!action) {
return res.status(400).json({
error: 'Bad Request',
message: 'action object is required'
});
}
const validation = validator.validate(action, context || {
messages: []
});
res.json({
success: true,
validation
});
})
);
/**
* POST /api/governance/enforce
* Test boundary enforcement (admin only)
*/
router.post('/enforce',
authenticateToken,
requireAdmin,
asyncHandler(async (req, res) => {
const { action, context } = req.body;
if (!action) {
return res.status(400).json({
error: 'Bad Request',
message: 'action object is required'
});
}
const enforcement = enforcer.enforce(action, context || {});
res.json({
success: true,
enforcement
});
})
);
/**
* POST /api/governance/pressure
* Test pressure analysis (admin only)
*/
router.post('/pressure',
authenticateToken,
requireAdmin,
asyncHandler(async (req, res) => {
const { context } = req.body;
const pressure = monitor.analyzePressure(context || {
tokenUsage: 50000,
tokenBudget: 200000,
messageCount: 20
});
res.json({
success: true,
pressure
});
})
);
/**
* POST /api/governance/verify
* Test metacognitive verification (admin only)
*/
router.post('/verify',
authenticateToken,
requireAdmin,
asyncHandler(async (req, res) => {
const { action, reasoning, context } = req.body;
if (!action) {
return res.status(400).json({
error: 'Bad Request',
message: 'action object is required'
});
}
const verification = verifier.verify(
action,
reasoning || {},
context || {}
);
res.json({
success: true,
verification
});
})
);
module.exports = router;