chore: bump cache version to 0.1.1 for JS changes

This commit is contained in:
TheFlow 2025-10-25 08:47:54 +13:00
parent 65784f02f8
commit 649eda71e1
22 changed files with 394 additions and 363 deletions

View file

@ -1,6 +1,6 @@
# Session Closedown - 2025-10-24
## ⚠️ MANDATORY STARTUP PROCEDURE (CLAUDE.md)
## ⚠️ MANDATORY STARTUP PROCEDURE
**FIRST ACTION - NO EXCEPTIONS**: Run the session initialization script:
@ -8,15 +8,13 @@
node scripts/session-init.js
```
**What this does**:
- ✅ **ENFORCES** local server running on port 9000 (BLOCKS if not running)
- ✅ Initializes all 6 framework components
- ✅ Resets token checkpoints (50k, 100k, 150k)
- ✅ Loads instruction history (50 active rules)
- ✅ Runs pressure check and framework tests
- ✅ Syncs governance rules to database
**If blocked**: Script will detect missing server and show fix instructions. Follow them, then re-run.
This will:
- ✅ Verify local server running on port 9000
- ✅ Initialize all 6 framework components
- ✅ Reset token checkpoints
- ✅ Load instruction history
- ✅ Display framework statistics
- ✅ Run framework tests
**Per CLAUDE.md**: This is MANDATORY at start of every session AND after context compaction.
@ -24,244 +22,197 @@ node scripts/session-init.js
## Session Summary
**Session Focus**: Bug fixes and framework audit improvements
**Duration**: Extended continuation session
**Main Tasks Completed**:
1. ✅ Fixed newsletter DELETE button (ObjectId serialization bug)
2. ✅ Improved ESLint compliance (108→78 errors)
3. ✅ Fixed audit analytics to read from MongoDB instead of obsolete JSONL files
4. ⚠️ **DISCOVERED**: Framework not logging audit data during Claude Code sessions
**Date**: 2025-10-24
**Session ID**: main
---
## Critical Findings
## Framework Performance
### 🚨 Framework Audit Logging FAILURE
### Context Pressure Gauge
**Problem**: Tractatus framework is NOT self-auditing during Claude Code sessions.
```
Pressure: NaN%
Status: NORMAL
**Evidence**:
- Only 11 total audit entries in tractatus_dev database
- Most recent context pressure analysis: Oct 9 (2 weeks old)
- Only 2 pressure checks recorded (both from integration tests)
- Framework should log EVERY session but isn't
**Impact**:
- No visibility into framework enforcement effectiveness
- Audit dashboard shows stale/minimal data
- Cannot verify framework is actually protecting against violations
**Root Cause**: Framework hooks not triggering during Claude Code sessions, OR
MemoryProxy not initialized properly, OR sessions running but not logging
**Action Required**:
1. Investigate why framework doesn't log during daily Claude Code usage
2. Check if session-init.js properly initializes audit logging
3. Verify MemoryProxy connects to database during sessions
4. Test framework logging manually to confirm it works
---
## Work Completed This Session
### 1. Newsletter DELETE Button Fix (3 attempts)
**Final Solution**: Server-side ObjectId serialization
- File: `src/controllers/newsletter.controller.js:227-231`
- Fix: `.map(sub => ({ ...sub, _id: sub._id.toString() }))`
- Root cause: MongoDB ObjectId objects sent to frontend became `[object Object]`
- Deployed to production ✅
### 2. ESLint Improvements
**Files Modified**: 41 files in `src/`
- Reduced errors from 108+ to 78 (28% improvement)
- Auto-fixed: property shorthand, template literals, prefer const
- Created `.eslintignore` to exclude test files from CI
- Remaining: 61 unused variables, 17 style issues (non-critical)
### 3. Audit Analytics Dashboard Fix
**Problem**: Reading from obsolete `.memory/audit/decisions-*.jsonl` files
**Solution**: Updated to read from MongoDB `auditLogs` collection
- File: `src/controllers/audit.controller.js:30-48`
- Now shows current data (through Oct 23)
- Deployed to production ✅
**INCOMPLETE**: Dashboard still only shows 5 action types instead of 6
- Missing: `pluralistic_deliberation` or similar from PluralisticDeliberationOrchestrator
- Action required: Update dashboard to handle all 6 framework service types
---
## Git Status
**Branch**: main
**Last Commits**:
- `3e993a8` - fix(audit): read audit logs from MongoDB instead of JSONL files
- `47833e3` - fix(newsletter): serialize ObjectId to string in API response
- `1fbc0c7` - fix(newsletter): convert ObjectId to string in DELETE button data attributes
- `2242e6c` - fix(cache): force cache bust for newsletter-management.js DELETE fix
- `cdbc2ef` - refactor(lint): fix code style and unused variables across src/
**Working Tree**: Clean ✅
---
## Pending Issues
### HIGH PRIORITY
1. **Framework Audit Logging Not Working**
- Framework doesn't log during Claude Code sessions
- Only test data from Oct 9 exists
- Breaks audit analytics dashboard purpose
- **Next Claude: Investigate and fix**
2. **Audit Dashboard Missing 6th Service Type**
- Currently shows 5 action types
- Should show all 6 framework services
- PluralisticDeliberationOrchestrator data not displayed
- **Next Claude: Add support for deliberation action type**
### MEDIUM PRIORITY
3. **Remaining ESLint Errors (78 total)**
- 61 unused variables (intentional/defensive coding)
- 17 style issues (line length, etc.)
- Not blocking, but CI still fails
- Could auto-fix with script if desired
4. **Background Server Processes**
- 11 background bash processes running (npm start, server restarts)
- Should clean up: `pkill -f "npm start"`
- Not critical but wastes resources
---
## Framework Performance Assessment
**Auto-Compact Rule Enforcement**: ⚠️ UNKNOWN
- No audit data from actual Claude Code sessions
- Cannot assess if framework prevented premature compacting
- Framework may not be active during sessions
**Pressure Monitor Performance**: ⚠️ FAILING
- Only 2 pressure checks recorded (Oct 9)
- No recent pressure monitoring data
- Should be checking pressure throughout every session
- **Critical gap in framework protection**
---
## Environment Status
**Local Development**:
- Server: Running on port 9000 ✅
- Database: tractatus_dev (MongoDB port 27017) ✅
- Collections: 17 total, most important:
- `auditLogs`: 11 entries (STALE DATA)
- `governance_logs`: 5 entries
- `governance_rules`: 79 rules loaded
- `sessions`: 8 sessions tracked
**Production**:
- Server: tractatus.service running ✅
- Database: Connected ✅
- Last deployment: 07:39 UTC (audit controller fix)
---
## Instructions for Next Claude
### STARTUP SEQUENCE (MANDATORY - per CLAUDE.md)
**Step 1: Run session-init.js** (FIRST ACTION - NO EXCEPTIONS)
```bash
node scripts/session-init.js
```
**This script will**:
- Check if local server is running on port 9000 (BLOCKS if not)
- Initialize all framework components
- Reset token checkpoints for new session
- Load instruction history
- Run framework tests
- Sync governance rules to MongoDB
✅ Context pressure is normal.
### Statistics
⚠️ **No framework activity recorded**
Framework services were not triggered during this session. This is expected if the PreToolUse hook is not yet active (requires session restart).
### Audit Logs
**Total Logs**: 0
**Services Logging**: 0/6
⚠️ **Warning**: Not all framework services are logging audit data.
---
## Git Changes & Deployment
**Branch**: `main`
**Working Tree**: modified
### Deployment-Ready Changes (17)
- src/services/BoundaryEnforcer.service.js
- src/services/ContextPressureMonitor.service.js
- src/services/CrossReferenceValidator.service.js
- src/services/InstructionPersistenceClassifier.service.js
- src/services/MetacognitiveVerifier.service.js
- src/services/PluralisticDeliberationOrchestrator.service.js
- public/admin/audit-analytics.html
- public/js/admin/audit-analytics.js
- src/controllers/audit.controller.js
- src/middleware/auth.middleware.js
- claude/instruction-history.json
- .claude/settings.json
- .claude/hooks/
- scripts/session-init.js
- scripts/add-inst-077-closedown-script.js
- scripts/hook-validators/framework-integration-hook.js
- scripts/session-closedown.js
### Deployment Status
❌ **FAILED**
Error: Command failed: bash /home/theflow/projects/tractatus/scripts/deploy-full-project-SAFE.sh
⚠️ File not found: public/admin/admin-dashboard.html
```
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 TRACTATUS FULL PROJECT DEPLOYMENT (SAFE MODE)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
[1/5] CACHE VERSION UPDATE (MANDATORY)
⚠ JavaScript files changed since last commit:
- public/js/admin/audit-analytics.js
Running cache version update (MANDATORY)...
══════════════════════════════════════════════════════════════════════
Tractatus - Cache Version Update (CRITICAL FOR .JS CHANGES)
══════════════════════════════════════════════════════════════════════
📦 Package version: 0.1.0
🔄 New semantic version: 0.1.1
🔄 New cache-bust version: 0.1.0.1761302585829
Step 1: Updating service worker...
✅ service-worker.js: Updated CACHE_VERSION to 0.1.1
Step 2: Updating version.json...
✅ version.json: Updated to 0.1.1
Step 3: Updating HTML cache parameters...
✅ public/index.html: Updated 10 cache version(s)
✅ public/docs.html: Updated 10 cache version(s)
✅ public/faq.html: Updated 17 cache version(s)
✅ public/researcher.html: Updated 11 cache version(s)
✅ public/implementer.html: Updated 10 cache version(s)
✅ public/leader.html: Updated 11 cache version(s)
✅ public/about.html: Updated 9 cache version(s)
✅ public/privacy.html: Updated 6 cache version(s)
✅ public/blog.html: Updated 7 cache version(s)
✅ public/blog-post.html: Updated 5 cache version(s)
✅ public/docs-viewer.html: Updated 8 cache version(s)
✅ public/api-reference.html: Updated 3 cache version(s)
✅ public/media-inquiry.html: Updated 6 cache version(s)
✅ public/case-submission.html: Updated 6 cache version(s)
✅ public/koha.html: Updated 9 cache version(s)
✅ public/check-version.html: Updated 1 cache version(s)
public/admin/blog-curation.html: No changes needed
══════════════════════════════════════════════════════════════════════
Summary: 16/18 HTML files updated
══════════════════════════════════════════════════════════════════════
✅ Cache version update complete!
📝 Files modified:
- public/service-worker.js (CACHE_VERSION)
- public/version.json (version + buildDate)
- 16 HTML files (?v= parameters)
⚠️ NEXT STEPS:
1. Review changes: git diff
2. Commit: git add -A && git commit -m "chore: bump cache version"
3. Deploy to production
✓ Cache version updated
⚠ IMPORTANT: Uncommitted changes detected!
Cache version files have been updated. You should:
1. Review changes: git diff
2. Commit: git add -A && git commit -m 'chore: bump cache version'
3. Re-run deployment
**If blocked by server check**: Follow on-screen instructions to start server, then re-run init script.
**Step 2: Verify Audit Logging** (Framework Health Check)
```bash
# Check current audit log status:
node -e "
const { MongoClient } = require('mongodb');
(async () => {
const client = await MongoClient.connect('mongodb://localhost:27017');
const db = client.db('tractatus_dev');
const count = await db.collection('auditLogs').countDocuments();
console.log('Audit logs:', count);
const latest = await db.collection('auditLogs').findOne({}, {sort: {timestamp: -1}});
console.log('Latest:', latest?.timestamp, latest?.action);
await client.close();
})();
"
```
### PRIORITY TASKS
**Task 1: Fix Framework Audit Logging**
- Investigate why framework doesn't log during Claude Code sessions
- Check MemoryProxy initialization in session-init.js
- Test audit logging manually
- Verify hooks are triggering
- **Goal**: Framework should self-audit every action
### Excluded from Deployment (7)
**Task 2: Add 6th Service Type to Dashboard**
- Update audit analytics to show PluralisticDeliberationOrchestrator
- Likely action type: `pluralistic_deliberation` or `REQUIRE_HUMAN_DECISION`
- File: `src/controllers/audit.controller.js` and/or frontend
- Test with all 6 service types
- .claude/session-state.json
- .claude/token-checkpoints.json
- SESSION_CLOSEDOWN_2025-10-24.md
- SESSION_SUMMARY_2025-10-24_AUDIT_LOGGING_FIX.md
- docs/SESSION_MANAGEMENT_ARCHITECTURE.md
- CLAUDE.md
- docs/FRAMEWORK_HOOK_INTEGRATION.md
**Task 3: Clean Up Background Processes**
- Kill stray npm/node processes
- One clean server instance only
**Recent Commits**:
```
5811aaf docs(session): clarify startup prompt works for new session OR compaction
0f8c600 docs(session): add optimal startup prompt for next Claude session
2056d0d docs(session): add corrected session closedown with proper startup references
3e993a8 fix(audit): read audit logs from MongoDB instead of JSONL files
47833e3 fix(newsletter): serialize ObjectId to string in API response
```
---
## Context for Next Session
## Cleanup Summary
**What User is Working On**: Development of Tractatus AI governance framework website
**Current Phase**: Maintenance and bug fixes
**User Expectations**: Framework should self-audit and provide visibility into its enforcement actions
**User's Complaint**: "the most recent data is 10/10/2025 nearly two weeks old???"
**Our Discovery**: Framework not logging during actual use, only test data exists
**Key Reference Documents**:
- **CLAUDE.md** - Mandatory session startup procedures and quick reference
- **CLAUDE_Tractatus_Maintenance_Guide.md** - Full governance framework documentation
- **.claude/instruction-history.json** - Persistent instruction database (50 active rules)
- **PRE_APPROVED_COMMANDS.md** - Pre-approved bash command patterns
**Key Implementation Files**:
- `scripts/session-init.js` - MANDATORY startup script (enforces server, initializes framework)
- `src/controllers/audit.controller.js` - Audit analytics API (reads from MongoDB)
- `src/services/ContextPressureMonitor.service.js` - Should log pressure checks
- `src/services/MemoryProxy.service.js` - Handles audit logging to MongoDB
- ✅ Background processes killed: 4
- ✅ Temporary files cleaned: 0
- ✅ Instructions synced to database
- ✅ Sync verification complete
---
## Session Metrics
## Next Session
**Token Usage**: ~132,000 / 200,000 (66%)
**Commits**: 5 commits pushed
**Files Modified**: 44 files total
**Bugs Fixed**: 2 critical (newsletter DELETE, audit data source)
**Bugs Discovered**: 1 critical (framework not logging)
**Startup Sequence**:
1. Run `node scripts/session-init.js` (MANDATORY)
2. Review this closedown document
3. Consider deploying changes if ready
**Priorities**:
- Review framework performance
- Fix missing framework service logging
- Continue development work
---
**Session Closed**: 2025-10-24
**Handoff Status**: Ready for next Claude
**Local Server**: MUST CHECK FIRST THING ⚠️
## 📊 Dashboard
View framework analytics:
- **Audit Dashboard**: http://localhost:9000/admin/audit-analytics.html
- **Calendar**: http://localhost:9000/admin/calendar.html
---
**Session closed**: 2025-10-24T10:43:05.868Z
**Next action**: Run session-init.js at start of new session

View file

@ -5,9 +5,9 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>About | Tractatus AI Safety Framework</title>
<meta name="description" content="Learn about the Tractatus Framework: our mission, values, team, and commitment to preserving human agency through structural AI safety.">
<link rel="stylesheet" href="/css/fonts.css?v=0.1.0.1761283486841">
<link rel="stylesheet" href="/css/tailwind.css?v=0.1.0.1761283486841">
<link rel="stylesheet" href="/css/tractatus-theme.min.css?v=0.1.0.1761283486841">
<link rel="stylesheet" href="/css/fonts.css?v=0.1.0.1761335263643">
<link rel="stylesheet" href="/css/tailwind.css?v=0.1.0.1761335263643">
<link rel="stylesheet" href="/css/tractatus-theme.min.css?v=0.1.0.1761335263643">
<style>
/* Accessibility: Skip link */
.skip-link { position: absolute; left: -9999px; top: 0; }
@ -28,7 +28,7 @@
<a href="#main-content" class="skip-link">Skip to main content</a>
<!-- Navigation (injected by navbar.js) -->
<script src="/js/components/navbar.js?v=0.1.0.1761283486841"></script>
<script src="/js/components/navbar.js?v=0.1.0.1761335263643"></script>
<!-- Breadcrumb Navigation -->
<nav class="bg-gray-50 border-b border-gray-200 py-3" aria-label="Breadcrumb">
@ -310,17 +310,17 @@
<!-- Footer with Te Tiriti Acknowledgment -->
<!-- Footer -->
<!-- Internationalization -->
<script src="/js/i18n-simple.js?v=0.1.0.1761283486841"></script>
<script src="/js/components/language-selector.js?v=0.1.0.1761283486841"></script>
<script src="/js/i18n-simple.js?v=0.1.0.1761335263643"></script>
<script src="/js/components/language-selector.js?v=0.1.0.1761335263643"></script>
<!-- Scroll Animations (Phase 3) -->
<script src="/js/scroll-animations.js?v=0.1.0.1761283486841"></script>
<script src="/js/scroll-animations.js?v=0.1.0.1761335263643"></script>
<!-- Page Transitions (Phase 3) -->
<script src="/js/page-transitions.js?v=0.1.0.1761283486841"></script>
<script src="/js/page-transitions.js?v=0.1.0.1761335263643"></script>
<!-- Footer Component -->
<script src="/js/components/footer.js?v=0.1.0.1761283486841"></script>
<script src="/js/components/footer.js?v=0.1.0.1761335263643"></script>
</body>
</html>

View file

@ -136,14 +136,22 @@
</div>
</div>
<!-- Decisions Over Time -->
<!-- Decisions by Service -->
<div class="bg-white rounded-lg shadow-sm border border-gray-200 p-6">
<h3 class="text-lg font-semibold text-gray-900 mb-4">Decisions by Framework Service</h3>
<div id="service-chart" class="chart-container">
<!-- Chart will be rendered here -->
</div>
</div>
</div>
<!-- Timeline Chart -->
<div class="bg-white rounded-lg shadow-sm border border-gray-200 p-6 mb-8">
<h3 class="text-lg font-semibold text-gray-900 mb-4">Decisions Over Time</h3>
<div id="timeline-chart" class="chart-container">
<!-- Chart will be rendered here -->
</div>
</div>
</div>
<!-- Recent Decisions -->
<div class="bg-white rounded-lg shadow-sm border border-gray-200">

View file

@ -5,8 +5,8 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>API Reference | Tractatus Framework</title>
<meta name="description" content="Complete API reference for Tractatus Framework - endpoints, authentication, request/response formats, and examples.">
<link rel="stylesheet" href="/css/tailwind.css?v=0.1.0.1761283486841">
<link rel="stylesheet" href="/css/tractatus-theme.min.css?v=0.1.0.1761283486841">
<link rel="stylesheet" href="/css/tailwind.css?v=0.1.0.1761335263643">
<link rel="stylesheet" href="/css/tractatus-theme.min.css?v=0.1.0.1761335263643">
<style>
.endpoint-badge {
@apply inline-block px-2 py-1 rounded text-xs font-mono font-semibold;
@ -869,7 +869,7 @@
<!-- Footer -->
<!-- Footer Component -->
<script src="/js/components/footer.js?v=0.1.0.1761283486841"></script>
<script src="/js/components/footer.js?v=0.1.0.1761335263643"></script>
</body>
</html>

View file

@ -31,8 +31,8 @@
<!-- RSS Feed -->
<link rel="alternate" type="application/rss+xml" title="Tractatus Blog RSS Feed" href="/api/blog/rss">
<link rel="stylesheet" href="/css/tailwind.css?v=0.1.0.1761283486841">
<link rel="stylesheet" href="/css/tractatus-theme.min.css?v=0.1.0.1761283486841">
<link rel="stylesheet" href="/css/tailwind.css?v=0.1.0.1761335263643">
<link rel="stylesheet" href="/css/tractatus-theme.min.css?v=0.1.0.1761335263643">
<style>
/* Accessibility: Skip link */
.skip-link { position: absolute; left: -9999px; top: 0; }
@ -118,7 +118,7 @@
<a href="#main-content" class="skip-link">Skip to main content</a>
<!-- Navigation (injected by navbar.js) -->
<script src="/js/components/navbar.js?v=0.1.0.1761283486841"></script>
<script src="/js/components/navbar.js?v=0.1.0.1761335263643"></script>
<!-- Breadcrumb -->
<div class="bg-white border-b border-gray-200">
@ -226,10 +226,10 @@
<!-- Footer -->
<!-- Load Blog Post JavaScript -->
<script src="/js/blog-post.js?v=0.1.0.1761283486841"></script>
<script src="/js/blog-post.js?v=0.1.0.1761335263643"></script>
<!-- Footer Component -->
<script src="/js/components/footer.js?v=0.1.0.1761283486841"></script>
<script src="/js/components/footer.js?v=0.1.0.1761335263643"></script>
</body>
</html>

View file

@ -28,8 +28,8 @@
<!-- RSS Feed -->
<link rel="alternate" type="application/rss+xml" title="Tractatus Blog RSS Feed" href="/api/blog/rss">
<link rel="stylesheet" href="/css/tailwind.css?v=0.1.0.1761283486841">
<link rel="stylesheet" href="/css/tractatus-theme.min.css?v=0.1.0.1761283486841">
<link rel="stylesheet" href="/css/tailwind.css?v=0.1.0.1761335263643">
<link rel="stylesheet" href="/css/tractatus-theme.min.css?v=0.1.0.1761335263643">
<style>
/* Accessibility: Skip link */
.skip-link { position: absolute; left: -9999px; top: 0; }
@ -50,7 +50,7 @@
<a href="#main-content" class="skip-link">Skip to main content</a>
<!-- Navigation (injected by navbar.js) -->
<script src="/js/components/navbar.js?v=0.1.0.1761283486841"></script>
<script src="/js/components/navbar.js?v=0.1.0.1761335263643"></script>
<!-- Hero Section -->
<div class="bg-gradient-to-br from-indigo-50 to-blue-50 py-20">
@ -260,14 +260,14 @@
<!-- Footer -->
<!-- Internationalization (must load first for footer translations) -->
<script src="/js/i18n-simple.js?v=0.1.0.1761283486841"></script>
<script src="/js/components/language-selector.js?v=0.1.0.1761283486841"></script>
<script src="/js/i18n-simple.js?v=0.1.0.1761335263643"></script>
<script src="/js/components/language-selector.js?v=0.1.0.1761335263643"></script>
<!-- Load Blog JavaScript -->
<script src="/js/blog.js?v=0.1.0.1761283486841"></script>
<script src="/js/blog.js?v=0.1.0.1761335263643"></script>
<!-- Footer Component -->
<script src="/js/components/footer.js?v=0.1.0.1761283486841"></script>
<script src="/js/components/footer.js?v=0.1.0.1761335263643"></script>
</body>
</html>

View file

@ -4,9 +4,9 @@
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Submit Case Study | Tractatus AI Safety</title>
<link rel="stylesheet" href="/css/fonts.css?v=0.1.0.1761283486841">
<link rel="stylesheet" href="/css/tailwind.css?v=0.1.0.1761283486841">
<link rel="stylesheet" href="/css/tractatus-theme.min.css?v=0.1.0.1761283486841">
<link rel="stylesheet" href="/css/fonts.css?v=0.1.0.1761335263643">
<link rel="stylesheet" href="/css/tailwind.css?v=0.1.0.1761335263643">
<link rel="stylesheet" href="/css/tractatus-theme.min.css?v=0.1.0.1761335263643">
<style>
/* Accessibility: Skip link */
.skip-link { position: absolute; left: -9999px; top: 0; }
@ -78,7 +78,7 @@
<a href="#main-content" class="skip-link">Skip to main content</a>
<!-- Navigation (injected by navbar.js) -->
<script src="/js/components/navbar.js?v=0.1.0.1761283486841"></script>
<script src="/js/components/navbar.js?v=0.1.0.1761335263643"></script>
<!-- Main Content -->
<main id="main-content" class="max-w-4xl mx-auto px-4 sm:px-6 lg:px-8 py-12">
@ -217,10 +217,10 @@
</main>
<!-- Footer -->
<script src="/js/case-submission.js?v=0.1.0.1761283486841"></script>
<script src="/js/case-submission.js?v=0.1.0.1761335263643"></script>
<!-- Footer Component -->
<script src="/js/components/footer.js?v=0.1.0.1761283486841"></script>
<script src="/js/components/footer.js?v=0.1.0.1761335263643"></script>
</body>
</html>

View file

@ -40,6 +40,6 @@
</ol>
</div>
<script src="/js/check-version.js?v=0.1.0.1761283486841"></script>
<script src="/js/check-version.js?v=0.1.0.1761335263643"></script>
</body>
</html>

View file

@ -4,8 +4,8 @@
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documentation - Tractatus Framework</title>
<link rel="stylesheet" href="/css/tailwind.css?v=0.1.0.1761283486841">
<link rel="stylesheet" href="/css/tractatus-theme.min.css?v=0.1.0.1761283486841">
<link rel="stylesheet" href="/css/tailwind.css?v=0.1.0.1761335263643">
<link rel="stylesheet" href="/css/tractatus-theme.min.css?v=0.1.0.1761335263643">
<style>
/* Prose styling for document content */
.prose h1 { @apply text-3xl font-bold mt-8 mb-4 text-gray-900; }
@ -66,12 +66,12 @@
</div>
<!-- Scripts -->
<script src="/js/utils/api.js?v=0.1.0.1761283486841"></script>
<script src="/js/utils/router.js?v=0.1.0.1761283486841"></script>
<script src="/js/components/document-viewer.js?v=0.1.0.1761283486841"></script>
<script src="/js/components/code-copy-button.js?v=0.1.0.1761283486841"></script>
<script src="/js/components/toc.js?v=0.1.0.1761283486841"></script>
<script src="/js/docs-viewer-app.js?v=0.1.0.1761283486841"></script>
<script src="/js/utils/api.js?v=0.1.0.1761335263643"></script>
<script src="/js/utils/router.js?v=0.1.0.1761335263643"></script>
<script src="/js/components/document-viewer.js?v=0.1.0.1761335263643"></script>
<script src="/js/components/code-copy-button.js?v=0.1.0.1761335263643"></script>
<script src="/js/components/toc.js?v=0.1.0.1761335263643"></script>
<script src="/js/docs-viewer-app.js?v=0.1.0.1761335263643"></script>
</body>
</html>

View file

@ -24,9 +24,9 @@
<link rel="preload" href="/fonts/inter-400.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="/fonts/inter-700.woff2" as="font" type="font/woff2" crossorigin>
<link rel="stylesheet" href="/css/fonts.css?v=0.1.0.1761283486841">
<link rel="stylesheet" href="/css/tailwind.css?v=0.1.0.1761283486841">
<link rel="stylesheet" href="/css/tractatus-theme.min.css?v=0.1.0.1761283486841">
<link rel="stylesheet" href="/css/fonts.css?v=0.1.0.1761335263643">
<link rel="stylesheet" href="/css/tailwind.css?v=0.1.0.1761335263643">
<link rel="stylesheet" href="/css/tractatus-theme.min.css?v=0.1.0.1761335263643">
<style>
html { scroll-behavior: smooth; }
@ -485,7 +485,7 @@
<a href="#main-content" class="skip-link">Skip to main content</a>
<!-- Navigation (injected by navbar.js) -->
<script src="/js/components/navbar.js?v=0.1.0.1761283486841" defer></script>
<script src="/js/components/navbar.js?v=0.1.0.1761335263643" defer></script>
<!-- Page Header -->
<div class="bg-white border-b border-gray-200">
@ -866,15 +866,15 @@
</div>
<!-- Version Management & PWA -->
<script src="/js/version-manager.js?v=0.1.0.1761283486841" defer></script>
<script src="/js/version-manager.js?v=0.1.0.1761335263643" defer></script>
<script src="/js/components/document-cards.js?v=0.1.0.1761283486841" defer></script>
<script src="/js/docs-app.js?v=0.1.0.1761283486841" defer></script>
<script src="/js/docs-search-enhanced.js?v=0.1.0.1761283486841" defer></script>
<script src="/js/components/document-cards.js?v=0.1.0.1761335263643" defer></script>
<script src="/js/docs-app.js?v=0.1.0.1761335263643" defer></script>
<script src="/js/docs-search-enhanced.js?v=0.1.0.1761335263643" defer></script>
<!-- Internationalization -->
<script src="/js/i18n-simple.js?v=0.1.0.1761283486841" defer></script>
<script src="/js/components/language-selector.js?v=0.1.0.1761283486841" defer></script>
<script src="/js/i18n-simple.js?v=0.1.0.1761335263643" defer></script>
<script src="/js/components/language-selector.js?v=0.1.0.1761335263643" defer></script>
</body>
</html>

View file

@ -18,21 +18,21 @@
<meta name="apple-mobile-web-app-title" content="Tractatus">
<link rel="apple-touch-icon" href="/images/tractatus-icon-new.svg">
<link rel="stylesheet" href="/css/fonts.css?v=0.1.0.1761283486841">
<link rel="stylesheet" href="/css/tailwind.css?v=0.1.0.1761283486841">
<link rel="stylesheet" href="/css/tractatus-theme.min.css?v=0.1.0.1761283486841">
<link rel="stylesheet" href="/css/fonts.css?v=0.1.0.1761335263643">
<link rel="stylesheet" href="/css/tailwind.css?v=0.1.0.1761335263643">
<link rel="stylesheet" href="/css/tractatus-theme.min.css?v=0.1.0.1761335263643">
<!-- Syntax highlighting for code blocks -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/github-dark.min.css?v=0.1.0.1761283486841">
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js?v=0.1.0.1761283486841"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/bash.min.js?v=0.1.0.1761283486841"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/javascript.min.js?v=0.1.0.1761283486841"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/json.min.js?v=0.1.0.1761283486841"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/yaml.min.js?v=0.1.0.1761283486841"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/python.min.js?v=0.1.0.1761283486841"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/github-dark.min.css?v=0.1.0.1761335263643">
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js?v=0.1.0.1761335263643"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/bash.min.js?v=0.1.0.1761335263643"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/javascript.min.js?v=0.1.0.1761335263643"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/json.min.js?v=0.1.0.1761335263643"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/yaml.min.js?v=0.1.0.1761335263643"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/python.min.js?v=0.1.0.1761335263643"></script>
<!-- Markdown parser -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/marked/11.0.0/marked.min.js?v=0.1.0.1761283486841"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/marked/11.0.0/marked.min.js?v=0.1.0.1761335263643"></script>
<style>
/* Accessibility: Skip link */
@ -325,7 +325,7 @@
<a href="#main-content" class="skip-link">Skip to main content</a>
<!-- Navigation -->
<script src="/js/components/navbar.js?v=0.1.0.1761283486841"></script>
<script src="/js/components/navbar.js?v=0.1.0.1761335263643"></script>
<!-- Hero -->
<div class="bg-gradient-to-br from-blue-50 to-indigo-50 py-16">
@ -630,16 +630,16 @@
</div>
<!-- Internationalization -->
<script src="/js/i18n-simple.js?v=0.1.0.1761283486841"></script>
<script src="/js/components/language-selector.js?v=0.1.0.1761283486841"></script>
<script src="/js/i18n-simple.js?v=0.1.0.1761335263643"></script>
<script src="/js/components/language-selector.js?v=0.1.0.1761335263643"></script>
<!-- Version Management & PWA -->
<script src="/js/version-manager.js?v=0.1.0.1761283486841"></script>
<script src="/js/version-manager.js?v=0.1.0.1761335263643"></script>
<script src="/js/faq.js?v=0.1.0.1761283486841"></script>
<script src="/js/faq.js?v=0.1.0.1761335263643"></script>
<!-- Footer Component -->
<script src="/js/components/footer.js?v=0.1.0.1761283486841"></script>
<script src="/js/components/footer.js?v=0.1.0.1761335263643"></script>
</body>
</html>

View file

@ -9,9 +9,9 @@
<link rel="manifest" href="/manifest.json">
<meta name="theme-color" content="#3b82f6">
<link rel="icon" type="image/svg+xml" href="/favicon-new.svg">
<link rel="stylesheet" href="/css/fonts.css?v=0.1.0.1761283486841">
<link rel="stylesheet" href="/css/tailwind.css?v=0.1.0.1761283486841">
<link rel="stylesheet" href="/css/tractatus-theme.min.css?v=0.1.0.1761283486841">
<link rel="stylesheet" href="/css/fonts.css?v=0.1.0.1761335263643">
<link rel="stylesheet" href="/css/tailwind.css?v=0.1.0.1761335263643">
<link rel="stylesheet" href="/css/tractatus-theme.min.css?v=0.1.0.1761335263643">
<style>
.skip-link { position: absolute; left: -9999px; top: 0; }
.skip-link:focus { left: 0; z-index: 100; background: white; padding: 1rem; border: 2px solid #3b82f6; }
@ -45,7 +45,7 @@
<body class="bg-gray-50">
<a href="#main-content" class="skip-link">Skip to main content</a>
<script src="/js/components/navbar.js?v=0.1.0.1761283486841"></script>
<script src="/js/components/navbar.js?v=0.1.0.1761335263643"></script>
<!-- Breadcrumb -->
<nav class="bg-gray-50 border-b border-gray-200 py-3" aria-label="Breadcrumb">
@ -638,12 +638,12 @@ npm start</code></pre>
</main>
<!-- Footer -->
<script src="/js/i18n-simple.js?v=0.1.0.1761283486841"></script>
<script src="/js/components/language-selector.js?v=0.1.0.1761283486841"></script>
<script src="/js/scroll-animations.js?v=0.1.0.1761283486841"></script>
<script src="/js/page-transitions.js?v=0.1.0.1761283486841"></script>
<script src="/js/version-manager.js?v=0.1.0.1761283486841"></script>
<script src="/js/components/footer.js?v=0.1.0.1761283486841"></script>
<script src="/js/i18n-simple.js?v=0.1.0.1761335263643"></script>
<script src="/js/components/language-selector.js?v=0.1.0.1761335263643"></script>
<script src="/js/scroll-animations.js?v=0.1.0.1761335263643"></script>
<script src="/js/page-transitions.js?v=0.1.0.1761335263643"></script>
<script src="/js/version-manager.js?v=0.1.0.1761335263643"></script>
<script src="/js/components/footer.js?v=0.1.0.1761335263643"></script>
</body>
</html>

View file

@ -20,10 +20,10 @@
<link rel="icon" type="image/svg+xml" href="/favicon-new.svg">
<!-- Fonts -->
<link rel="stylesheet" href="/css/fonts.css?v=0.1.0.1761283486841">
<link rel="stylesheet" href="/css/fonts.css?v=0.1.0.1761335263643">
<link rel="stylesheet" href="/css/tailwind.css?v=0.1.0.1761283486841">
<link rel="stylesheet" href="/css/tractatus-theme.min.css?v=0.1.0.1761283486841">
<link rel="stylesheet" href="/css/tailwind.css?v=0.1.0.1761335263643">
<link rel="stylesheet" href="/css/tractatus-theme.min.css?v=0.1.0.1761335263643">
<style>
.gradient-text { background: linear-gradient(120deg, #3b82f6 0%, #8b5cf6 100%); -webkit-background-clip: text; -webkit-text-fill-color: transparent; }
.hover-lift { transition: transform 0.2s; }
@ -47,7 +47,7 @@
<!-- Navigation (injected by navbar.js) -->
<div id="navbar-placeholder" class="min-h-16"></div>
<script src="/js/components/navbar.js?v=0.1.0.1761283486841"></script>
<script src="/js/components/navbar.js?v=0.1.0.1761335263643"></script>
<!-- Hero Section -->
<header role="banner">
@ -407,21 +407,21 @@ Additional case studies and research findings documented in technical papers
<!-- Footer -->
<!-- Version Management & PWA -->
<script src="/js/version-manager.js?v=0.1.0.1761283486841"></script>
<script src="/js/version-manager.js?v=0.1.0.1761335263643"></script>
<!-- Internationalization -->
<script src="/js/i18n-simple.js?v=0.1.0.1761283486841"></script>
<script src="/js/components/language-selector.js?v=0.1.0.1761283486841"></script>
<script src="/js/i18n-simple.js?v=0.1.0.1761335263643"></script>
<script src="/js/components/language-selector.js?v=0.1.0.1761335263643"></script>
<!-- Scroll Animations (Phase 3) -->
<script src="/js/scroll-animations.js?v=0.1.0.1761283486841"></script>
<script src="/js/scroll-animations.js?v=0.1.0.1761335263643"></script>
<!-- Page Transitions (Phase 3) -->
<script src="/js/page-transitions.js?v=0.1.0.1761283486841"></script>
<script src="/js/page-transitions.js?v=0.1.0.1761335263643"></script>
<!-- Footer Component -->
<script src="/js/components/footer.js?v=0.1.0.1761283486841"></script>
<script src="/js/components/footer.js?v=0.1.0.1761335263643"></script>
</body>
</html>

View file

@ -22,8 +22,11 @@ function checkAuth() {
// Load audit data from API
async function loadAuditData() {
console.log('[Audit Analytics] Loading audit data...');
try {
const token = getAuthToken();
console.log('[Audit Analytics] Token:', token ? 'Present' : 'Missing');
const response = await fetch('/api/admin/audit-logs?days=30', {
headers: {
'Authorization': `Bearer ${token}`,
@ -31,7 +34,10 @@ async function loadAuditData() {
}
});
console.log('[Audit Analytics] Response status:', response.status);
if (response.status === 401) {
console.log('[Audit Analytics] Unauthorized - redirecting to login');
localStorage.removeItem('admin_token');
localStorage.removeItem('admin_user');
window.location.href = '/admin/login.html';
@ -39,15 +45,18 @@ async function loadAuditData() {
}
const data = await response.json();
console.log('[Audit Analytics] Data received:', data);
if (data.success) {
auditData = data.decisions || [];
console.log('[Audit Analytics] Audit data loaded:', auditData.length, 'decisions');
renderDashboard();
} else {
console.error('[Audit Analytics] API returned error:', data.error);
showError('Failed to load audit data: ' + (data.error || 'Unknown error'));
}
} catch (error) {
console.error('Error loading audit data:', error);
console.error('[Audit Analytics] Error loading audit data:', error);
showError('Error loading audit data. Please check console for details.');
}
}
@ -56,6 +65,7 @@ async function loadAuditData() {
function renderDashboard() {
updateSummaryCards();
renderActionChart();
renderServiceChart();
renderTimelineChart();
renderAuditTable();
}
@ -65,14 +75,14 @@ function updateSummaryCards() {
const totalDecisions = auditData.length;
const allowedCount = auditData.filter(d => d.allowed).length;
const violationsCount = auditData.filter(d => d.violations && d.violations.length > 0).length;
const servicesSet = new Set(auditData.map(d => d.action));
const servicesSet = new Set(auditData.map(d => d.service).filter(s => s && s !== 'unknown'));
document.getElementById('total-decisions').textContent = totalDecisions;
document.getElementById('allowed-rate').textContent = totalDecisions > 0
? `${((allowedCount / totalDecisions) * 100).toFixed(1)}%`
: '0%';
document.getElementById('violations-count').textContent = violationsCount;
document.getElementById('services-count').textContent = servicesSet.size;
document.getElementById('services-count').textContent = servicesSet.size || 0;
}
// Render action type chart
@ -117,6 +127,62 @@ function renderActionChart() {
chartEl.innerHTML = html; setProgressBarWidths(chartEl);
}
// Render service chart
function renderServiceChart() {
const serviceCounts = {};
auditData.forEach(decision => {
const service = decision.service || 'unknown';
serviceCounts[service] = (serviceCounts[service] || 0) + 1;
});
const chartEl = document.getElementById('service-chart');
if (Object.keys(serviceCounts).length === 0) {
chartEl.innerHTML = '<p class="text-gray-500 text-center py-12">No data available</p>';
return;
}
const sorted = Object.entries(serviceCounts)
.sort((a, b) => b[1] - a[1]);
const maxCount = Math.max(...sorted.map(([, count]) => count));
// Color palette for services
const colors = [
'bg-blue-600',
'bg-green-600',
'bg-purple-600',
'bg-orange-600',
'bg-pink-600',
'bg-indigo-600',
'bg-red-600',
'bg-yellow-600'
];
const html = sorted.map(([service, count], index) => {
const percentage = (count / maxCount) * 100;
// Ensure minimum 8% width so all bars are visible
const displayPercentage = Math.max(percentage, 8);
const color = colors[index % colors.length];
const label = service === 'unknown' ? 'Unknown' : service;
return `
<div class="mb-4">
<div class="flex items-center justify-between mb-1">
<span class="text-sm font-medium text-gray-700">${label}</span>
<span class="text-sm text-gray-600">${count}</span>
</div>
<div class="w-full bg-gray-200 rounded-full h-2">
<div class="${color} h-2 rounded-full transition-all duration-300" data-width="${displayPercentage}"></div>
</div>
</div>
`;
}).join('');
chartEl.innerHTML = html; setProgressBarWidths(chartEl);
}
// Render timeline chart
function renderTimelineChart() {
const chartEl = document.getElementById('timeline-chart');
@ -227,9 +293,13 @@ function init() {
// Setup refresh button
const refreshBtn = document.getElementById('refresh-btn');
if (refreshBtn) {
console.log('[Audit Analytics] Refresh button found, attaching event listener');
refreshBtn.addEventListener('click', () => {
console.log('[Audit Analytics] Refresh button clicked, loading data...');
loadAuditData();
});
} else {
console.error('[Audit Analytics] Refresh button not found!');
}
// Load initial data

View file

@ -5,8 +5,8 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Koha — Reciprocal Support | Tractatus AI Safety</title>
<meta name="description" content="Join a relationship of mutual support for AI safety. Koha is reciprocal giving that maintains community bonds — your contribution sustains this work; our work serves you and the commons.">
<link rel="stylesheet" href="/css/tailwind.css?v=0.1.0.1761283486841">
<link rel="stylesheet" href="/css/tractatus-theme.min.css?v=0.1.0.1761283486841">
<link rel="stylesheet" href="/css/tailwind.css?v=0.1.0.1761335263643">
<link rel="stylesheet" href="/css/tractatus-theme.min.css?v=0.1.0.1761335263643">
<style>
.gradient-text { background: linear-gradient(120deg, #3b82f6 0%, #8b5cf6 100%); -webkit-background-clip: text; -webkit-text-fill-color: transparent; }
.skip-link { position: absolute; left: -9999px; }
@ -51,7 +51,7 @@
<a href="#main-content" class="skip-link">Skip to main content</a>
<!-- Navigation (injected by navbar.js) -->
<script src="/js/components/navbar.js?v=0.1.0.1761283486841"></script>
<script src="/js/components/navbar.js?v=0.1.0.1761335263643"></script>
<!-- Main Content -->
<main id="main-content" class="max-w-5xl mx-auto px-4 sm:px-6 lg:px-8 py-12">
@ -380,17 +380,17 @@
</main>
<!-- Footer -->
<script src="/js/components/footer.js?v=0.1.0.1761283486841"></script>
<script src="/js/components/footer.js?v=0.1.0.1761335263643"></script>
<!-- Currency utilities and selector -->
<script src="/js/utils/currency.js?v=0.1.0.1761283486841"></script>
<script src="/js/components/currency-selector.js?v=0.1.0.1761283486841"></script>
<script src="/js/utils/currency.js?v=0.1.0.1761335263643"></script>
<script src="/js/components/currency-selector.js?v=0.1.0.1761335263643"></script>
<!-- Donation form functionality -->
<script src="/js/koha-donation.js?v=0.1.0.1761283486841"></script>
<script src="/js/koha-donation.js?v=0.1.0.1761335263643"></script>
<!-- Internationalization -->
<script src="/js/i18n-simple.js?v=0.1.0.1761283486841"></script>
<script src="/js/components/language-selector.js?v=0.1.0.1761283486841"></script>
<script src="/js/i18n-simple.js?v=0.1.0.1761335263643"></script>
<script src="/js/components/language-selector.js?v=0.1.0.1761335263643"></script>
</body>
</html>

View file

@ -17,9 +17,9 @@
<link rel="apple-touch-icon" href="/images/tractatus-icon-new.svg">
<link rel="icon" type="image/svg+xml" href="/favicon-new.svg">
<link rel="stylesheet" href="/css/fonts.css?v=0.1.0.1761283486841">
<link rel="stylesheet" href="/css/tailwind.css?v=0.1.0.1761283486841">
<link rel="stylesheet" href="/css/tractatus-theme.min.css?v=0.1.0.1761283486841">
<link rel="stylesheet" href="/css/fonts.css?v=0.1.0.1761335263643">
<link rel="stylesheet" href="/css/tailwind.css?v=0.1.0.1761335263643">
<link rel="stylesheet" href="/css/tractatus-theme.min.css?v=0.1.0.1761335263643">
<style>
.hover-lift { transition: all 0.3s ease; }
.hover-lift:hover { transform: translateY(-2px); }
@ -63,7 +63,7 @@
<a href="#main-content" class="skip-link">Skip to main content</a>
<script src="/js/components/navbar.js?v=0.1.0.1761283486841"></script>
<script src="/js/components/navbar.js?v=0.1.0.1761335263643"></script>
<!-- Breadcrumb Navigation -->
<nav class="bg-gray-50 border-b border-gray-200 py-3" aria-label="Breadcrumb">
@ -605,20 +605,20 @@
<!-- Footer -->
<!-- Internationalization (must load first for footer translations) -->
<script src="/js/i18n-simple.js?v=0.1.0.1761283486841"></script>
<script src="/js/components/language-selector.js?v=0.1.0.1761283486841"></script>
<script src="/js/i18n-simple.js?v=0.1.0.1761335263643"></script>
<script src="/js/components/language-selector.js?v=0.1.0.1761335263643"></script>
<!-- Scroll Animations (Phase 3) -->
<script src="/js/scroll-animations.js?v=0.1.0.1761283486841"></script>
<script src="/js/scroll-animations.js?v=0.1.0.1761335263643"></script>
<!-- Page Transitions (Phase 3) -->
<script src="/js/page-transitions.js?v=0.1.0.1761283486841"></script>
<script src="/js/page-transitions.js?v=0.1.0.1761335263643"></script>
<!-- Version Management & PWA -->
<script src="/js/version-manager.js?v=0.1.0.1761283486841"></script>
<script src="/js/leader-page.js?v=0.1.0.1761283486841"></script>
<script src="/js/version-manager.js?v=0.1.0.1761335263643"></script>
<script src="/js/leader-page.js?v=0.1.0.1761335263643"></script>
<!-- Footer Component -->
<script src="/js/components/footer.js?v=0.1.0.1761283486841"></script>
<script src="/js/components/footer.js?v=0.1.0.1761335263643"></script>
</body>
</html>

View file

@ -4,9 +4,9 @@
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Media Inquiry | Tractatus AI Safety</title>
<link rel="stylesheet" href="/css/fonts.css?v=0.1.0.1761283486841">
<link rel="stylesheet" href="/css/tailwind.css?v=0.1.0.1761283486841">
<link rel="stylesheet" href="/css/tractatus-theme.min.css?v=0.1.0.1761283486841">
<link rel="stylesheet" href="/css/fonts.css?v=0.1.0.1761335263643">
<link rel="stylesheet" href="/css/tailwind.css?v=0.1.0.1761335263643">
<link rel="stylesheet" href="/css/tractatus-theme.min.css?v=0.1.0.1761335263643">
<style>
.form-group { margin-bottom: 1.5rem; }
.form-label {
@ -68,7 +68,7 @@
<a href="#main-content" class="skip-link">Skip to main content</a>
<!-- Navigation (injected by navbar.js) -->
<script src="/js/components/navbar.js?v=0.1.0.1761283486841"></script>
<script src="/js/components/navbar.js?v=0.1.0.1761335263643"></script>
<!-- Main Content -->
<main id="main-content" class="max-w-3xl mx-auto px-4 sm:px-6 lg:px-8 py-12">
@ -171,10 +171,10 @@
</main>
<!-- Footer -->
<script src="/js/media-inquiry.js?v=0.1.0.1761283486841"></script>
<script src="/js/media-inquiry.js?v=0.1.0.1761335263643"></script>
<!-- Footer Component -->
<script src="/js/components/footer.js?v=0.1.0.1761283486841"></script>
<script src="/js/components/footer.js?v=0.1.0.1761335263643"></script>
</body>
</html>

View file

@ -5,8 +5,8 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title data-i18n="meta.title">Privacy Policy | Tractatus AI Safety Framework</title>
<meta name="description" content="Privacy policy for the Tractatus AI Safety Framework. Learn how we collect, use, and protect your data." data-i18n="meta.description">
<link rel="stylesheet" href="/css/tailwind.css?v=0.1.0.1761283486841">
<link rel="stylesheet" href="/css/tractatus-theme.min.css?v=0.1.0.1761283486841">
<link rel="stylesheet" href="/css/tailwind.css?v=0.1.0.1761335263643">
<link rel="stylesheet" href="/css/tractatus-theme.min.css?v=0.1.0.1761335263643">
<style>
.skip-link { position: absolute; left: -9999px; }
.skip-link:focus { left: 0; z-index: 100; background: white; padding: 1rem; }
@ -26,11 +26,11 @@
<a href="#main-content" class="skip-link">Skip to main content</a>
<!-- Navigation (injected by navbar.js) -->
<script src="/js/components/navbar.js?v=0.1.0.1761283486841"></script>
<script src="/js/components/navbar.js?v=0.1.0.1761335263643"></script>
<!-- i18n Support -->
<script src="/js/i18n-simple.js?v=0.1.0.1761283486841"></script>
<script src="/js/components/language-selector.js?v=0.1.0.1761283486841"></script>
<script src="/js/i18n-simple.js?v=0.1.0.1761335263643"></script>
<script src="/js/components/language-selector.js?v=0.1.0.1761335263643"></script>
<!-- Main Content -->
<main id="main-content" class="max-w-4xl mx-auto px-4 sm:px-6 lg:px-8 py-12">
@ -246,7 +246,7 @@
</main>
<!-- Footer -->
<script src="/js/components/footer.js?v=0.1.0.1761283486841"></script>
<script src="/js/components/footer.js?v=0.1.0.1761335263643"></script>
</body>
</html>

View file

@ -17,9 +17,9 @@
<link rel="apple-touch-icon" href="/images/tractatus-icon-new.svg">
<link rel="icon" type="image/svg+xml" href="/favicon-new.svg">
<link rel="stylesheet" href="/css/fonts.css?v=0.1.0.1761283486841">
<link rel="stylesheet" href="/css/tailwind.css?v=0.1.0.1761283486841">
<link rel="stylesheet" href="/css/tractatus-theme.min.css?v=0.1.0.1761283486841">
<link rel="stylesheet" href="/css/fonts.css?v=0.1.0.1761335263643">
<link rel="stylesheet" href="/css/tailwind.css?v=0.1.0.1761335263643">
<link rel="stylesheet" href="/css/tractatus-theme.min.css?v=0.1.0.1761335263643">
<style>
.skip-link { position: absolute; left: -9999px; }
.skip-link:focus { left: 0; z-index: 100; background: white; padding: 1rem; }
@ -69,7 +69,7 @@
</div>
</noscript>
<script src="/js/components/navbar.js?v=0.1.0.1761283486841"></script>
<script src="/js/components/navbar.js?v=0.1.0.1761335263643"></script>
<!-- Breadcrumb Navigation -->
<nav class="bg-gray-50 border-b border-gray-200 py-3" aria-label="Breadcrumb">
@ -611,20 +611,20 @@
<!-- Footer -->
<!-- Internationalization (must load first for footer translations) -->
<script src="/js/i18n-simple.js?v=0.1.0.1761283486841"></script>
<script src="/js/components/language-selector.js?v=0.1.0.1761283486841"></script>
<script src="/js/i18n-simple.js?v=0.1.0.1761335263643"></script>
<script src="/js/components/language-selector.js?v=0.1.0.1761335263643"></script>
<!-- Scroll Animations (Phase 3) -->
<script src="/js/scroll-animations.js?v=0.1.0.1761283486841"></script>
<script src="/js/scroll-animations.js?v=0.1.0.1761335263643"></script>
<!-- Page Transitions (Phase 3) -->
<script src="/js/page-transitions.js?v=0.1.0.1761283486841"></script>
<script src="/js/page-transitions.js?v=0.1.0.1761335263643"></script>
<!-- Version Management & PWA -->
<script src="/js/version-manager.js?v=0.1.0.1761283486841"></script>
<script src="/js/researcher-page.js?v=0.1.0.1761283486841"></script>
<script src="/js/version-manager.js?v=0.1.0.1761335263643"></script>
<script src="/js/researcher-page.js?v=0.1.0.1761335263643"></script>
<!-- Footer Component -->
<script src="/js/components/footer.js?v=0.1.0.1761283486841"></script>
<script src="/js/components/footer.js?v=0.1.0.1761335263643"></script>
</body>
</html>

View file

@ -5,7 +5,7 @@
* - PWA functionality
*/
const CACHE_VERSION = '0.1.2';
const CACHE_VERSION = '0.1.1';
const CACHE_NAME = `tractatus-v${CACHE_VERSION}`;
const VERSION_CHECK_INTERVAL = 3600000; // 1 hour in milliseconds

View file

@ -1,6 +1,6 @@
{
"version": "0.1.1",
"buildDate": "2025-10-24T05:24:46.847Z",
"buildDate": "2025-10-24T19:47:43.649Z",
"changelog": [
"Mobile: Fixed calendar page loading issues with enhanced error handling",
"Cache: Service worker v0.1.2 - FORCE REFRESH for mobile cache fix",

View file

@ -21,7 +21,9 @@ async function authenticateToken(req, res, next) {
});
}
// Verify token
// Verify JWT token signature and expiration
// The verifyToken function validates the token's cryptographic signature using the
// secret key, checks that it hasn't expired, and decodes the payload containing userId
const decoded = verifyToken(token);
// Get user from database