Commit graph

426 commits

Author SHA1 Message Date
TheFlow
9d658d877c chore(cache): bump cache version for newsletter DELETE fix
Updated cache-busting version to force browser reload of fixed JavaScript.

Root cause: Browser serving cached version of newsletter-management.js
with old arrow function bug, even though production file had the fix.

Changes:
- Bumped version to 0.1.0.1761283486841 across all HTML files
- Updated public/admin/newsletter-management.html (missed by auto-script)
- Updated version.json and service worker

Related fix: Newsletter DELETE button sending [object Object]
Fixed in commit 0b853c5 but cached version prevented fix from loading.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-24 18:25:26 +13:00
TheFlow
f347d0a34e fix(architecture): interactive diagram SVG click handler timing issues
Fixed non-responsive service node clicks on architecture.html interactive diagram.

Root cause: SVG loaded via <object> tag had contentDocument timing issues -
event listeners attached before SVG fully accessible.

Solution:
- Added retry mechanism for contentDocument access (100ms intervals)
- Implemented multiple loading strategies (immediate, load event, timeout)
- Enabled event capturing phase (addEventListener 3rd param: true)
- Enhanced logging for debugging click event flow
- Auto-display overview panel on initialization
- CSP-compliant cursor styling via JavaScript

Deployed to production: https://agenticgovernance.digital/architecture.html

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-24 18:22:15 +13:00
TheFlow
0b853c537d feat(crm): complete Phase 3 multi-project CRM + critical bug fixes
Phase 3 Multi-Project CRM Implementation:
- Add UnifiedContact model for cross-project contact linking
- Add Organization model with domain-based auto-detection
- Add ActivityTimeline model for comprehensive interaction tracking
- Add SLATracking model for 24-hour response commitment
- Add ResponseTemplate model with variable substitution
- Add CRM controller with 8 API endpoints
- Add Inbox controller for unified communications
- Add CRM dashboard frontend with tabs (Contacts, Orgs, SLA, Templates)
- Add Contact Management interface (Phase 1)
- Add Unified Inbox interface (Phase 2)
- Integrate CRM routes into main API

Critical Bug Fixes:
- Fix newsletter DELETE button (event handler context issue)
- Fix case submission invisible button (invalid CSS class)
- Fix Chart.js CSP violation (add cdn.jsdelivr.net to policy)
- Fix Chart.js SRI integrity hash mismatch

Technical Details:
- Email-based contact deduplication across projects
- Automatic organization linking via email domain
- Cross-project activity timeline aggregation
- SLA breach detection and alerting system
- Template rendering with {placeholder} substitution

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-24 18:10:14 +13:00
TheFlow
efab76e13c feat(crm): implement unified contact form system
Complete CRM foundation with contact modal in footer

Backend:
- Contact.model.js: Full CRUD model with statistics tracking
- contact.controller.js: Submit, list, assign, respond, update, delete
- contact.routes.js: Public submission + admin management endpoints
- routes/index.js: Mount contact routes at /api/contact

Frontend:
- footer.js: Replace mailto link with Contact Us modal button
- Contact modal: Form with type, name, email, org, subject, message
- CSRF protection: Extracts token from cookie (like newsletter)
- Rate limiting: formRateLimiter (5/min)
- Validation: Input sanitization + required fields
- UX: Success/error messages, auto-close on success

Admin UI:
- navbar-admin.js: New 'CRM & Communications' section
- Links: Contact Management, Case Submissions, Media Inquiries

Foundation for multi-project CRM across tractatus, family-history, sydigital

Next: Build /admin/contact-management.html page
2025-10-24 16:56:21 +13:00
TheFlow
70ab7c0a01 feat(admin): reorganize navbar with CRM section and add missing tools
- Add new 'CRM & Communications' section for contact/inquiry management
- Add Editorial Guidelines to Content Management
- Add Credential Vault to System & Framework
- Reorganize for future unified CRM across all projects
2025-10-24 16:51:04 +13:00
TheFlow
c616713429 chore: bump cache version for CSRF fix deployment 2025-10-24 16:44:40 +13:00
TheFlow
061977126a fix(csrf): enable newsletter subscription from mobile
CRITICAL FIX: Newsletter subscription was returning "Forbidden" error
because the CSRF protection was incorrectly configured.

Root cause:
- CSRF cookie was set with httpOnly: true
- JavaScript cannot read httpOnly cookies
- Frontend couldn't extract token to send in X-CSRF-Token header
- Double-submit CSRF pattern requires client to read the cookie

Changes:
- csrf-protection.middleware.js: Set httpOnly: false (required for double-submit pattern)
- blog.js: Extract CSRF token from cookie and include in X-CSRF-Token header

Security Note: This is the correct implementation per OWASP guidelines
for double-submit cookie CSRF protection. The cookie is still protected
by SameSite: strict and domain restrictions.

Fixes: #newsletter-subscription-forbidden-mobile
2025-10-24 16:42:56 +13:00
TheFlow
880d70d088 chore: bump cache version for production deployment 2025-10-24 16:35:41 +13:00
TheFlow
925065ecdc fix(submissions): extract data from API response wrappers
CRITICAL FIX: Economist submission package was showing no data because
the frontend was storing the entire API response wrapper instead of
extracting the actual post and submission data.

Changes:
- submission-modal-enhanced.js: Extract .post from blog API response
- submission-modal-enhanced.js: Extract .data from submissions API response
- publications.routes.js: Restore original routes and add /targets endpoint
- Cache version bumped to force browser updates

Fixes: #economist-submission-data-missing
2025-10-24 16:35:10 +13:00
TheFlow
cdd7109b73 feat(admin): add Editorial Guidelines Manager page
Created comprehensive Editorial Guidelines Manager to display all 22
publication targets with detailed submission requirements:

**New Page:** `/admin/editorial-guidelines.html`
- Display all publication targets in filterable grid
- Filter by tier, type, language, region
- Show submission requirements (word counts, language, exclusivity)
- Display editorial guidelines (tone, focus areas, things to avoid)
- Contact information (email addresses, response times)
- Target audience information

**Backend:**
- Added GET /api/publications/targets endpoint
- Serves publication targets from config file
- Returns 22 publications with all metadata

**Frontend:**
- Stats overview (total, premier, high-value, strategic)
- Publication cards with color-coded tiers
- Detailed requirements and guidelines display
- Responsive grid layout

This provides centralized access to submission guidelines for all
target publications including The Economist, Le Monde, The Guardian,
Financial Times, etc. Previously this data was only in the config
file and not accessible through the admin interface.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-24 13:05:47 +13:00
TheFlow
939e207d00 fix(blog): add missing auth headers to submission modal API calls
Fixed 401 Unauthorized errors in blog validation/submission modal:
- Added Authorization Bearer token to /api/blog/admin/:id fetch (line 153)
- Added Authorization Bearer token to /api/submissions/by-blog-post/:id fetch (line 162)
- Added Authorization Bearer token to /api/submissions/:id/export fetch (line 818)

All admin API endpoints require authentication. The submission modal
was making unauthenticated requests, causing 401 errors when trying
to load article data or export submission packages.

The 404 error on by-blog-post is expected when no submission exists
for that blog post ID yet.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-24 13:00:11 +13:00
TheFlow
9cb3eadfef fix(security): remove deprecated CSP block-all-mixed-content directive
Removed 'block-all-mixed-content' from Content-Security-Policy as it's
deprecated and made obsolete by 'upgrade-insecure-requests' which
already handles mixed content by upgrading it to HTTPS.

This eliminates the Firefox console warning:
"Ignoring 'block-all-mixed-content' because mixed content display
upgrading makes block-all-mixed-content obsolete."

Modern browsers automatically upgrade all mixed content (HTTP resources
on HTTPS pages) when upgrade-insecure-requests is present, providing
the same security without the deprecated directive.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-24 12:44:51 +13:00
TheFlow
733a539ffc fix(css): correct justify-center syntax error in loading overlay
Fixed invalid CSS property 'justify-center;' on line 486 of
tractatus-theme.css. Changed to correct CSS property:
'justify-content: center;'

This was causing Firefox console errors:
"Unknown property 'justify-center;'. Declaration dropped."

The error was in the .loading-overlay class which is used for
loading states across admin pages. The invalid property prevented
proper centering of loading spinners on mobile devices.

Also regenerated minified CSS (39.4% size reduction: 24KB → 15KB).

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-24 12:41:53 +13:00
TheFlow
70a9f55173 fix(cache): standardize cache version across all HTML files
Fixed inconsistent cache version parameters across admin pages.
All HTML files now use v=0.1.0.1761262254119 to ensure mobile
browsers fetch fresh assets.

Changes:
- Updated all 12 admin HTML files to consistent cache version
- Updated all 17 public HTML files via update-cache-version script
- Service worker version: 0.1.1
- Version.json: 0.1.1

This ensures service worker cache invalidation triggers properly
and all pages reference matching asset versions.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-24 12:34:39 +13:00
TheFlow
ff656dd74d fix(cache): increment service worker version to force mobile cache refresh
Updated service worker cache version from 0.1.1 to 0.1.2 to force
mobile browsers to invalidate old cached assets. This ensures users
see the latest calendar.js with enhanced error handling.

Also updated version.json to match with relevant changelog entries
for mobile calendar fixes and DeepL integration.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-24 12:25:40 +13:00
TheFlow
f5f514833b chore: bump cache version to 0.1.0.1761261456822
- Updated all HTML cache parameters
- Fixed calendar.html version tags
- Forces mobile browsers to fetch new calendar.js with error handling
2025-10-24 12:18:34 +13:00
TheFlow
6e288c67a5 fix(calendar): Add cache-busting and better error handling
- Added cache: 'no-store' to prevent cached 500 errors
- Enhanced error messages with status codes
- Display detailed error messages to user
- Log API response text for debugging
- Helps diagnose mobile loading issues
2025-10-24 12:13:21 +13:00
TheFlow
093e6cdbf6 fix(routes): Move editorial-guidelines route before /:slug catch-all
- Fixed route ordering issue where /editorial-guidelines was matching /:slug
- Removed duplicate route definition
- Editorial Guidelines page now loads correctly
- Mobile-ready admin pages confirmed (viewport + Tailwind responsive)
2025-10-24 12:04:17 +13:00
TheFlow
2279ef38de feat(translation): complete DeepL translation workflow
Frontend:
- Add translate button click handler in submission-modal-enhanced.js
- Display loading state during translation ( Translating...)
- Update French textarea with translated content
- Auto-update word counts after translation
- Show success message with DeepL attribution

Backend:
- Add POST /api/submissions/:id/translate endpoint
- Integrate Translation.service (DeepL)
- Save translations to SubmissionTracking.documents
- Mark translations as 'translatedBy: deepl', 'approved: false'
- Return translated text with caching metadata

Complete Translation Flow:
1. User clicks 'Translate EN → FR' button
2. Frontend sends English text to /api/submissions/:id/translate
3. Backend calls DeepL API via Translation.service
4. Translation cached for 24 hours
5. Result saved to submission.documents[docType].versions[]
6. French textarea populated with translation
7. User can review/edit before saving submission

Next: Configure DEEPL_API_KEY in .env to enable translations
2025-10-24 11:22:50 +13:00
TheFlow
d0e1275f58 feat(admin): add multilingual document editor with DeepL translation
- Display English and French versions side-by-side for all documents
- Add 'Translate EN → FR' button using DeepL
- Show word counts for each language version
- Display translation metadata (translatedBy, approved status)
- Mark primary language for each document
- Support readonly mode for blog-linked content

Documents tab now shows:
- Main Article (EN/FR)
- Cover Letter (EN/FR)
- Author Bio (EN/FR)
- Pitch Email (EN/FR)

Next: Add translation button click handler and API endpoint
2025-10-24 11:17:12 +13:00
TheFlow
ce991d86a8 feat(translation): implement DeepL translation service (SOVEREIGN)
**GOVERNANCE RULE**: Tractatus uses DeepL API ONLY for all translations.
NEVER use LibreTranslate or any other translation service.

Changes:
- Created Translation.service.js using proven family-history DeepL implementation
- Added DEEPL_API_KEY to .env configuration
- Installed node-cache dependency for translation caching
- Supports all SubmissionTracking schema languages (en, fr, de, es, pt, zh, ja, ar, mi)
- Default formality: 'more' (formal style for publication submissions)
- 24-hour translation caching to reduce API calls
- Batch translation support (up to 50 texts per request)

Framework Note: Previous attempt to use LibreTranslate was a violation of
explicit user instruction. This has been corrected.

Signed-off-by: Claude <noreply@anthropic.com>
2025-10-24 11:16:33 +13:00
TheFlow
9729878f96 feat(admin): add standalone submission package modal support
- Add data-is-standalone flag to manage-submission buttons
- Create openStandaloneSubmissionModal function for packages without blog posts
- Update renderOverviewTab to handle null article (standalone submissions)
- Display standalone submission notice with purple badge
- Load submission data directly via /api/submissions/{id}
- Differentiate UI labels (Submitted vs Published dates)
- Files modified: blog-validation.js, submission-modal-enhanced.js
2025-10-24 11:06:22 +13:00
TheFlow
c4f370cc6e fix(admin): force fresh API requests to prevent cached 500 errors
- Add cache: 'no-store' to all apiCall functions in admin JS files
- Prevents browser fetch cache from serving stale error responses
- Addresses submissions endpoint 500 errors that weren't appearing in server logs
- Killed duplicate server process (PID 1583625)
- Added debug logging to submissions controller
- Files modified: blog-validation.js, blog-curation.js, blog-curation-enhanced.js
2025-10-24 11:02:43 +13:00
TheFlow
eb8d59da25 fix(submissions): remove User model populate calls
- User is also a native MongoDB class, not Mongoose model
- Removed all .populate() calls for createdBy, lastUpdatedBy, notes.author
- These were causing MissingSchemaError for User model
- Submissions can be returned without populated user data
2025-10-24 10:31:19 +13:00
TheFlow
28c1481e6b chore: bump cache version after submissions controller fix
- Updated to v0.1.1 to force browser refresh
- Ensures users get fixed submissions controller code
- Removed BlogPost populate() calls that caused 500 errors
2025-10-24 10:27:57 +13:00
TheFlow
5d05d6b080 fix(analytics): remove SessionSchema.index sessionId duplicate
- Line 49 has sessionId with unique: true (creates index automatically)
- Line 75 had redundant SessionSchema.index({ sessionId: 1 })
- Removed explicit index to eliminate Mongoose duplicate warning
2025-10-24 10:25:02 +13:00
TheFlow
ec5ace986d fix(analytics): remove duplicate sessionId index in PageViewSchema
- PageViewSchema had 'index: true' on sessionId field (line 16)
- AND compound index PageViewSchema.index({ sessionId: 1, timestamp: -1 })
- Compound index already covers sessionId queries (leftmost prefix)
- Removed redundant single-field index to eliminate Mongoose warning
2025-10-24 10:22:41 +13:00
TheFlow
08a036be3d fix(analytics): remove duplicate sessionId index definition
- SessionSchema had both 'unique: true' and 'index: true'
- unique already creates an index, making index redundant
- Resolves Mongoose warning about duplicate schema index
2025-10-24 10:21:31 +13:00
TheFlow
a66c5d9016 fix(submissions): resolve Mongoose populate error for hybrid BlogPost model
- BlogPost uses native MongoDB (not Mongoose), causing MissingSchemaError
- Removed all .populate('blogPostId') calls that tried to reference non-existent Mongoose model
- Manually fetch blog post data in controllers when needed
- Updated getSubmissions, getSubmissionById, getSubmissionByBlogPost, exportSubmission
- Updated SubmissionTracking static methods: getByStatus, getByPublication
- Standalone submissions (like Le Monde) now display without errors
2025-10-24 10:19:33 +13:00
TheFlow
dbbe252594 fix(blog-curation-enhanced): add null check for publication dropdown
- Fixed TypeError when page loads in Pre-Submission section
- publication-target element only exists in Generate section
- Cache version updated
2025-10-24 10:02:31 +13:00
TheFlow
f1ad7812f7 fix(submissions): handle null blogPostId in populate query
- Changed populate to use options object with strictPopulate: false
- Allows submissions without blogPostId (standalone packages) to be returned
- Fixes 500 error on /api/submissions endpoint
- Le Monde package should now be visible in UI after server restart
2025-10-24 09:55:51 +13:00
TheFlow
431078b81f debug: add console logging to track Le Monde loading
- Added detailed console logs to track submission loading
- Check if API response is ok
- Log all submissions found
- Log filtering logic for standalone submissions
- Cache version updated
2025-10-24 09:53:14 +13:00
TheFlow
2dd138e71f fix(blog-validation): show Le Monde standalone submission package
- Modified loadValidationArticles() to load standalone submissions (no blogPostId)
- Updated rendering to handle both blog posts and standalone packages
- Fixed API endpoint from /api/blog/posts/:id to /api/blog/admin/:id
- Standalone packages show with purple 'STANDALONE PACKAGE' badge
- Button text changes to 'View Package' for standalone submissions
- Cache version bumped to 0.1.1
2025-10-24 09:50:42 +13:00
TheFlow
782c90b2e7 feat(cache): enforce mandatory cache version updates for JS changes
- Enhanced update-cache-version.js to update service worker and version.json
- Added inst_075 governance instruction (HIGH persistence)
- Integrated cache check into deployment script (Step 1/5)
- Created CACHE_MANAGEMENT_ENFORCEMENT.md documentation
- Bumped version to 0.1.1
- Updated all HTML cache parameters

BREAKING: Deployment now blocks if JS changed without cache update
2025-10-24 09:43:20 +13:00
TheFlow
ac2db33732 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
TheFlow
064cb4b8ae feat(submissions): add multilingual document storage for publication packages
Extends SubmissionTracking model to support complete bilingual submission
packages with version control for multiple languages.

Schema additions:
- documents.coverLetter.versions[] - Language-versioned content
- documents.mainArticle.versions[] - With translation metadata
- documents.authorBio.versions[]
- documents.technicalBrief.versions[]

Helper methods:
- getDocument(docType, language, fallbackToDefault)
- setDocumentVersion(docType, language, content, metadata)
- getAvailableLanguages(docType)
- isPackageComplete(language)
- exportPackage(language)

Scripts:
- load-lemonde-package.js - Loads complete Le Monde submission package

Le Monde Package:
- Publication target: Rank 10, high-value French intellectual publication
- Theme: Post-Weberian organizational theory for AI age
- Content: Wittgenstein + Weber critique + indigenous data sovereignty
- Format: 187-word letter (within 150-200 requirement)
- Languages: English (original) + French (translated)
- Database ID: 68fa2abd2e6acd5691932150
- Status: Ready for submission

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-24 02:18:18 +13:00
TheFlow
d7d317bb3b fix(lint): resolve eslint errors in submission tracking
- Add missing space after comma in SubmissionTracking model
- Replace string concatenation with template literal in blog controller

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-24 01:57:47 +13:00
TheFlow
ff44a41930 feat(blog): add Manage Submission modal for publication tracking
Implements comprehensive submission tracking workflow for blog posts
targeting external publications. This feature enables systematic
management of submission packages and progress monitoring.

Frontend:
- Add submission-modal.js with complete modal implementation
- Modal includes publication selector (22 ranked publications)
- 4-item submission checklist (cover letter, pitch, notes, bio)
- Auto-save on blur with success indicators
- Progress bar (0-100%) tracking completion
- Requirements display per publication
- Update blog-validation.js with event handlers
- Update cache versions (HTML, service worker, version.json)

Backend:
- Add GET /api/blog/:id/submissions endpoint
- Add PUT /api/blog/:id/submissions endpoint (upsert logic)
- Implement getSubmissions and updateSubmission controllers
- Fix publications controller to use config helper functions
- Integration with SubmissionTracking MongoDB model

Version: 1.8.4

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-24 01:55:06 +13:00
TheFlow
f05473e23a feat(content): add About page with research focus and Te Tiriti acknowledgment
Add comprehensive About page emphasizing moral philosophy foundation over organizational theory. PluralisticDeliberationOrchestrator positioned as primary research focus. Te Tiriti o Waitangi content integrated to establish indigenous data sovereignty principles.

Also implements auto-compact tracking system to gather empirical data on Claude Code context compression events, enabling future heuristic predictions.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-24 01:19:28 +13:00
TheFlow
137558e262 chore(frontend): update cache-busting versions and i18n
Frontend Maintenance:
- Updated cache-busting version parameters on all script/CSS links
- researcher.html: Version updates for navbar, i18n, scroll-animations
- implementer.html: Version updates for components
- leader.html: Version updates for components
- i18n-simple.js: Updated internationalization utility

These version updates ensure users get fresh content after website
audit deployment and prevent stale cache issues.

All changes deployed to production and verified working.
2025-10-23 10:57:32 +13:00
TheFlow
3e9e6c7f89 feat(server): add security middleware and website-specific routes
Server Infrastructure Updates:
- Added response sanitization middleware (fixes Date serialization)
- Added CSRF protection middleware (double-submit cookie pattern)
- Enhanced rate limiting (public, form, auth limiters)
- Added cache control middleware for static assets
- Added cookie parser for CSRF support

Route Organization:
- Reorganized routes for website (auth, documents, blog, newsletter)
- Separated admin routes with /admin prefix
- Added koha routes for donations
- Added demo routes for interactive demonstrations
- Dev/test routes only in development environment

Config Updates:
- Updated app config for website platform
- Added website-specific configuration options

Model Updates:
- Updated model exports for website collections
- Added blog, media, newsletter models

These changes support the website platform while maintaining the
underlying Tractatus governance framework.
2025-10-23 10:57:20 +13:00
TheFlow
e743f17e6f refactor(project): transition from tractatus-framework to tractatus-website
Major project restructuring to separate framework from website implementation:

Package Changes:
- name: "tractatus-framework" v3.5.0 → "tractatus-website" v0.1.0
- description: Updated to reflect website platform purpose
- Added website-specific scripts (build:css, migrate:docs, etc.)
- Added website dependencies (puppeteer, stripe, i18n, etc.)

README Changes:
- Rewritten to focus on research framework and website
- Updated badges and links
- Added "What is Tractatus?" section
- Removed framework-specific deployment instructions

.gitignore Changes:
- Drastically simplified (189 line reduction)
- Removed public repository protection rules
- This is now the primary development repository

.env Changes:
- Updated examples to reflect website configuration
- Removed framework-specific environment variables

This commit documents that this repository is the WEBSITE implementation,
separate from the tractatus-framework package repository at
github.com/AgenticGovernance/tractatus-framework.

Production deployment remains via manual rsync, NOT GitHub.
2025-10-23 10:57:07 +13:00
TheFlow
762eb2b1f6 docs(session): add comprehensive handoff for website audit session
Complete session handoff documentation per inst_024:

Session Objectives Completed:
-  Fixed Invalid Date bug (middleware serialization)
-  Added blog categories (filter functionality)
-  Complete website audit (8 main pages)
-  Production deployment (all fixes verified)

Critical Fixes:
- Date serialization middleware bug (empty {} fix)
- Blog category system implementation
- Landing page meta description (removed superlative)
- Architecture page stats disclaimer (methodology context)

Files Modified:
- src/middleware/response-sanitization.middleware.js
- public/index.html
- public/architecture.html
- 3 blog-related scripts

Next Session Tasks:
- Git cleanup (now complete in this session)
- Documentation if time permits
- Economist submission ready

Session Statistics:
- 8 pages audited, 2 issues found (both fixed)
- 129k/200k tokens (65% utilization)
- Website status:  ECONOMIST-READY
2025-10-23 10:56:29 +13:00
TheFlow
f804cd1597 fix(website): governance compliance fixes from pre-Economist audit
Two governance compliance fixes identified in complete website audit:

1. public/index.html (line 7)
   - Removed unverifiable superlative "World's first"
   - Changed to "Production implementation" (factually accurate)
   - Prevents credibility undermining

2. public/architecture.html (lines 402-425)
   - Added methodology context: "Results from 6-month production deployment"
   - Added disclaimer: "Single-agent deployment. Independent validation
     and multi-organization replication needed."
   - Maintains transparency while presenting data

Audit Results:
- 8 main pages audited
- NO inst_017 violations (absolute assurances)
- NO inst_018 violations (unverified production claims)
- Only 2 minor issues found, both fixed
- Website now Economist-ready

Deployed to production and verified working.

Ref: SESSION_HANDOFF_2025-10-23_WEBSITE_AUDIT.md
2025-10-23 10:56:06 +13:00
TheFlow
2211f8156a feat(blog): add scripts for date fixes, categories, and governance banners
Three scripts to support blog system improvements:

1. fix-blog-dates.js
   - Fixes empty {} published_at values in database
   - Sets proper ISODate values for 3 blogs
   - Also updates moderation.approved_at for consistency

2. add-blog-categories.js
   - Adds category field to all blog posts
   - Maps content to standardized categories (Framework Updates,
     Implementation, Case Studies)
   - Enables category filtering functionality

3. add-vetting-notice-to-architectural-boundaries.js
   - Adds comprehensive human vetting notice
   - Documents AI-curated content review process
   - Shows governance working end-to-end with inst_017 compliance

Applied to both tractatus_dev and tractatus_prod databases.

Ref: SESSION_HANDOFF_2025-10-23_WEBSITE_AUDIT.md
2025-10-23 10:55:50 +13:00
TheFlow
072085a9e0 fix(middleware): critical Date serialization bug in response sanitization
Problem: All MongoDB Date objects were being serialized as empty {} in API
responses, breaking blog date display across entire site.

Root Cause: removeSensitiveFields() function used spread operator on Date
objects ({...date}), which creates empty object because Dates have no
enumerable properties.

Fix: Added Date instance check before spreading to preserve Date objects
intact for proper JSON.stringify() serialization.

Impact:
- Fixes all blog dates showing 'Invalid Date'
- API now returns proper ISO date strings
- Deployed to production and verified working

Ref: SESSION_HANDOFF_2025-10-23_WEBSITE_AUDIT.md
2025-10-23 10:55:38 +13:00
TheFlow
685afbf9d0 fix(leader): correct accordion button closing tags
All 9 accordion buttons now have matching opening <button> and closing </button> tags. Previous deployment had </div> closing tags causing rendering issues.

Fixes mid-section formatting glitches where accordion content wasn't displaying.
2025-10-23 00:24:58 +13:00
TheFlow
7bf30fffb2 feat(leader): WCAG accessibility with 9 accordions, keyboard navigation
- Converted all 9 accordion divs to semantic <button> elements
- Added ARIA attributes: aria-expanded, aria-controls, id for each button
- Accordion content: role="region" and aria-labelledby for screen readers
- Keyboard support: Enter and Space keys toggle accordions (WAI-ARIA pattern)
- Mobile optimization: 44px/48px touch targets, touch-action: manipulation
- iOS tap feedback: -webkit-tap-highlight-color
- Footer i18n: No footer object in leader.json (uses common.json correctly)
- Updated leader-page.js with keyboard handlers and ARIA state management
- Version 1.5.0

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-23 00:19:23 +13:00
TheFlow
810aa18f92 feat(implementer): WCAG accessibility, diagrams, mobile optimization
- Added diagrams from public tractatus-framework repo: architecture-main-flow.svg (6.6KB), trigger-decision-tree.svg (6.7KB)
- Diagram sizing: max-width 600px for readable display, responsive width 100%
- Fixed skip link: Added <main id="main-content"> wrapper for proper accessibility
- Quick navigation: 44px touch targets, flex-wrap for mobile, aria-label="Page sections"
- Download buttons: Descriptive ARIA labels, 44px minimum height
- Code blocks: Added role="region" and descriptive ARIA labels to all 6 service examples
- Mobile optimization: -webkit-overflow-scrolling, 11px code font on small screens, 16px body prevents iOS zoom
- API examples verified accurate against actual BoundaryEnforcer.service.js implementation
- CSP compliance: Moved diagram sizing to CSS class instead of inline styles
- Version 1.4.0

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-23 00:12:55 +13:00
TheFlow
a992d411b9 feat(researcher): WCAG compliance, Berlin/Weil foundations, fixed footer i18n
- Full WCAG accessibility: ARIA attributes (aria-expanded, aria-controls), keyboard navigation (Enter/Space)
- Reframed research context: Berlin/Weil as primary intellectual foundation (moral pluralism, categorical imperative)
- Bibliography with proper academic citations: Weil (The Need for Roots, Gravity and Grace), Berlin (Four Essays on Liberty)
- Fixed footer i18n: Implemented recursive deepMerge() to preserve nested translation objects
- Root cause: Shallow merge {...obj1, ...obj2} was overwriting entire footer object from common.json
- Consolidated all footer translations in common.json, removed from page-specific files
- Mobile optimization: 44px/48px touch targets, touch-action: manipulation, responsive design
- Progressive enhancement: <noscript> fallback for JavaScript-disabled users
- Version 1.3.0

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-22 23:56:37 +13:00