Fixed broken "Decisions Over Time" chart that wasn't displaying bars.
Root cause: Empty divs with percentage heights collapsed in flex containers.
Fixes applied:
1. **Pixel heights instead of percentages**
- Calculate absolute pixel heights from h-48 container (192px)
- Percentage heights don't work in flex containers with items-end
2. **Non-breaking space inside bars**
- Added to prevent empty div collapse
- Even with height set, empty divs can collapse in some layouts
3. **Decision count labels**
- Display count above each bar for exact numbers
- Shows both visual proportion (bar height) and exact value (label)
4. **Minimum 10px height**
- Ensures small values are always visible
- Prevents bars from disappearing for low counts
5. **Wider bars**
- Changed from max-w-16 (64px) to w-3/4 (75% width)
- More visible and easier to interact with
Timeline modes working:
- ✅ 6-Hourly (24h) - 4 bars showing last 24 hours in 6-hour buckets
- ✅ Daily (7d) - 7 bars showing last 7 days
- ✅ Weekly (4w) - 4 bars showing last 4 weeks
All modes show current snapshot updated on refresh.
Files changed:
- public/js/admin/audit-analytics.js: Timeline rendering logic
- public/admin/audit-analytics.html: Updated cache version
- public/*.html: Cache version bump for consistency
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
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 edb1540 but cached version prevented fix from loading.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
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
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>
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>
- Updated to v0.1.1 to force browser refresh
- Ensures users get fixed submissions controller code
- Removed BlogPost populate() calls that caused 500 errors
- 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
- 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
- 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
- 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>
- 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>
- 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>
Rewrote Copilot governance answer to match the restrained, analytical tone of the leader page, removing overconfident American-style assertions.
Key changes:
- Opening: "creates significant liability exposure" → "raises structural questions about governance"
- Removed dramatic scenarios: "Post-incident: 'How did this get approved?' No audit trail. No answer."
- Removed unvalidated cost claims (£500k-£2M settlements, specific ROI figures)
- Added development context: "proof-of-concept validated in a single project context"
- Changed assertions to observations: "will cause" → "may create", "is" → "raises questions about"
- Removed sales pitch language: "Case closed", "catastrophic liability exposure"
- Added honest limitations: "If your rules are inadequate...Tractatus enforces those inadequacies architecturally"
- Changed CTA: Removed "pro bono offer" for removed "show you exactly where your exposure is"
- Used cautious framing: "Whether this constitutes 'compliance-grade' evidence depends on your regulatory context"
Tone now matches leader page:
- Measured, intellectual engagement
- Evidence-based claims with context
- Acknowledges uncertainty
- Focuses on structural governance questions
- No prescriptive assertions
Version: 1.1.0 → 1.1.1
User feedback: "I like your overconfident American attitude. It has its place on this planet, but not here."
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
## Bug Fixes
- Fixed inline FAQ markdown rendering with error handling
- Added try-catch around marked.parse() for inline FAQs
- Added fallback to plain text with line breaks on parse failure
- Enhanced logging for FAQ rendering diagnostics
## New Instruction (inst_040)
Created rule requiring complete coverage when user says "all":
- "update all pages" means EVERY page, not representative subset
- Must identify complete scope before starting
- Verify ALL items processed before marking complete
- Ask user to prioritize if scope >20 items
## Rationale
User reported inline FAQs showing raw markdown instead of formatted HTML.
Root cause: createInlineFAQItemHTML lacked error handling that was added
to createFAQItemHTML in previous version. Both functions now have consistent
error handling with logging.
User directive: When saying "all", Claude must not choose subset.
## Version
- Bumped to 1.0.5
- Force update enabled
- Synced inst_040 to production
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
## FAQ Modal Fixes
- Fix modal scrolling: changed max-h-[85vh] to h-[85vh] with min-h-0
- Added flex-shrink-0 to modal header for proper flex behavior
- Users can now scroll through all 30 FAQ questions (was stuck at 8)
- Enhanced markdown parsing with error handling and fallback
## UI Improvements
- Removed Quick Actions section from FAQ page per user request
- Standardized footer across 7 user-facing pages
- Added Newsletter link under Community section in all footers
## Pages Updated
- faq.html, researcher.html, implementer.html, leader.html
- about.html, media-inquiry.html, case-submission.html
## Version
- Bumped to 1.0.4 with force update enabled
- Service worker cache updated
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Implements cache busting and progressive web app features:
**Version Management:**
- version.json manifest with changelog tracking
- Service worker with automatic update checking (hourly)
- Update notification UI with changelog display
- Configurable forced updates after timeout
- Cache control headers for optimal performance
**PWA Features:**
- manifest.json with app shortcuts
- Apple touch icon support
- "Add to Home Screen" functionality
- Offline support via service worker
**Cache Strategy:**
- HTML: 5-minute cache with revalidation
- CSS/JS: 1-year immutable cache
- Images: 1-year immutable cache
- version.json/service-worker.js: no-cache
**Integration:**
- All main pages updated with PWA meta tags
- Version manager loaded on all user-facing pages
- Production deployment successful
Users who previously visited the site will now automatically receive
update notifications when version changes.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>