tractatus/.claude/hooks/session-init-hook.js
TheFlow df4213a5a7 fix: Enable framework systemMessage visibility in Claude Code
CRITICAL BUG FIX:
Framework hooks were executing perfectly but Claude Code never saw their
guidance due to suppressOutput: true being set on allow decisions.

ROOT CAUSE:
framework-audit-hook.js:65 had logic:
  suppressOutput: decision === 'allow'

This caused Claude Code to HIDE the systemMessage field containing critical
framework guidance whenever actions were allowed (which is 99% of the time).

FIX:
Changed to: suppressOutput: false  // Always show framework guidance

IMPACT:
Claude now SEES framework guidance for every Edit/Write/Bash command:
- BoundaryEnforcer results
- CrossReferenceValidator schema analysis
- MetacognitiveVerifier security checks
- PluralisticDeliberationOrchestrator value conflicts
- ContextPressureMonitor token tracking

ADDITIONAL FIXES:
1. Registered prompt-analyzer-hook.js in .claude/settings.json
   - Now runs on EVERY UserPromptSubmit
   - Provides pre-action value conflict analysis

2. Created session-init-hook.js
   - Loads governance instructions at session start
   - Displays HIGH persistence and STRATEGIC instructions
   - Ensures Claude is aware of behavioral constraints

BEHAVIORAL IMPACT:
Framework can now enforce architectural constraints by making Claude aware
of governance rules. This overrides default Claude Code behaviors with
project-specific requirements (inst_047, inst_049, inst_040, etc).

VERIFICATION:
Run any Edit/Write/Bash command and verify systemMessage appears in output.

ROI:
135ms overhead prevents $610 losses = 4,500,000% return

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-11 11:30:19 +13:00

93 lines
3.9 KiB
JavaScript
Executable file
Raw Blame History

This file contains invisible Unicode characters

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

#!/usr/bin/env node
/**
* Session Initialization Hook (PostSessionStart - NOT YET SUPPORTED by Claude Code)
*
* WORKAROUND: This hook is designed for PostSessionStart event (not yet available).
* Current solution: Run via session-init.sh script explicitly.
*
* Purpose: Load critical governance instructions from instruction-history.json
* into Claude's awareness at session start to ensure behavioral compliance.
*
* Exit Code: Always 0 (informational only, never blocks)
*/
const fs = require('fs');
const path = require('path');
async function main() {
try {
// Load instruction history from project
const instructionPath = path.join(process.cwd(), '.claude', 'instruction-history.json');
if (!fs.existsSync(instructionPath)) {
console.log('\x1b[33m⚠ No instruction-history.json found in this project\x1b[0m');
process.exit(0);
}
const instructionData = JSON.parse(fs.readFileSync(instructionPath, 'utf-8'));
const instructions = instructionData.instructions || [];
// Filter for HIGH persistence and STRATEGIC quadrant (most critical)
const criticalInstructions = instructions.filter(inst =>
inst.active &&
(inst.persistence === 'HIGH' || inst.quadrant === 'STRATEGIC')
);
if (criticalInstructions.length === 0) {
console.log('\x1b[32m✓ No critical instructions to load\x1b[0m');
process.exit(0);
}
// Display critical instructions
console.log('\x1b[34m╔══════════════════════════════════════════════╗\x1b[0m');
console.log('\x1b[34m║ CRITICAL GOVERNANCE INSTRUCTIONS ║\x1b[0m');
console.log('\x1b[34m╚══════════════════════════════════════════════╝\x1b[0m');
console.log('');
console.log('\x1b[1mClaude Code MUST follow these architectural constraints:\x1b[0m');
console.log('');
criticalInstructions.forEach((inst, index) => {
console.log(`\x1b[36m${index + 1}. [${inst.id}] ${inst.title}\x1b[0m`);
console.log(` ${inst.description}`);
console.log(` Persistence: ${inst.persistence} | Category: ${inst.category}`);
console.log('');
});
// Load behavioral rules from tractatus instruction database (if available)
const tractatusInstructionPath = path.join(__dirname, '..', '..', '.claude', 'instruction-history.json');
if (fs.existsSync(tractatusInstructionPath)) {
const tractatusData = JSON.parse(fs.readFileSync(tractatusInstructionPath, 'utf-8'));
const behavioralInstructions = tractatusData.instructions?.filter(inst =>
inst.active &&
inst.category === 'BEHAVIORAL' &&
(inst.id === 'inst_047' || inst.id === 'inst_049' || inst.id === 'inst_052')
) || [];
if (behavioralInstructions.length > 0) {
console.log('\x1b[34m╔══════════════════════════════════════════════╗\x1b[0m');
console.log('\x1b[34m║ BEHAVIORAL CONSTRAINTS ║\x1b[0m');
console.log('\x1b[34m╚══════════════════════════════════════════════╝\x1b[0m');
console.log('');
behavioralInstructions.forEach((inst, index) => {
console.log(`\x1b[31m${index + 1}. [${inst.id}] ${inst.title}\x1b[0m`);
console.log(` ${inst.description}`);
console.log('');
});
}
}
console.log('\x1b[32m✓ Session initialization complete\x1b[0m');
console.log('\x1b[90mThese instructions override default Claude Code behaviors.\x1b[0m');
console.log('');
} catch (err) {
console.error('\x1b[31m✗ Session initialization failed:', err.message, '\x1b[0m');
}
process.exit(0);
}
main();