ontoref/assets/web/index.html
Jesús Pérez d59644b96f
feat: unified auth model, project onboarding, install pipeline, config management
The full scope across this batch: POST /sessions key→token exchange, SessionStore dual-index with revoke_by_id, CLI Bearer injection (ONTOREF_TOKEN), ontoref setup
  --gen-keys, install scripts, daemon config form roundtrip, ADR-004/005, on+re self-description update (fully-self-described), and landing page refresh.
2026-03-13 20:56:31 +00:00

2 lines
68 KiB
HTML

<!doctype html><html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title data-en="Ontoref — A Self-Describing Ontology &amp; Reflection Protocol" data-es="Ontoref — Un Protocolo de Ontolog&iacute;a y Reflexi&oacute;n Auto-Descriptivo" > Ontoref </title><link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700;800&family=JetBrains+Mono:wght@400;500;600&display=swap" rel="stylesheet" /><style> *{margin:0;padding:0;box-sizing:border-box;}body{font-family:"Inter",-apple-system,BlinkMacSystemFont,sans-serif;background:#0f172a;color:#ffffff;overflow-x:hidden;transition:background 0.3s,color 0.3s;}.gradient-bg{position:fixed;top:0;left:0;width:100%;height:100%;z-index:-1;background:radial-gradient( circle at 20% 50%,rgba(96,165,250,0.12) 0%,transparent 50% ),radial-gradient( circle at 80% 80%,rgba(249,115,22,0.1) 0%,transparent 50% ),radial-gradient( circle at 50% 20%,rgba(99,102,241,0.08) 0%,transparent 50% );}.language-toggle{position:fixed;top:2rem;right:2rem;z-index:100;display:flex;gap:0.5rem;background:rgba(255,255,255,0.05);border:1px solid rgba(96,165,250,0.3);border-radius:20px;padding:0.3rem 0.3rem;}.lang-btn{background:transparent;border:none;color:#94a3b8;padding:0.5rem 1rem;border-radius:18px;cursor:pointer;font-weight:700;font-size:0.85rem;text-transform:uppercase;transition:all 0.3s ease;font-family:"Inter",sans-serif;text-decoration:none;display:inline-block;}.lang-btn.active{background:linear-gradient(135deg,#60a5fa 0%,#f97316 100%);color:#fff;}.lang-btn:hover{color:#60a5fa;}.container{max-width:1200px;margin:0 auto;padding:2rem;position:relative;}header{text-align:center;padding:5rem 0 4rem;animation:fadeInUp 0.8s ease-out;}@keyframes fadeInUp{from{opacity:0;transform:translateY(30px);}to{opacity:1;transform:translateY(0);}}.status-badge{display:inline-block;background:rgba(96,165,250,0.15);border:1px solid #60a5fa;color:#60a5fa;padding:0.5rem 1.5rem;border-radius:50px;font-size:0.85rem;font-weight:700;margin-bottom:1.5rem;}.logo-container{margin-bottom:2rem;}.logo-container img{max-width:420px;width:100%;height:auto;filter:drop-shadow(0 0 30px rgba(96,165,250,0.3));}.tagline{font-size:0.95rem;color:#60a5fa;font-weight:600;letter-spacing:0.1em;text-transform:uppercase;margin-bottom:1rem;}h1{font-size:2.8rem;font-weight:800;line-height:1.2;margin-bottom:1.5rem;background:linear-gradient( 135deg,#60a5fa 0%,#f97316 50%,#fb923c 100% );-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text;}.hero-subtitle{font-size:1.15rem;color:#cbd5e1;max-width:800px;margin:0 auto 2rem;line-height:1.8;}.yin-yang{display:grid;grid-template-columns:1fr 1fr;gap:1.5rem;margin-bottom:2.5rem;}.yin-yang-card{background:rgba(255,255,255,0.03);border-radius:10px;padding:1.5rem;border-left:4px solid;}.yin-yang-card.yin{border-color:#60a5fa;}.yin-yang-card.yang{border-color:#f97316;}.yin-yang-card h3{font-size:0.85rem;font-weight:700;letter-spacing:0.06em;text-transform:uppercase;margin-bottom:0.25rem;}.yin-yang-card.yin h3{color:#60a5fa;}.yin-yang-card.yang h3{color:#f97316;}.yin-yang-card .sub{font-size:0.75rem;color:#64748b;font-style:italic;margin-bottom:0.75rem;}.yin-yang-card ul{list-style:none;padding:0;margin:0;font-size:0.82rem;color:#94a3b8;line-height:1.7;}.yin-yang-card ul li::before{content:"· ";color:#475569;}.yin-yang-card ul strong{color:#e2e8f0;font-weight:600;}.tension-box{background:rgba(255,255,255,0.02);border:1px solid #1e293b;border-radius:8px;padding:1rem 1.25rem;font-family:"JetBrains Mono","Courier New",monospace;font-size:0.75rem;color:#64748b;line-height:1.9;margin-bottom:2.5rem;text-align:center;}.tension-box .tension-thesis{color:#f97316;font-family:"Inter",sans-serif;font-weight:700;font-size:0.85rem;margin-top:0.5rem;font-style:normal;}.layers-stack{display:flex;flex-direction:column;gap:0.75rem;}.layer-card{border-left:4px solid;border-radius:0 8px 8px 0;padding:0.85rem 1.25rem;background:rgba(255,255,255,0.02);transition:background 0.2s;}.layer-card:hover{background:rgba(255,255,255,0.05);}.layer-card .layer-label{font-size:0.72rem;font-weight:700;letter-spacing:0.08em;text-transform:uppercase;font-family:"JetBrains Mono","Courier New",monospace;}.layer-card .layer-items{font-size:0.75rem;color:#64748b;font-family:"JetBrains Mono","Courier New",monospace;margin:0.2rem 0 0.25rem;}.layer-card .layer-desc{font-size:0.75rem;color:#475569;font-style:italic;}.layer-decl{border-color:#60a5fa;}.layer-decl .layer-label{color:#60a5fa;}.layer-op{border-color:#f97316;}.layer-op .layer-label{color:#f97316;}.layer-entry{border-color:#4ade80;}.layer-entry .layer-label{color:#4ade80;}.layer-graph{border-color:#c084fc;}.layer-graph .layer-label{color:#c084fc;}.layer-runtime{border-color:#22d3ee;}.layer-runtime .layer-label{color:#22d3ee;}.layer-adopt{border-color:#facc15;}.layer-adopt .layer-label{color:#facc15;}@media (max-width:640px){.yin-yang{grid-template-columns:1fr;}}.highlight{color:#60a5fa;font-weight:700;}.section{margin:4rem 0;animation:fadeInUp 0.8s ease-out;}.section-title{font-size:2rem;font-weight:800;margin-bottom:2rem;color:#60a5fa;text-align:center;}.section-title span{background:linear-gradient(135deg,#60a5fa 0%,#f97316 100%);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text;}.problems-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:1.5rem;margin-top:2rem;}.problem-card{background:rgba(255,255,255,0.03);border:1px solid rgba(96,165,250,0.25);border-radius:12px;padding:2rem;transition:all 0.3s ease;position:relative;overflow:hidden;}.problem-card:hover{transform:translateY(-5px);background:rgba(255,255,255,0.05);border-color:rgba(249,115,22,0.4);}.problem-number{font-size:2rem;font-weight:800;background:linear-gradient(135deg,#60a5fa 0%,#f97316 100%);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text;line-height:1;margin-bottom:0.5rem;}.problem-card h3{color:#60a5fa;font-size:1.05rem;margin-bottom:0.7rem;font-weight:700;}.problem-card ul{color:#cbd5e1;font-size:0.9rem;line-height:1.6;list-style:none;padding:0;margin:0;}.problem-card ul li{padding-left:1.2rem;margin-bottom:0.5rem;position:relative;}.problem-card ul li:before{content:"\2022";color:#60a5fa;font-weight:bold;position:absolute;left:0;}.features-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:2rem;margin-top:2rem;}.feature-box{background:linear-gradient( 135deg,rgba(96,165,250,0.08) 0%,rgba(249,115,22,0.08) 100% );border-radius:12px;padding:2rem;border-left:4px solid #60a5fa;transition:all 0.3s ease;}.feature-box:hover{background:linear-gradient( 135deg,rgba(96,165,250,0.13) 0%,rgba(249,115,22,0.1) 100% );transform:translateY(-3px);}.feature-icon{font-size:2.5rem;margin-bottom:1rem;}.feature-title{font-size:1.15rem;font-weight:700;color:#60a5fa;margin-bottom:0.7rem;}.feature-text{color:#cbd5e1;font-size:0.95rem;line-height:1.7;list-style:none;padding:0;margin:0;}.feature-text li{padding-left:1.2rem;margin-bottom:0.6rem;position:relative;}.feature-text li:before{content:"\25B8";color:#f97316;font-weight:bold;position:absolute;left:0;}.components-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:1rem;margin-top:2rem;}.component-item{background:rgba(96,165,250,0.08);padding:1.2rem;border-radius:8px;font-size:0.9rem;border:1px solid rgba(96,165,250,0.2);transition:all 0.2s ease;text-align:center;}.component-item:hover{background:rgba(96,165,250,0.13);transform:translateY(-2px);}.component-name{color:#60a5fa;font-weight:700;display:block;margin-bottom:0.3rem;}.component-role{color:#94a3b8;font-size:0.85rem;}.adopt-section{margin-top:3rem;padding:2.5rem;background:rgba(249,115,22,0.04);border:1px solid rgba(249,115,22,0.15);border-radius:16px;}.adopt-title{font-size:1.3rem;font-weight:800;color:#f97316;margin-bottom:0.5rem;text-align:center;}.adopt-subtitle{font-size:0.9rem;color:#94a3b8;text-align:center;margin-bottom:1.5rem;}.adopt-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:1rem;}.adopt-item{background:rgba(249,115,22,0.06);padding:1rem;border-radius:8px;border:1px solid rgba(249,115,22,0.15);text-align:center;}.tech-stack{display:flex;flex-wrap:wrap;gap:1rem;margin-top:2rem;justify-content:center;}.tech-badge{background:rgba(96,165,250,0.12);border:1px solid #60a5fa;padding:0.5rem 1rem;border-radius:20px;font-size:0.8rem;color:#60a5fa;font-weight:700;}.code-block{background:rgba(15,23,42,0.8);border:1px solid #1e293b;border-radius:10px;padding:1.5rem;font-family:"JetBrains Mono","Courier New",monospace;font-size:0.8rem;color:#94a3b8;line-height:1.8;margin-top:2rem;overflow-x:auto;}.code-block .kw{color:#60a5fa;}.code-block .str{color:#4ade80;}.code-block .cmt{color:#475569;font-style:italic;}.code-block .key{color:#f97316;}.daemon-cols{display:grid;grid-template-columns:1fr 1fr;gap:2rem;margin-top:2rem;}@media (max-width:900px){.daemon-cols{grid-template-columns:1fr;}}.daemon-col-title{font-size:1rem;font-weight:700;color:#f97316;margin-bottom:1rem;letter-spacing:0.04em;text-transform:uppercase;}.window-mockup{background:rgba(15,23,42,0.9);border:1px solid #1e293b;border-radius:10px;overflow:hidden;}.window-titlebar{background:#1e293b;padding:0.5rem 1rem;display:flex;align-items:center;gap:0.4rem;}.window-dot{width:10px;height:10px;border-radius:50%;}.window-dot.red{background:#f87171;}.window-dot.yellow{background:#fbbf24;}.window-dot.green{background:#4ade80;}.window-titlebar span{color:#64748b;font-size:0.75rem;font-family:"JetBrains Mono","Courier New",monospace;margin-left:0.5rem;}.window-nav{background:#0f1c30;display:flex;flex-wrap:wrap;gap:0;border-bottom:1px solid #1e293b;padding:0 0.5rem;}.window-nav-tab{font-family:"JetBrains Mono","Courier New",monospace;font-size:0.68rem;color:#475569;padding:0.45rem 0.75rem;border-bottom:2px solid transparent;cursor:default;transition:color 0.15s;white-space:nowrap;}.window-nav-tab.active{color:#60a5fa;border-bottom-color:#60a5fa;}.window-nav-tab:hover{color:#94a3b8;}.window-body{padding:1.25rem 1.5rem;font-family:"JetBrains Mono","Courier New",monospace;font-size:0.78rem;line-height:1.9;}.window-page-row{display:flex;align-items:baseline;gap:0.5rem;padding:0.15rem 0;border-bottom:1px solid rgba(30,41,59,0.6);}.window-page-row:last-child{border-bottom:none;}.window-page-route{color:#f97316;font-size:0.7rem;min-width:110px;flex-shrink:0;}.window-page-name{color:#60a5fa;font-weight:600;min-width:90px;flex-shrink:0;}.window-page-desc{color:#475569;font-size:0.68rem;}.mcp-table{width:100%;border-collapse:collapse;font-size:0.78rem;margin-top:0;}.mcp-table th{color:#64748b;font-weight:700;text-align:left;padding:0.4rem 0.6rem;border-bottom:1px solid #1e293b;font-family:"JetBrains Mono","Courier New",monospace;font-size:0.72rem;text-transform:uppercase;letter-spacing:0.05em;}.mcp-table td{padding:0.3rem 0.6rem;border-bottom:1px solid rgba(30,41,59,0.5);font-family:"JetBrains Mono","Courier New",monospace;vertical-align:top;}.mcp-table td:first-child{color:#60a5fa;white-space:nowrap;}.mcp-table td:last-child{color:#64748b;font-size:0.73rem;}.mcp-table-wrap{background:rgba(15,23,42,0.8);border:1px solid #1e293b;border-radius:10px;padding:1rem;overflow-x:auto;max-height:460px;overflow-y:auto;}.info-boxes{display:grid;grid-template-columns:1fr 1fr;gap:1.5rem;margin-top:2rem;}@media (max-width:900px){.info-boxes{grid-template-columns:1fr;}}.info-box{background:rgba(15,23,42,0.6);border:1px solid;border-radius:10px;padding:1.5rem;}.info-box.box-teal{border-color:rgba(34,211,238,0.3);}.info-box.box-orange{border-color:rgba(249,115,22,0.3);}.info-box h4{font-size:0.8rem;font-weight:700;letter-spacing:0.07em;text-transform:uppercase;font-family:"JetBrains Mono","Courier New",monospace;margin-bottom:0.75rem;}.info-box.box-teal h4{color:#22d3ee;}.info-box.box-orange h4{color:#f97316;}.info-box ul{list-style:none;padding:0;margin:0;font-size:0.8rem;color:#94a3b8;line-height:1.8;}.info-box ul li::before{content:"· ";color:#475569;}.info-box ul strong{color:#e2e8f0;}.info-box ul code{font-family:"JetBrains Mono","Courier New",monospace;font-size:0.75rem;color:#60a5fa;background:rgba(96,165,250,0.08);padding:0.05rem 0.3rem;border-radius:3px;}.cta-section{text-align:center;margin:5rem 0 3rem;padding:4rem 2rem;background:linear-gradient( 135deg,rgba(96,165,250,0.08) 0%,rgba(249,115,22,0.08) 100% );border-radius:20px;border:1px solid rgba(96,165,250,0.25);}.cta-title{font-size:2rem;font-weight:800;margin-bottom:1rem;background:linear-gradient(135deg,#60a5fa 0%,#f97316 100%);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text;}.cta-subtitle{font-size:1.1rem;color:#94a3b8;margin-bottom:2rem;max-width:600px;margin-left:auto;margin-right:auto;}.cta-button{display:inline-block;background:linear-gradient( 135deg,#60a5fa 0%,#3b82f6 50%,#f97316 100% );color:#fff;padding:1.1rem 2.8rem;border-radius:50px;text-decoration:none;font-weight:800;font-size:1rem;transition:all 0.3s ease;box-shadow:0 10px 30px rgba(96,165,250,0.25);text-transform:uppercase;letter-spacing:0.05em;border:none;cursor:pointer;}.cta-button:hover{transform:translateY(-3px) scale(1.05);box-shadow:0 20px 50px rgba(96,165,250,0.4);}footer{text-align:center;padding:3rem 0 2rem;color:#64748b;border-top:1px solid rgba(255,255,255,0.1);margin-top:4rem;font-size:0.9rem;}footer p:first-child{font-weight:700;color:#94a3b8;}footer p:last-child{margin-top:0.5rem;font-size:0.85rem;}.hidden{display:none;}@media (max-width:768px){h1{font-size:2rem;}.hero-subtitle{font-size:1rem;}.logo-container img{max-width:320px;}.section-title{font-size:1.6rem;}.cta-title{font-size:1.6rem;}.language-toggle{top:1rem;right:1rem;}}html.light body{background:#f8fafc;color:#0f172a;}html.light .gradient-bg{background:radial-gradient( circle at 20% 50%,rgba(96,165,250,0.07) 0%,transparent 50% ),radial-gradient( circle at 80% 80%,rgba(232,168,56,0.07) 0%,transparent 50% ),radial-gradient( circle at 50% 20%,rgba(99,102,241,0.05) 0%,transparent 50% );}html.light .language-toggle{background:rgba(0,0,0,0.05);border-color:rgba(96,165,250,0.35);}html.light .lang-btn{color:#475569;}html.light .hero-subtitle{color:#334155;}html.light .yin-yang-card{background:rgba(0,0,0,0.03);}html.light .yin-yang-card ul{color:#475569;}html.light .yin-yang-card ul strong{color:#0f172a;}html.light .yin-yang-card ul li::before{color:#94a3b8;}html.light .tension-box{background:rgba(0,0,0,0.02);border-color:#e2e8f0;color:#64748b;}html.light .layer-card{background:rgba(0,0,0,0.02);}html.light .layer-card:hover{background:rgba(0,0,0,0.04);}html.light .layer-card .layer-items{color:#64748b;}html.light .layer-card .layer-desc{color:#64748b;}html.light .problem-card{background:rgba(0,0,0,0.02);border-color:rgba(96,165,250,0.25);}html.light .problem-card:hover{background:rgba(0,0,0,0.04);border-color:rgba(232,168,56,0.35);}html.light .problem-card ul{color:#334155;}html.light .problem-card ul li:before{color:#64748b;}html.light .feature-box{background:linear-gradient( 135deg,rgba(96,165,250,0.07) 0%,rgba(232,168,56,0.05) 100% );}html.light .feature-box:hover{background:linear-gradient( 135deg,rgba(96,165,250,0.12) 0%,rgba(232,168,56,0.08) 100% );}html.light .feature-text{color:#334155;}html.light .feature-text li:before{color:#e8a838;}html.light .component-item{background:rgba(96,165,250,0.07);border-color:rgba(96,165,250,0.2);}html.light .component-item:hover{background:rgba(96,165,250,0.12);}html.light .component-role{color:#475569;}html.light .adopt-section{background:rgba(232,168,56,0.05);border-color:rgba(232,168,56,0.2);}html.light .adopt-subtitle{color:#475569;}html.light .adopt-item{background:rgba(232,168,56,0.06);border-color:rgba(232,168,56,0.15);}html.light .code-block{background:#f1f5f9;border-color:#cbd5e1;color:#475569;}html.light .code-block .cmt{color:#94a3b8;}html.light .code-block .key{color:#e8a838;}html.light .window-mockup{background:#f8fafc;border-color:#cbd5e1;}html.light .window-titlebar{background:#e2e8f0;}html.light .window-titlebar span{color:#94a3b8;}html.light .window-nav{background:#f1f5f9;border-bottom-color:#cbd5e1;}html.light .window-nav-tab{color:#94a3b8;}html.light .window-nav-tab.active{color:#60a5fa;}html.light .window-nav-tab:hover{color:#475569;}html.light .window-body{color:#475569;}html.light .window-page-row{border-bottom-color:rgba(203,213,225,0.5);}html.light .window-page-desc{color:#94a3b8;}html.light .mcp-table-wrap{background:#f1f5f9;border-color:#cbd5e1;}html.light .mcp-table th{color:#64748b;border-bottom-color:#cbd5e1;}html.light .mcp-table td{border-bottom-color:rgba(203,213,225,0.5);}html.light .mcp-table td:last-child{color:#64748b;}html.light .info-box{background:rgba(241,245,249,0.95);}html.light .info-box ul{color:#475569;}html.light .info-box ul li::before{color:#94a3b8;}html.light .info-box ul strong{color:#0f172a;}html.light .info-box ul code{background:rgba(96,165,250,0.1);}html.light .cta-section{background:linear-gradient( 135deg,rgba(96,165,250,0.07) 0%,rgba(232,168,56,0.07) 100% );border-color:rgba(96,165,250,0.25);}html.light .cta-subtitle{color:#475569;}html.light footer{border-top-color:rgba(0,0,0,0.1);color:#64748b;}html.light footer p:first-child{color:#475569;}html.light .daemon-col-title{color:#e8a838;}html.light .screenshot-btn{background:rgba(0,0,0,0.04);border-color:rgba(96,165,250,0.25);color:#64748b;}html.light .screenshot-btn.active,html.light .screenshot-btn:hover{background:rgba(232,168,56,0.1);border-color:#e8a838;color:#e8a838;}html.light .graph-screenshot-frame{border-color:rgba(232,168,56,0.3);box-shadow:0 8px 40px rgba(0,0,0,0.12);}html.light .legend-item{color:#64748b;}.screenshot-toggle{display:flex;gap:0.5rem;margin-bottom:1rem;}.screenshot-btn{background:rgba(255,255,255,0.05);border:1px solid rgba(96,165,250,0.25);border-radius:8px;padding:0.35rem 0.9rem;color:#64748b;cursor:pointer;font-family:"JetBrains Mono",monospace;font-size:0.78rem;transition:all 0.2s;}.screenshot-btn.active,.screenshot-btn:hover{background:rgba(232,168,56,0.12);border-color:#e8a838;color:#e8a838;}.graph-screenshot-frame{border-radius:12px;overflow:hidden;border:1px solid rgba(232,168,56,0.25);box-shadow:0 0 0 1px rgba(96,165,250,0.08),0 32px 80px rgba(0,0,0,0.55);}.graph-screenshot-frame img{width:100%;height:auto;display:block;transition:opacity 0.2s;}.graph-legend{display:flex;flex-wrap:wrap;gap:1rem;margin-top:1rem;align-items:center;}.legend-item{display:flex;align-items:center;gap:0.4rem;font-size:0.78rem;color:#64748b;font-family:"JetBrains Mono",monospace;}.legend-dot{width:9px;height:9px;border-radius:50%;flex-shrink:0;}.legend-diamond{width:9px;height:9px;transform:rotate(45deg);flex-shrink:0;}</style></head><body><div class="gradient-bg"></div><div class="language-toggle"><button class="lang-btn active" data-lang="en" onclick="switchLanguage('en')" > EN </button><button class="lang-btn" data-lang="es" onclick="switchLanguage('es')"> ES </button><a href="architecture-diagram.html" class="lang-btn" data-en="Architecture" data-es="Arquitectura" >Architecture</a ><button id="theme-btn" class="lang-btn" onclick="toggleTheme()" title="Toggle dark/light mode" > &#9728;&#xFE0F; </button></div><div class="container"><header><span class="status-badge" data-en="Protocol + Runtime · v0.1.0" data-es="Protocolo + Runtime · v0.1.0" >Protocol + Runtime · v0.1.0</span ><div class="logo-container"><img src="ontoref-logo.svg" alt="Ontoref — Self-Describing Ontology and Reflection Protocol" /></div><p class="tagline" data-en="Structure that remembers why." data-es="Estructura que recuerda el porqu&eacute;." > Structure that remembers why. </p><h1 data-en="Self-Describing Protocol for<br>Evolving Codebases" data-es="Protocolo Auto-Descriptivo para<br>Codebases Evolutivas" > Self-Describing Protocol for<br />Evolving Codebases </h1><p class="hero-subtitle"><span class="highlight" data-en="Ontology + Reflection + Daemon + MCP" data-es="Ontolog&iacute;a + Reflexi&oacute;n + Daemon + MCP" >Ontology + Reflection + Daemon + MCP</span ><span data-en=" &mdash; encode what your codebase IS (invariants, tensions, constraints) and what it DOES (operational modes, actor flows, config seals) in machine-queryable directed acyclic graphs. First-class web UI (12 pages), MCP server (19 tools), and live session sharing for AI agents. One protocol for developers, agents, and CI." data-es=" &mdash; codifica lo que tu codebase ES (invariantes, tensiones, constraints) y lo que HACE (modos operacionales, flujos de actor, config selladas) en grafos ac&iacute;clicos dirigidos consultables por m&aacute;quina. UI web de primer nivel (12 p&aacute;ginas), servidor MCP (19 herramientas) y compartici&oacute;n de tareas en vivo para agentes IA. Un protocolo para desarrolladores, agentes y CI." > &mdash; encode what your codebase IS (invariants, tensions, constraints) and what it DOES (operational modes, actor flows, config seals) in machine-queryable directed acyclic graphs. First-class web UI (12 pages), MCP server (19 tools), and live session sharing for AI agents. One protocol for developers, agents, and CI. </span><br /><span><strong data-en="Protocol + Runtime. Zero enforcement." data-es="Protocolo + Runtime. Sin coacci&oacute;n." >Protocol + Runtime. Zero enforcement.</strong ></span></p></header><section class="section"><h2 class="section-title"><span data-en="The 6 Problems It Solves" data-es="Los 6 Problemas que Resuelve" >The 6 Problems It Solves</span ></h2><div class="problems-grid"><div class="problem-card"><div class="problem-number">01</div><h3 data-en="Decisions Without Memory" data-es="Decisiones Sin Memoria" > Decisions Without Memory </h3><ul data-en="<li>Architectural choices made in chat, forgotten after rotation</li><li>No machine-queryable source of why something exists</li><li>ADRs as typed Nickel: invariants, constraints, supersession chain</li><li>Hard constraints enforced at every operation</li>" data-es="<li>Decisiones arquitectónicas en chat, olvidadas tras rotación</li><li>Sin fuente consultable por máquina de por qué algo existe</li><li>ADRs como Nickel tipado: invariantes, constraints, cadena de supersedencia</li><li>Constraints Hard aplicadas en cada operación</li>" ><li> Architectural choices made in chat, forgotten after rotation </li><li>No machine-queryable source of why something exists</li><li> ADRs as typed Nickel: invariants, constraints, supersession chain </li><li>Hard constraints enforced at every operation</li></ul></div><div class="problem-card"><div class="problem-number">02</div><h3 data-en="Invisible Configuration Drift" data-es="Drift de Configuraci&oacute;n Invisible" > Invisible Configuration Drift </h3><ul data-en="<li>Configs change outside any review cycle</li><li>No audit trail linking change to PR or ADR</li><li>Rollback requires manual file archaeology</li><li>Sealed profiles: sha256 hash, full history, verified rollback</li>" data-es="<li>Configs cambian fuera de cualquier ciclo de revisión</li><li>Sin trazabilidad que vincule cambio a PR o ADR</li><li>Rollback requiere arqueología manual de ficheros</li><li>Perfiles sellados: hash sha256, historia completa, rollback verificado</li>" ><li>Configs change outside any review cycle</li><li>No audit trail linking change to PR or ADR</li><li>Rollback requires manual file archaeology</li><li> Sealed profiles: sha256 hash, full history, verified rollback </li></ul></div><div class="problem-card"><div class="problem-number">03</div><h3 data-en="Agents Without Context" data-es="Agentes Sin Contexto"> Agents Without Context </h3><ul data-en="<li>LLMs start each session with zero project knowledge</li><li>Same mistakes, same questions, no accumulation across operations</li><li>Actor registry tracks each session token, type, current mode, last seen — persisted to disk</li><li>MCP tools give agents direct DAG read/write: nodes, ADRs, backlog, Q&amp;A</li><li>Composed tasks shared via daemon — multiple actors see the same operational context live</li>" data-es="<li>Los LLMs empiezan cada sesión con cero conocimiento del proyecto</li><li>Mismos errores, mismas preguntas, sin acumulación entre operaciones</li><li>El registro de actores rastrea cada token de sesión, tipo, modo actual, último visto — persistido en disco</li><li>Las herramientas MCP dan a los agentes acceso DAG de lectura/escritura directo: nodos, ADRs, backlog, Q&amp;A</li><li>Tareas compuestas compartidas via daemon — múltiples actores ven el mismo contexto operacional en vivo</li>" ><li>LLMs start each session with zero project knowledge</li><li> Same mistakes, same questions, no accumulation across operations </li><li> Actor registry tracks each session token, type, current mode, last seen — persisted to disk </li><li> MCP tools give agents direct DAG read/write: nodes, ADRs, backlog, Q&amp;A </li><li> Composed tasks shared via daemon — multiple actors see the same operational context live </li></ul></div><div class="problem-card"><div class="problem-number">04</div><h3 data-en="Scattered Project Knowledge" data-es="Conocimiento de Proyecto Disperso" > Scattered Project Knowledge </h3><ul data-en="<li>Guidelines in wikis, patterns in docs, decisions in Slack</li><li>No single source queryable by humans, agents, and CI equally</li><li>.ontology/ as DAG: nodes, edges, invariants, tensions, gates</li><li>Same graph serves developer context, agent initialization, CI validation</li>" data-es="<li>Gu&iacute;as en wikis, patrones en docs, decisiones en Slack</li><li>Sin fuente única consultable por humanos, agentes y CI por igual</li><li>.ontology/ como DAG: nodos, aristas, invariantes, tensiones, gates</li><li>El mismo grafo sirve contexto de desarrollador, inicialización de agente, validación de CI</li>" ><li>Guidelines in wikis, patterns in docs, decisions in Slack</li><li> No single source queryable by humans, agents, and CI equally </li><li><code>.ontology/</code> as DAG: nodes, edges, invariants, tensions, gates </li><li> Same graph serves developer context, agent initialization, CI validation </li></ul></div><div class="problem-card"><div class="problem-number">05</div><h3 data-en="Protocol Fragmentation" data-es="Fragmentaci&oacute;n de Protocolo" > Protocol Fragmentation </h3><ul data-en="<li>Each project re-invents its own conventions</li><li>No shared contract for how operations are defined and executed</li><li>Reflection modes: typed DAG contracts for any workflow</li><li>One protocol adopted per-project, without enforcing uniformity</li>" data-es="<li>Cada proyecto reinventa sus propias convenciones</li><li>Sin contrato compartido para c&oacute;mo se definen y ejecutan las operaciones</li><li>Modos de reflexi&oacute;n: contratos DAG tipados para cualquier flujo</li><li>Un protocolo adoptado por proyecto, sin imponer uniformidad</li>" ><li>Each project re-invents its own conventions</li><li> No shared contract for how operations are defined and executed </li><li>Reflection modes: typed DAG contracts for any workflow</li><li> One protocol adopted per-project, without enforcing uniformity </li></ul></div><div class="problem-card"><div class="problem-number">06</div><h3 data-en="Knowledge Lost Between Sessions" data-es="Conocimiento Perdido Entre Sesiones" > Knowledge Lost Between Sessions </h3><ul data-en="<li>Q&amp;A answered in one session forgotten by the next</li><li>Agent re-asks questions already answered in previous sessions</li><li>Q&amp;A Knowledge Store: typed NCL, git-versioned, persists across browser resets</li><li>Notification barrier surfaces drift to agents proactively — pre_commit, drift, ontology_drift signals block until acknowledged</li>" data-es="<li>Q&amp;A respondido en una sesión olvidado en la siguiente</li><li>El agente repite preguntas ya respondidas en sesiones anteriores</li><li>Q&amp;A Knowledge Store: NCL tipado, versionado en git, persiste a través de resets del navegador</li><li>La barrera de notificaciones transmite drift a los agentes de forma proactiva — señales pre_commit, drift, ontology_drift bloquean hasta ser reconocidas</li>" ><li>Q&amp;A answered in one session forgotten by the next</li><li> Agent re-asks questions already answered in previous sessions </li><li> Q&amp;A Knowledge Store: typed NCL, git-versioned, persists across browser resets </li><li> Notification barrier surfaces drift to agents proactively — <code>pre_commit</code>, <code>drift</code>, <code>ontology_drift</code> signals block until acknowledged </li></ul></div></div></section><section class="section"><h2 class="section-title"><span data-en="Ontology &amp; Reflection — Yin and Yang" data-es="Ontolog&iacute;a y Reflexi&oacute;n — Yin y Yang" >Ontology &amp; Reflection — Yin and Yang</span ></h2><div class="yin-yang"><div class="yin-yang-card yin"><h3 data-en="Yin — The Ontology Layer" data-es="Yin — La Capa de Ontolog&iacute;a" > Yin — The Ontology Layer </h3><p class="sub" data-en="What must be true" data-es="Lo que debe ser verdad" > What must be true </p><ul data-en="<li><strong>Invariants</strong> — axioms that cannot change without a new ADR</li><li><strong>Tensions</strong> — structural conflicts the project navigates, never resolves</li><li><strong>Practices</strong> — confirmed patterns with artifact paths to real files</li><li><strong>Gates</strong> — membranes controlling readiness thresholds</li><li><strong>Dimensions</strong> — current vs desired state, with transition conditions</li><li><strong>Q&amp;A Knowledge Store</strong> — accumulated Q&amp;A persisted to NCL, git-versioned, queryable by any actor</li>" data-es="<li><strong>Invariantes</strong> — axiomas que no pueden cambiar sin un nuevo ADR</li><li><strong>Tensiones</strong> — conflictos estructurales que el proyecto navega, nunca resuelve</li><li><strong>Prácticas</strong> — patrones confirmados con rutas a archivos reales</li><li><strong>Gates</strong> — membranas que controlan umbrales de preparación</li><li><strong>Dimensiones</strong> — estado actual vs deseado, con condiciones de transición</li><li><strong>Q&amp;A Knowledge Store</strong> — Q&amp;A acumulado persistido en NCL, versionado en git, consultable por cualquier actor</li>" ><li><strong>Invariants</strong> — axioms that cannot change without a new ADR </li><li><strong>Tensions</strong> — structural conflicts the project navigates, never resolves </li><li><strong>Practices</strong> — confirmed patterns with artifact paths to real files </li><li><strong>Gates</strong> — membranes controlling readiness thresholds </li><li><strong>Dimensions</strong> — current vs desired state, with transition conditions </li><li><strong>Q&amp;A Knowledge Store</strong> — accumulated Q&amp;A persisted to NCL, git-versioned, queryable by any actor </li></ul></div><div class="yin-yang-card yang"><h3 data-en="Yang — The Reflection Layer" data-es="Yang — La Capa de Reflexi&oacute;n" > Yang — The Reflection Layer </h3><p class="sub" data-en="How things move and change" data-es="C&oacute;mo las cosas se mueven y cambian" > How things move and change </p><ul data-en="<li><strong>Modes</strong> — typed DAG workflow contracts (preconditions, steps, postconditions)</li><li><strong>Forms</strong> — parameter collection driving modes</li><li><strong>ADR lifecycle</strong> — Proposed → Accepted → Superseded, with constraint history</li><li><strong>Actors</strong> — developer / agent / CI, same protocol, different capabilities</li><li><strong>Config seals</strong> — sha256-sealed profiles, drift detection, rollback</li><li><strong>Quick Actions</strong> — runnable shortcuts over modes; configured in <code>.ontoref/config.ncl</code></li><li><strong>Passive Drift Observer</strong> — watches code changes, emits <code>ontology_drift</code> notifications with missing/stale/drift/broken counts</li>" data-es="<li><strong>Modos</strong> — contratos DAG tipados de flujo (precondiciones, pasos, postcondiciones)</li><li><strong>Formularios</strong> — recolección de parámetros que conducen modos</li><li><strong>Ciclo de vida ADR</strong> — Proposed → Accepted → Superseded, con historial de constraints</li><li><strong>Actores</strong> — developer / agent / CI, mismo protocolo, distintas capacidades</li><li><strong>Config seals</strong> — perfiles sellados con sha256, drift detection, rollback</li><li><strong>Quick Actions</strong> — atajos ejecutables sobre modos; configurados en <code>.ontoref/config.ncl</code></li><li><strong>Observador de Drift Pasivo</strong> — observa cambios de código, emite notificaciones <code>ontology_drift</code> con conteos de missing/stale/drift/broken</li>" ><li><strong>Modes</strong> — typed DAG workflow contracts (preconditions, steps, postconditions) </li><li><strong>Forms</strong> — parameter collection driving modes </li><li><strong>ADR lifecycle</strong> — Proposed → Accepted → Superseded, with constraint history </li><li><strong>Actors</strong> — developer / agent / CI, same protocol, different capabilities </li><li><strong>Config seals</strong> — sha256-sealed profiles, drift detection, rollback </li><li><strong>Quick Actions</strong> — runnable shortcuts over modes; configured in <code>.ontoref/config.ncl</code></li><li><strong>Passive Drift Observer</strong> — watches code changes, emits <code>ontology_drift</code> notifications with missing/stale/drift/broken counts </li></ul></div></div><div class="tension-box"><span data-en="Ontology without Reflection = correct but static. Perfect invariants with no operations = dead documentation." data-es="Ontolog&iacute;a sin Reflexi&oacute;n = correcta pero est&aacute;tica. Invariantes perfectos sin operaciones = documentaci&oacute;n muerta." >Ontology without Reflection = correct but static. Perfect invariants with no operations = dead documentation.</span ><br /><span data-en="Reflection without Ontology = fluid but unanchored. Workflows that forget what they protect." data-es="Reflexi&oacute;n sin Ontolog&iacute;a = fluida pero sin ancla. Flujos que olvidan lo que protegen." >Reflection without Ontology = fluid but unanchored. Workflows that forget what they protect.</span ><p class="tension-thesis" data-en="The protocol lives in coexistence." data-es="El protocolo vive en la coexistencia." > The protocol lives in coexistence. </p></div><div class="layers-stack"><div class="layer-card layer-decl"><div class="layer-label" data-en="DECLARATIVE LAYER · Nickel" data-es="CAPA DECLARATIVA · Nickel" > DECLARATIVE LAYER · Nickel </div><div class="layer-items"><code>.ontology/</code> · <code>adrs/</code> · <code>reflection/schemas/</code></div><div class="layer-desc" data-en="Strong types, contracts, enums. Fails at definition time, not at runtime." data-es="Tipos fuertes, contratos, enums. Falla en definici&oacute;n, no en runtime." > Strong types, contracts, enums. Fails at definition time, not at runtime. </div></div><div class="layer-card layer-op"><div class="layer-label" data-en="OPERATIONAL LAYER · Nushell" data-es="CAPA OPERACIONAL · Nushell" > OPERATIONAL LAYER · Nushell </div><div class="layer-items"><code>adr</code> · <code>register</code> · <code>config</code> · <code>backlog</code> · <code>forms</code> · <code>describe</code></div><div class="layer-desc" data-en="Typed pipelines over structured data. No text streams." data-es="Pipelines tipadas sobre datos estructurados. No streams de texto." > Typed pipelines over structured data. No text streams. </div></div><div class="layer-card layer-entry"><div class="layer-label" data-en="ENTRY POINT · Bash → Nu" data-es="PUNTO DE ENTRADA · Bash → Nu" > ENTRY POINT · Bash → Nu </div><div class="layer-items"><code>ontoref</code> · actor detection · advisory locking · <code>ONTOREF_IMPORT_PATH</code></div><div class="layer-desc" data-en="Single entry point per project. Detects actor (developer/agent/CI), acquires lock, dispatches to correct Nu module." data-es="Un &uacute;nico entry point por proyecto. Detecta actor (developer/agent/CI), adquiere lock, despacha al m&oacute;dulo Nu correcto." > Single entry point per project. Detects actor (developer/agent/CI), acquires lock, dispatches to correct Nu module. </div></div><div class="layer-card layer-graph"><div class="layer-label" data-en="KNOWLEDGE GRAPH · .ontology/" data-es="GRAFO DE CONOCIMIENTO · .ontology/" > KNOWLEDGE GRAPH · .ontology/ </div><div class="layer-items"> nodes · invariants · tensions · gates · dimensions · states </div><div class="layer-desc" data-en="The project knows what it knows. Actor-agnostic. Machine-queryable via nickel export." data-es="El proyecto sabe qu&eacute; sabe. Actor-agnostic. Consultable por m&aacute;quina v&iacute;a nickel export." > The project knows what it knows. Actor-agnostic. Machine-queryable via <code>nickel export</code>. </div></div><div class="layer-card layer-runtime"><div class="layer-label" data-en="RUNTIME LAYER · Rust + axum" data-es="CAPA RUNTIME · Rust + axum" > RUNTIME LAYER · Rust + axum </div><div class="layer-items"><code>ontoref-daemon</code> · <code>ontoref-ontology</code> · <code>ontoref-reflection</code> · <code>search engine</code> · <code>notification barrier</code> · <code>SurrealDB (optional)</code></div><div class="layer-desc" data-en="Optional persistent daemon. NCL export cache, HTTP UI (12 pages), MCP server (19 tools), actor registry, notification store, search engine, SurrealDB persistence. Never a protocol requirement." data-es="Daemon persistente opcional. Cach&eacute; de exports NCL, UI HTTP (12 p&aacute;ginas), servidor MCP (19 herramientas), registro de actores, almac&eacute;n de notificaciones, motor de b&uacute;squeda, persistencia SurrealDB. Nunca un requisito del protocolo." > Optional persistent daemon. NCL export cache, HTTP UI (12 pages), MCP server (19 tools), actor registry, notification store, search engine, SurrealDB persistence. Never a protocol requirement. </div></div><div class="layer-card layer-adopt"><div class="layer-label" data-en="ADOPTION LAYER · Per-project" data-es="CAPA DE ADOPCI&Oacute;N · Por proyecto" > ADOPTION LAYER · Per-project </div><div class="layer-items"><code>.ontoref/config.ncl</code> · <code>ontoref</code> CLI · <code>adopt_ontoref</code> mode </div><div class="layer-desc" data-en="Each project maintains its own .ontology/ data. Ontoref provides the schemas, modules, and migration scripts. Zero lock-in." data-es="Cada proyecto mantiene sus propios datos de .ontology/. Ontoref provee los schemas, m&oacute;dulos y scripts de migraci&oacute;n. Cero vendor lock-in." > Each project maintains its own <code>.ontology/</code> data. Ontoref provides the schemas, modules, and migration scripts. Zero lock-in. </div></div></div></section><section class="section"><h2 class="section-title"><span data-en="Crates &amp; Tooling" data-es="Crates y Herramientas" >Crates &amp; Tooling</span ></h2><div class="features-grid" style="grid-template-columns: repeat(auto-fit, minmax(280px, 1fr))" ><div class="feature-box"><div class="feature-icon">&#x1F9E9;</div><h3 class="feature-title">ontoref-ontology</h3><ul class="feature-text"><li> Load and query <code>.ontology/</code> NCL files as typed Rust structs </li><li>Node, Edge, Dimension, Gate, Membrane types</li><li>Graph traversal: callers, callees, impact queries</li><li>Invariant extraction and constraint validation</li><li> Zero stratumiops dependencies — minimal adoption surface (ADR-001) </li></ul></div><div class="feature-box" style="border-left-color: #f97316"><div class="feature-icon">&#x1F504;</div><h3 class="feature-title" style="color: #f97316"> ontoref-reflection </h3><ul class="feature-text"><li>Execute reflection modes as typed NCL DAG contracts</li><li>Step execution with dependency resolution</li><li>ADR lifecycle: Proposed → Accepted → Superseded</li><li>Config seal and rollback operations</li><li><code>stratum-graph</code> + <code>stratum-state</code> required; <code>platform-nats</code> feature-gated </li></ul></div><div class="feature-box" style="border-left-color: #4ade80"><div class="feature-icon">&#x1F4DC;</div><h3 class="feature-title" style="color: #4ade80"> Nushell Modules </h3><ul class="feature-text"><li><code>store.nu</code> — SurrealDB-backed cache with NCL export </li><li><code>sync.nu</code> — ontology code synchronization</li><li><code>describe.nu</code> — actor-aware project self-knowledge </li><li><code>coder.nu</code> — structured session records</li><li>16 modules total — one per operational domain</li></ul></div><div class="feature-box" style="border-left-color: #c084fc"><div class="feature-icon">&#x2699;&#xFE0F;</div><h3 class="feature-title" style="color: #c084fc">Nickel Schemas</h3><ul class="feature-text"><li>Core ontology types: Node, Edge, Pole, AbstractionLevel</li><li> State machine types: Dimension, Transition, Gate, Membrane </li><li>ADR schema: Constraint, Severity, Status, supersession</li><li>Reflection schema: Mode, Step, OnError, Dependency</li></ul></div><div class="feature-box" style=" border-left-color: #e8a838; background: linear-gradient( 135deg, rgba(232, 168, 56, 0.08) 0%, rgba(232, 168, 56, 0.04) 100% ); " ><div class="feature-icon">&#x1F5A5;&#xFE0F;</div><h3 class="feature-title" style="color: #e8a838"> ontoref-daemon · HTTP &amp; UI </h3><ul class="feature-text"><li> HTTP UI (axum + Tera): <strong>12 pages</strong> — dashboard, D3 graph, search, sessions, notifications, backlog, Q&amp;A, actions, modes, compose, manage/login, manage/logout </li><li> Actor registry (DashMap): token, type (developer / agent / CI), registered_at, last_seen, current_mode — serializable snapshot </li><li> Notification barrier: <code>pre_commit</code> · <code>drift</code> · <code>ontology_drift</code> — pre-commit hook polls &amp; blocks on ack </li><li> Compose / live sharing: mode forms rendered interactively, <code>./ontoref</code> dispatched server-side, shared across actors </li><li> File watcher (<code>notify</code>): passive drift observer, no polling </li></ul></div><div class="feature-box" style=" border-left-color: #34d399; background: linear-gradient( 135deg, rgba(52, 211, 153, 0.07) 0%, rgba(52, 211, 153, 0.03) 100% ); " ><div class="feature-icon">&#x26A1;</div><h3 class="feature-title" style="color: #34d399"> ontoref-daemon · MCP &amp; Data </h3><ul class="feature-text"><li> MCP server: stdio + streamable-HTTP, <strong>19 tools</strong> — nodes, ADRs, modes, backlog, Q&amp;A, sessions, search, notifications </li><li> Search engine: full-text across nodes / ADRs / reflection modes — returns kind · id · title · snippet · score </li><li> SurrealDB persistence (optional <code>--db</code>): actor sessions, seeded ontology tables, search index, notification history — fail-open </li><li> NCL export cache: avoids repeated <code>nickel export</code> on unchanged files </li><li><code>db</code> + <code>nats</code> feature flags — builds standalone with <code>--no-default-features</code></li></ul></div></div><div class="adopt-section"><h3 class="adopt-title" data-en="Adopt in Any Project" data-es="Adoptar en Cualquier Proyecto" > Adopt in Any Project </h3><p class="adopt-subtitle" data-en="ontoref setup wires up any new or existing project — idempotent scaffold with optional auth key bootstrap." data-es="ontoref setup conecta cualquier proyecto nuevo o existente — scaffold idempotente con bootstrap de auth keys opcional." ><code>ontoref setup</code> wires up any new or existing project — idempotent scaffold with optional auth key bootstrap. </p><div class="adopt-grid"><div class="adopt-item"><span class="component-name">stratumiops</span><span class="component-role">Master orchestration repo</span></div><div class="adopt-item"><span class="component-name">vapora</span><span class="component-role">AI agent orchestration</span></div><div class="adopt-item"><span class="component-name">kogral</span><span class="component-role">Knowledge graph + MCP</span></div><div class="adopt-item"><span class="component-name">syntaxis</span><span class="component-role">Project orchestration</span></div><div class="adopt-item"><span class="component-name">provisioning</span><span class="component-role">Declarative IaC</span></div><div class="adopt-item"><span class="component-name">your-project</span><span class="component-role">Any codebase</span></div></div></div><div class="code-block"><span class="cmt" ># Onboard a new project (idempotent; kind: Service by default)</span ><br /><span class="kw">ontoref</span><span class="str">setup</span><br /><span class="kw">ontoref</span><span class="str">setup</span> --kind Library<br /><span class="kw">ontoref</span><span class="str">setup</span> --gen-keys <span class="str">["admin:dev" "viewer:ci"]</span><span class="cmt"># bootstrap auth keys once</span><br /><br /><span class="cmt"># Query the project self-knowledge</span><br /><span class="kw">ontoref</span> describe project<br /><span class="kw">ontoref</span> describe constraints<br /><span class="kw">ontoref</span> describe impact ontology-node-id<br /><br /><span class="cmt"># ADR lifecycle</span><br /><span class="kw">ontoref</span> adr new --title <span class="str">"Adopt Nickel for configuration"</span><br /><span class="kw">ontoref</span> adr list --status Accepted </div></section><section class="section"><h2 class="section-title"><span data-en="Daemon &amp; MCP — Runtime Intelligence Layer" data-es="Daemon &amp; MCP — Capa de Inteligencia en Tiempo de Ejecuci&oacute;n" >Daemon &amp; MCP — Runtime Intelligence Layer</span ></h2><p style=" color: #94a3b8; margin-bottom: 2rem; font-size: 0.95rem; line-height: 1.7; " data-en="ontoref-daemon is an optional persistent process. It caches NCL exports, serves 12 UI pages, exposes 19 MCP tools, maintains an actor registry, stores notifications, indexes everything for search, and optionally persists to SurrealDB. Auth is opt-in: all surfaces (CLI, UI, MCP) exchange a project key for a UUID v4 session token via <code>POST /sessions</code>; CLI injects <code>ONTOREF_TOKEN</code> as Bearer automatically. It never changes the protocol — it accelerates and shares access to it. Configured via <code>~/.config/ontoref/config.ncl</code> (Nickel, type-checked); edit interactively with <code>ontoref config-edit</code>. Started via NCL pipe bootstrap: <code>ontoref-daemon-boot</code>." data-es="ontoref-daemon es un proceso persistente opcional. Cachea exports NCL, sirve 12 páginas de UI, expone 19 herramientas MCP, mantiene un registro de actores, almacena notificaciones, indexa todo para búsqueda y opcionalmente persiste en SurrealDB. Auth es opt-in: todas las superficies (CLI, UI, MCP) intercambian una project key por un token de sesión UUID v4 via <code>POST /sessions</code>; la CLI inyecta <code>ONTOREF_TOKEN</code> como Bearer automáticamente. Nunca cambia el protocolo — acelera y comparte el acceso a él. Configurado via <code>~/.config/ontoref/config.ncl</code> (Nickel, type-checked); edición interactiva con <code>ontoref config-edit</code>. Iniciado via NCL pipe bootstrap: <code>ontoref-daemon-boot</code>." ><code>ontoref-daemon</code> is an optional persistent process. It caches NCL exports, serves 12 UI pages, exposes 19 MCP tools, maintains an actor registry, stores notifications, indexes everything for search, and optionally persists to SurrealDB. Auth is opt-in: all surfaces (CLI, UI, MCP) exchange a project key for a UUID v4 session token via <code>POST /sessions</code>; CLI injects <code>ONTOREF_TOKEN</code> as Bearer automatically. It never changes the protocol — it accelerates and shares access to it. Configured via <code>~/.config/ontoref/config.ncl</code> (Nickel, type-checked); edit interactively with <code>ontoref config-edit</code>. Started via NCL pipe bootstrap: <code>ontoref-daemon-boot</code>. </p><div class="daemon-cols"><div><div class="daemon-col-title" data-en="The Web UI — 12 Pages" data-es="La UI Web — 12 P&aacute;ginas" > The Web UI — 12 Pages </div><div class="window-mockup"><div class="window-titlebar"><span class="window-dot red"></span><span class="window-dot yellow"></span><span class="window-dot green"></span><span>localhost:7421/ui/{slug}/</span></div><div class="window-nav"><span class="window-nav-tab active">Dashboard</span><span class="window-nav-tab">Graph</span><span class="window-nav-tab">Search</span><span class="window-nav-tab">Sessions</span><span class="window-nav-tab">Notif</span><span class="window-nav-tab">Backlog</span><span class="window-nav-tab">Q&amp;A</span><span class="window-nav-tab">Actions</span><span class="window-nav-tab">Modes</span><span class="window-nav-tab">Compose</span></div><div class="window-body"><div class="window-page-row"><span class="window-page-route">/</span><span class="window-page-name">Dashboard</span><span class="window-page-desc" >project overview, actor count, cache stats, notification count, backlog summary</span ></div><div class="window-page-row"><span class="window-page-route">/graph</span><span class="window-page-name">Graph</span><span class="window-page-desc" >D3 force-directed ontology graph — nodes colored by pole (Yang=orange, Yin=blue, Spiral=purple), clickable with detail panel, edge labels</span ></div><div class="window-page-row"><span class="window-page-route">/search</span><span class="window-page-name">Search</span><span class="window-page-desc" >full-text search across nodes, ADRs, reflection modes — returns kind/id/title/snippet/score</span ></div><div class="window-page-row"><span class="window-page-route">/sessions</span><span class="window-page-name">Sessions</span><span class="window-page-desc" >live actor registry — actor type, mode, last_seen; auth sessions (id, role, key_label, expires) for authed deployments</span ></div><div class="window-page-row"><span class="window-page-route">/notifications</span><span class="window-page-name">Notifications</span><span class="window-page-desc" >notification feed — pre_commit / drift / ontology_drift; ack/dismiss; emit custom; action buttons</span ></div><div class="window-page-row"><span class="window-page-route">/backlog</span><span class="window-page-name">Backlog</span><span class="window-page-desc" >items with priority (Critical/High/Medium/Low) and status (Open/InProgress/Done/Cancelled); add/update</span ></div><div class="window-page-row"><span class="window-page-route">/qa</span><span class="window-page-name">Q&amp;A</span><span class="window-page-desc" >server-hydrated from reflection/qa.ncl; add/edit/delete; persisted as typed NCL</span ></div><div class="window-page-row"><span class="window-page-route">/actions</span><span class="window-page-name">Actions</span><span class="window-page-desc" >quick actions catalog from .ontoref/config.ncl; execute via POST /actions/run</span ></div><div class="window-page-row"><span class="window-page-route">/modes</span><span class="window-page-name">Modes</span><span class="window-page-desc" >reflection mode list from reflection/modes/ — name, description, DAG contract</span ></div><div class="window-page-row"><span class="window-page-route">/compose</span><span class="window-page-name">Compose</span><span class="window-page-desc" >agent task composer — renders mode forms interactively; POST /compose/send dispatches to ./ontoref; live sharing for AI actors</span ></div></div></div></div><div><div class="daemon-col-title" data-en="The MCP Server — 19 Tools" data-es="El Servidor MCP — 19 Herramientas" > The MCP Server — 19 Tools </div><div class="mcp-table-wrap"><table class="mcp-table"><thead><tr><th data-en="Tool" data-es="Herramienta">Tool</th><th data-en="Description" data-es="Descripci&oacute;n"> Description </th></tr></thead><tbody><tr><td>ontoref_help</td><td data-en="List available tools and usage" data-es="Lista herramientas disponibles y uso" > List available tools and usage </td></tr><tr><td>ontoref_list_projects</td><td data-en="Enumerate all registered projects" data-es="Enumerar todos los proyectos registrados" > Enumerate all registered projects </td></tr><tr><td>ontoref_set_project</td><td data-en="Set session default project context" data-es="Establecer contexto de proyecto por defecto" > Set session default project context </td></tr><tr><td>ontoref_project_status</td><td data-en="Full project dashboard — health, drift, actors" data-es="Dashboard completo del proyecto — salud, drift, actores" > Full project dashboard — health, drift, actors </td></tr><tr><td>ontoref_describe</td><td data-en="Architecture overview and self-description" data-es="Resumen de arquitectura y auto-descripci&oacute;n" > Architecture overview and self-description </td></tr><tr><td>ontoref_search</td><td data-en="Free-text search across nodes, ADRs, modes" data-es="B&uacute;squeda de texto libre en nodos, ADRs, modos" > Free-text search across nodes, ADRs, modes </td></tr><tr><td>ontoref_get</td><td data-en="Fetch ontology node by id" data-es="Obtener nodo de ontolog&iacute;a por id" > Fetch ontology node by id </td></tr><tr><td>ontoref_get_node</td><td data-en="Full ontology node with edges and constraints" data-es="Nodo completo con aristas y constraints" > Full ontology node with edges and constraints </td></tr><tr><td>ontoref_list_adrs</td><td data-en="List ADRs filtered by status" data-es="Listar ADRs filtrados por estado" > List ADRs filtered by status </td></tr><tr><td>ontoref_get_adr</td><td data-en="Full ADR content with constraints" data-es="Contenido completo de ADR con constraints" > Full ADR content with constraints </td></tr><tr><td>ontoref_list_modes</td><td data-en="List all reflection modes" data-es="Listar todos los modos de reflexi&oacute;n" > List all reflection modes </td></tr><tr><td>ontoref_get_mode</td><td data-en="Mode DAG contract — steps, preconditions, postconditions" data-es="Contrato DAG del modo — pasos, pre/postcondiciones" > Mode DAG contract — steps, preconditions, postconditions </td></tr><tr><td>ontoref_get_backlog</td><td data-en="Backlog items filtered by status" data-es="Elementos de backlog filtrados por estado" > Backlog items filtered by status </td></tr><tr><td>ontoref_backlog</td><td data-en="Add or update_status on a backlog item" data-es="A&ntilde;adir o actualizar estado de elemento del backlog" > Add or update_status on a backlog item </td></tr><tr><td>ontoref_constraints</td><td data-en="All hard + soft architectural constraints" data-es="Todos los constraints arquitect&oacute;nicos hard + soft" > All hard + soft architectural constraints </td></tr><tr><td>ontoref_qa_list</td><td data-en="List Q&amp;A knowledge store with optional filter" data-es="Listar almac&eacute;n Q&amp;A con filtro opcional" > List Q&amp;A knowledge store with optional filter </td></tr><tr><td>ontoref_qa_add</td><td data-en="Persist new Q&amp;A entry to reflection/qa.ncl" data-es="Persistir nueva entrada Q&amp;A en reflection/qa.ncl" > Persist new Q&amp;A entry to reflection/qa.ncl </td></tr><tr><td>ontoref_action_list</td><td data-en="Quick actions catalog from .ontoref/config.ncl" data-es="Cat&aacute;logo de acciones r&aacute;pidas de .ontoref/config.ncl" > Quick actions catalog from .ontoref/config.ncl </td></tr><tr><td>ontoref_action_add</td><td data-en="Create reflection mode + register as quick action" data-es="Crear modo de reflexi&oacute;n + registrar como acci&oacute;n r&aacute;pida" > Create reflection mode + register as quick action </td></tr></tbody></table></div></div></div><div class="info-boxes"><div class="info-box box-teal"><h4 data-en="SurrealDB Persistence — Optional" data-es="Persistencia SurrealDB — Opcional" > SurrealDB Persistence — Optional </h4><ul data-en="<li>Enabled with <code>--db</code> feature flag and <code>--db-url ws://...</code></li><li>Connects via WebSocket at startup — 5s timeout, <strong>fail-open</strong> (daemon runs without it)</li><li>Seeds ontology tables from local NCL files on startup and on file changes</li><li>Persists: actor sessions, seeded ontology tables, search index, notification history</li><li>Without <code>--db</code>: DashMap-backed in-memory, process-lifetime only</li><li>Namespace configurable via <code>--db-namespace</code>; credentials via <code>--db-username/--db-password</code></li>" data-es="<li>Habilitado con flag de feature <code>--db</code> y <code>--db-url ws://...</code></li><li>Conecta v&iacute;a WebSocket al inicio — 5s timeout, <strong>fail-open</strong> (el daemon funciona sin &eacute;l)</li><li>Siembra tablas de ontolog&iacute;a desde archivos NCL locales al inicio y en cambios de fichero</li><li>Persiste: sesiones de actores, tablas de ontolog&iacute;a sembradas, &iacute;ndice de b&uacute;squeda, historial de notificaciones</li><li>Sin <code>--db</code>: respaldado por DashMap en memoria, solo durante el proceso</li><li>Namespace configurable v&iacute;a <code>--db-namespace</code>; credenciales v&iacute;a <code>--db-username/--db-password</code></li>" ><li> Enabled with <code>--db</code> feature flag and <code>--db-url ws://...</code></li><li> Connects via WebSocket at startup — 5s timeout, <strong>fail-open</strong> (daemon runs without it) </li><li> Seeds ontology tables from local NCL files on startup and on file changes </li><li> Persists: actor sessions, seeded ontology tables, search index, notification history </li><li> Without <code>--db</code>: DashMap-backed in-memory, process-lifetime only </li><li> Namespace configurable via <code>--db-namespace</code>; credentials via <code>--db-username/--db-password</code></li></ul></div><div class="info-box box-orange"><h4 data-en="Notification Barrier" data-es="Barrera de Notificaciones" > Notification Barrier </h4><ul data-en="<li><strong>pre_commit</strong> — pre-commit hook POLLs <code>GET /notifications/pending?token=X&amp;project=Y</code>; blocks git commit until all acked</li><li><strong>drift</strong> — schema drift detected between codebase and ontology</li><li><strong>ontology_drift</strong> — emitted by passive observer with missing/stale/drift/broken counts after 15s debounce</li><li>Fail-open: if daemon is unreachable, pre-commit hook passes — commits are never blocked by daemon downtime</li><li>Ack via UI or <code>POST /notifications/ack</code>; custom notifications via <code>POST /{slug}/notifications/emit</code></li><li>Action buttons in notifications can link to any dashboard page</li>" data-es="<li><strong>pre_commit</strong> — el hook pre-commit hace POLL en <code>GET /notifications/pending?token=X&amp;project=Y</code>; bloquea el commit git hasta que todo es reconocido</li><li><strong>drift</strong> — drift de schema detectado entre codebase y ontolog&iacute;a</li><li><strong>ontology_drift</strong> — emitido por el observador pasivo con conteos missing/stale/drift/broken tras 15s debounce</li><li>Fail-open: si el daemon no est&aacute; disponible, el hook pre-commit pasa — los commits nunca son bloqueados por ca&iacute;da del daemon</li><li>Ack v&iacute;a UI o <code>POST /notifications/ack</code>; notificaciones custom v&iacute;a <code>POST /{slug}/notifications/emit</code></li><li>Los botones de acci&oacute;n en notificaciones pueden enlazar a cualquier p&aacute;gina del dashboard</li>" ><li><strong>pre_commit</strong> — pre-commit hook polls <code>GET /notifications/pending?token=X&amp;project=Y</code>; blocks git commit until all acked </li><li><strong>drift</strong> — schema drift detected between codebase and ontology </li><li><strong>ontology_drift</strong> — emitted by passive observer with missing/stale/drift/broken counts after 15s debounce </li><li> Fail-open: if daemon is unreachable, pre-commit hook passes — commits are never blocked by daemon downtime </li><li> Ack via UI or <code>POST /notifications/ack</code>; custom notifications via <code>POST /{slug}/notifications/emit</code></li><li> Action buttons in notifications can link to any dashboard page </li></ul></div></div><div class="code-block" style="margin-top: 2rem"><span class="cmt" ># Configure and start the daemon (optional — protocol works without it)</span ><br /><span class="kw">ontoref</span> config-edit<span class="cmt"> # browser form → ~/.config/ontoref/config.ncl</span ><br /><span class="kw">ontoref-daemon-boot</span ><span class="cmt"> # NCL pipe bootstrap: nickel export config.ncl | daemon --config-stdin</span ><br /><span class="kw">ontoref-daemon-boot</span> --dry-run<span class="cmt" > # preview composed JSON without starting</span ><br /><span class="cmt"># With SOPS-encrypted secrets merged at boot</span ><br /><span class="kw">ontoref-daemon-boot</span> --sops <span class="str">secrets.enc.json</span><br /><br /><span class="cmt" ># Connect Claude Code via MCP (add to .claude/mcp.json)</span ><br /><span class="key">{</span><br /> &nbsp;&nbsp;<span class="str">"mcpServers"</span>: <span class="key">{</span><br /> &nbsp;&nbsp;&nbsp;&nbsp;<span class="str">"ontoref"</span>: <span class="key">{</span><span class="str">"type"</span>: <span class="str">"http"</span>, <span class="str">"url"</span>: <span class="str">"http://localhost:7421/mcp"</span><span class="key">}</span><br /> &nbsp;&nbsp;<span class="key">}</span><br /><span class="key">}</span><br /><br /><span class="cmt" ># Search across ontology nodes, ADRs, and reflection modes</span ><br /><span class="kw">ontoref_search</span>({ <span class="key">q</span>: <span class="str">"notification drift"</span>, <span class="key">project</span>: <span class="str">"my-project"</span> })<br /><br /><span class="cmt" ># Persist a Q&amp;A entry (written to reflection/qa.ncl, git-versioned)</span ><br /><span class="kw">ontoref_qa_add</span>({<br /> &nbsp;&nbsp;<span class="key">question</span>: <span class="str" >"Why does ontoref-ontology have zero stratumiops deps?"</span >,<br /> &nbsp;&nbsp;<span class="key">answer</span>: <span class="str" >"ADR-001: minimal adoption surface. Ontology crate must build standalone."</span >,<br /> &nbsp;&nbsp;<span class="key">tags</span>: [<span class="str" >"adr-001"</span >, <span class="str">"architecture"</span>]<br /> })<br /><br /><span class="cmt"># Check live actor sessions</span><br /><span class="kw">curl</span> http://localhost:7421/actors<br /><span class="cmt" ># {"sessions": [{"token": "abc123", "actor_type": "agent", "current_mode": "describe", ...}]}</span ></div></section><section class="section"><h2 class="section-title"><span data-en="The UI in Action &middot; Graph View" data-es="La UI en Acci&oacute;n &middot; Vista de Grafo" >The UI in Action &middot; Graph View</span ></h2><p style=" color: #64748b; margin-bottom: 1.5rem; max-width: 680px; font-size: 0.92rem; line-height: 1.65; " ><span data-en="Force-directed graph of the live ontology. Nodes are typed (Axiom · Tension · Practice) and polarized (Yang · Yin · Spiral). Click any node to open its detail panel — artifacts, connections, NCL source." data-es="Grafo dirigido por fuerzas de la ontología en vivo. Los nodos son tipados (Axioma · Tensión · Práctica) y polarizados (Yang · Yin · Espiral). Haz clic en cualquier nodo para abrir su panel de detalles." >Force-directed graph of the live ontology. Nodes are typed (Axiom · Tension · Practice) and polarized (Yang · Yin · Spiral). Click any node to open its detail panel — artifacts, connections, NCL source.</span ></p><div class="screenshot-toggle"><button class="screenshot-btn active" onclick="switchScreenshot('dark', this)" > &#9724; dark </button><button class="screenshot-btn" onclick="switchScreenshot('light', this)" > &#9725; light </button></div><div class="graph-screenshot-frame"><img id="graph-screenshot" src="ontoref_graph_view-dark.png" alt="Ontoref Graph View — force-directed ontology graph, dark mode" loading="lazy" /></div><div class="graph-legend"><div class="legend-item"><div class="legend-diamond" style="background: #e8a838"></div><span>Yang · Axiom</span></div><div class="legend-item"><div class="legend-dot" style="background: #60a5fa"></div><span>Yin · Tension</span></div><div class="legend-item"><div class="legend-dot" style="background: #c084fc; border-radius: 2px" ></div><span>Spiral · Practice</span></div><div class="legend-item" style="margin-left: auto; color: #475569"><span >Filter buttons &middot; Edge labels &middot; Node detail panel</span ></div></div></section><section class="section"><h2 class="section-title"><span data-en="Technology Stack" data-es="Stack Tecnol&oacute;gico" >Technology Stack</span ></h2><div class="tech-stack"><span class="tech-badge">Rust Edition 2021</span><span class="tech-badge">Nickel</span><span class="tech-badge">Nushell 0.111+</span><span class="tech-badge">axum</span><span class="tech-badge">Tera Templates</span><span class="tech-badge">DashMap</span><span class="tech-badge">notify</span><span class="tech-badge">MCP Protocol</span><span class="tech-badge">D3.js</span><span class="tech-badge">Server-Sent Events</span><span class="tech-badge">SurrealDB</span><span class="tech-badge">NATS JetStream</span><span class="tech-badge">SHA-256 Seals</span><span class="tech-badge">DAG Contracts</span><span class="tech-badge">shellcheck</span><span class="tech-badge">POSIX Advisory Locks</span></div></section><section class="section"><h2 class="section-title"><span data-en="Protocol Metrics" data-es="M&eacute;tricas del Protocolo" >Protocol Metrics</span ></h2><div class="components-grid"><div class="component-item"><span class="component-name">3 Rust Crates</span><span class="component-role">ontology · reflection · daemon</span></div><div class="component-item"><span class="component-name">19 MCP Tools</span><span class="component-role" >AI agent integration · stdio + HTTP</span ></div><div class="component-item"><span class="component-name">1 Web UI · 12 Pages</span><span class="component-role" >dashboard · graph · search · sessions · notifications · backlog · Q&amp;A · actions · modes · compose</span ></div><div class="component-item"><span class="component-name">6 Protocol Layers</span><span class="component-role">Declarative → Adoption</span></div><div class="component-item"><span class="component-name">1 Search Engine</span><span class="component-role">nodes · ADRs · reflection modes</span></div><div class="component-item"><span class="component-name">16 Nu Modules</span><span class="component-role">Structured data pipelines</span></div><div class="component-item"><span class="component-name">8+ Reflection Modes</span><span class="component-role">DAG workflow contracts</span></div><div class="component-item"><span class="component-name">3 Actor Types</span><span class="component-role">developer / agent / CI</span></div><div class="component-item"><span class="component-name">0 Enforcement</span><span class="component-role">Voluntary adoption</span></div></div></section><div class="cta-section"><h2 class="cta-title" data-en="Structure That Remembers Why" data-es="Estructura que Recuerda el Porqu&eacute;" > Structure That Remembers Why </h2><p class="cta-subtitle" data-en="Start with ontoref setup. Your project gains machine-queryable invariants, living ADRs, actor-aware operational modes, and a daemon that shares context across every actor in real time." data-es="Empieza con ontoref setup. Tu proyecto gana invariantes consultables por m&aacute;quina, ADRs vivos, modos operacionales con actor-awareness y un daemon que comparte contexto entre todos los actores en tiempo real." > Start with <code>ontoref setup</code>. Your project gains machine-queryable invariants, living ADRs, actor-aware operational modes, and a daemon that shares context across every actor in real time. </p><a href="https://ontoref.dev" class="cta-button" data-en="Explore the Protocol" data-es="Explorar el Protocolo" >Explore the Protocol</a ></div></div><footer><p> Ontoref &mdash; A Self-Describing Ontology &amp; Reflection Protocol for Evolving Codebases </p><p data-en="Protocol + Runtime. Zero enforcement. One graph per project." data-es="Protocolo + Runtime. Sin coacci&oacute;n. Un grafo por proyecto." > Protocol + Runtime. Zero enforcement. One graph per project. </p></footer><script> const THEME_KEY = "ontoref-index-theme";function getTheme(){return localStorage.getItem(THEME_KEY)|| "dark";}function setTheme(t){localStorage.setItem(THEME_KEY,t);var btn = document.getElementById("theme-btn");if(t === "light"){document.documentElement.classList.add("light");if(btn)btn.textContent = "\uD83C\uDF19";}else{document.documentElement.classList.remove("light");if(btn)btn.innerHTML = "&#9728;&#xFE0F;";}}function toggleTheme(){setTheme(getTheme()=== "dark" ? "light" : "dark");}setTheme(getTheme());function switchScreenshot(mode,btn){document.querySelectorAll(".screenshot-btn").forEach(function(b){b.classList.remove("active");});btn.classList.add("active");var img = document.getElementById("graph-screenshot");img.src = mode === "dark" ? "ontoref_graph_view-dark.png" : "ontoref_graph_view-light.png";img.alt = "Ontoref Graph View — force-directed D3 ontology graph," + mode + " mode";}function switchLanguage(lang){document.querySelectorAll("[data-en]").forEach(function(el){const text = el.getAttribute("data-" + lang);if(text){el.innerHTML = text;}});document.querySelectorAll(".lang-btn").forEach(function(btn){btn.classList.toggle("active",btn.getAttribute("data-lang")=== lang,);});}</script></body></html>