+ • A/B Testing Protocol (framework-enabled vs. baseline LLM performance)
• Tiered Pattern Recognition (session, sequential, temporal anomalies)
• Feedback Loop Analysis (learning rates, recidivism tracking, rule effectiveness)
• Organizational Benchmarking (cross-org anonymized data sharing)
diff --git a/public/js/admin/audit-analytics.js b/public/js/admin/audit-analytics.js
index 2f255a9c..cf427305 100644
--- a/public/js/admin/audit-analytics.js
+++ b/public/js/admin/audit-analytics.js
@@ -249,6 +249,58 @@ async function renderBusinessIntelligence() {
const progressBar = document.getElementById('maturity-progress');
progressBar.style.width = maturityScore + '%';
+ // PHASE 3.4: Framework Participation Rate
+ const frameworkBackedDecisions = auditData.filter(d =>
+ d.metadata && d.metadata.framework_backed_decision === true
+ );
+ const participationRate = auditData.length > 0
+ ? ((frameworkBackedDecisions.length / auditData.length) * 100).toFixed(1)
+ : '0.0';
+
+ document.getElementById('participation-rate').textContent = `${participationRate}%`;
+
+ // Message based on participation rate
+ const rate = parseFloat(participationRate);
+ let participationMessage = '';
+ if (rate >= 80) {
+ participationMessage = 'Excellent - Framework actively guiding most decisions';
+ } else if (rate >= 60) {
+ participationMessage = 'Good - Framework participating in majority of decisions';
+ } else if (rate >= 40) {
+ participationMessage = 'Moderate - Framework guidance available for some decisions';
+ } else if (rate >= 20) {
+ participationMessage = 'Low - Framework participation needs improvement';
+ } else {
+ participationMessage = 'Critical - Framework rarely providing guidance';
+ }
+ document.getElementById('participation-message').textContent = participationMessage;
+
+ // Breakdown by service
+ const participationByService = {};
+ frameworkBackedDecisions.forEach(d => {
+ const service = d.service || 'Unknown';
+ if (!participationByService[service]) {
+ participationByService[service] = 0;
+ }
+ participationByService[service]++;
+ });
+
+ const breakdownEl = document.getElementById('participation-breakdown');
+ const sortedServices = Object.entries(participationByService)
+ .sort((a, b) => b[1] - a[1])
+ .slice(0, 5); // Top 5 services
+
+ if (sortedServices.length > 0) {
+ breakdownEl.innerHTML = sortedServices
+ .map(([service, count]) => {
+ const percentage = ((count / frameworkBackedDecisions.length) * 100).toFixed(0);
+ return `
${service}: ${count} (${percentage}%)
`;
+ })
+ .join('');
+ } else {
+ breakdownEl.innerHTML = '
No framework guidance data yet
';
+ }
+
// Team Comparison (AI vs Human)
const aiDecisions = auditData.filter(d =>
d.service === 'FileEditHook' || d.service === 'BoundaryEnforcer' ||