burnmydays's picture
Add Gradio Space demo with side-by-side comparison
53cfc95
#!/usr/bin/env python3
"""
Commitment Conservation Demo - Interactive HuggingFace Space
Side-by-side comparison of baseline vs enforced compression
"""
import gradio as gr
import os
import sys
# Add harness to path
sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'harness'))
from src.test_harness import recursion_test, extract_commitments
import pandas as pd
import matplotlib.pyplot as plt
# Pre-selected demonstration signals (short, clear commitments)
DEMO_SIGNALS = {
"Function Contract": "This function must return an integer.",
"Lease Agreement": "The tenant shall not sublet the premises without written consent.",
"Safety Rule": "You must wear a helmet while cycling.",
"Password Policy": "All passwords must be at least 8 characters long.",
"Budget Constraint": "The budget cannot exceed $5000."
}
def run_comparison(signal_text, num_iterations=3):
"""
Run side-by-side comparison of baseline vs enforced compression.
Returns formatted results for display.
"""
if not signal_text.strip():
return "⚠️ Please enter a text signal.", None, None, None
# Extract original commitments
original_commitments = extract_commitments(signal_text)
commitment_text = f"**Detected Commitments:** {', '.join(original_commitments) if original_commitments else 'None detected'}"
# Run baseline (no enforcement)
baseline_deltas = recursion_test(signal_text, depth=num_iterations, enforce=False)
baseline_stability = [(1.0 - d) * 100 for d in baseline_deltas]
# Run enforced (with commitment preservation)
enforced_deltas = recursion_test(signal_text, depth=num_iterations, enforce=True)
enforced_stability = [(1.0 - d) * 100 for d in enforced_deltas]
# Create comparison table
iterations = list(range(num_iterations + 1))
df = pd.DataFrame({
'Iteration': iterations,
'Baseline Stability (%)': [f"{s:.1f}%" for s in baseline_stability],
'Enforced Stability (%)': [f"{s:.1f}%" for s in enforced_stability],
'Gap (pp)': [f"+{(e - b):.1f}" for b, e in zip(baseline_stability, enforced_stability)]
})
# Create plot
fig, ax = plt.subplots(figsize=(8, 5))
ax.plot(iterations, baseline_stability, marker='o', label='Baseline', color='#d62728', linewidth=2)
ax.plot(iterations, enforced_stability, marker='s', label='Enforced', color='#2ca02c', linewidth=2)
ax.set_xlabel('Iteration', fontsize=12)
ax.set_ylabel('Commitment Stability (%)', fontsize=12)
ax.set_title('Baseline vs Enforced: Commitment Preservation', fontsize=14, fontweight='bold')
ax.legend(fontsize=11)
ax.grid(True, alpha=0.3)
ax.set_ylim([-5, 105])
plt.tight_layout()
# Summary results
final_baseline = baseline_stability[-1]
final_enforced = enforced_stability[-1]
gap = final_enforced - final_baseline
summary = f"""
## 📊 Results Summary
**After {num_iterations} iterations:**
- **Baseline:** {final_baseline:.1f}% stability
- **Enforced:** {final_enforced:.1f}% stability
- **Improvement:** +{gap:.1f} percentage points
{'✅ **Enforcement preserved commitments!**' if gap > 10 else '⚠️ Signal may need more iterations to show drift.'}
*Full 10-iteration harness with 5 signals shows +40pp average improvement. Run locally for complete validation.*
"""
return commitment_text, df, fig, summary
# Gradio Interface
with gr.Blocks(title="Commitment Conservation Demo", theme=gr.themes.Soft()) as demo:
gr.Markdown("""
# ⚖️ Commitment Conservation Interactive Demo
**Watch semantic drift in recursive compression—and see how commitment enforcement prevents it.**
This demo compares **baseline** transformer compression (which loses commitments) vs **enforced** compression (which preserves them).
📄 [Paper (v0.03)](https://doi.org/10.5281/zenodo.18274930) | 💻 [Full Harness](https://huggingface.co/burnmydays/commitment_conservation_harness) | 🔬 [GitHub](https://github.com/SunrisesIllNeverSee/commitment-conservation)
""")
with gr.Row():
with gr.Column(scale=2):
signal_input = gr.Textbox(
label="Input Signal (Text with Commitment)",
placeholder="Enter text containing a commitment, obligation, or constraint...",
lines=4,
value=DEMO_SIGNALS["Function Contract"]
)
with gr.Row():
preset_dropdown = gr.Dropdown(
choices=list(DEMO_SIGNALS.keys()),
label="Or select a preset example:",
value="Function Contract"
)
iterations_slider = gr.Slider(
minimum=1,
maximum=3,
step=1,
value=3,
label="Iterations (limited to 3 for speed)"
)
run_btn = gr.Button("🔬 Run Comparison", variant="primary", size="lg")
gr.Markdown("""
**How it works:**
1. System extracts commitments from your text
2. Compresses text recursively (3 iterations)
3. Tracks whether commitments survive each round
4. Compares baseline (drifts) vs enforced (preserves)
*⏱️ Takes ~20-40 seconds on CPU. Models load on first run.*
""")
with gr.Column(scale=3):
commitments_display = gr.Markdown(label="Extracted Commitments")
results_table = gr.Dataframe(label="Stability Over Iterations")
results_plot = gr.Plot(label="Comparison Chart")
summary_display = gr.Markdown(label="Summary")
# Event handlers
def update_signal_from_preset(preset_name):
return DEMO_SIGNALS[preset_name]
preset_dropdown.change(
fn=update_signal_from_preset,
inputs=[preset_dropdown],
outputs=[signal_input]
)
run_btn.click(
fn=run_comparison,
inputs=[signal_input, iterations_slider],
outputs=[commitments_display, results_table, results_plot, summary_display]
)
gr.Markdown("""
---
## 📖 About This Framework
This demonstrates the **commitment conservation principle**: meaningful commitments in language should be preserved
under compression and recursive application. The full harness tests 5 signals over 10 iterations and shows
**baseline systems fail (20% stability) while enforced systems succeed (60% stability)** — a 40pp empirical gap.
**⚖️ IP Notice:** MO§ES™ is a trademark of Ello Cello LLC. See [repo](https://huggingface.co/burnmydays/commitment_conservation_harness) for details.
© 2026 Ello Cello LLC. All rights reserved.
""")
if __name__ == "__main__":
demo.launch()