Domain extension system (ADR-012): bash-layer dispatch activates repo_kind-conditional CLI domains. install.nu copies domains/ tree; short_alias wrappers generated (personal, prov). ore help and describe capabilities domain-aware. personal domain (PersonalOntology): career skills/talks/publications/positioning, CFP pipeline (Watching→Delivered), opportunities lifecycle, content pipeline, Sessionize integration. Daemon pages: /career, /personal. provisioning domain (DevWorkspace/Mixed): FSM state, next transitions, connections graph, gates, workspace card, capabilities, backlog. Daemon page: /provisioning. VCS abstraction layer (ADR-013): reflection/modules/vcs.nu — uniform jj/git API via filesystem detection (.jj/ vs .git/). opmode.nu and git-event.nu migrated off ^git. reflection/bin/jjw.nu — jj + ontoref + Radicle agent workspace lifecycle. jjw-ncl-merge.nu registered as jj merge tool for .ontology/ NCL conflicts. init-repo.nu for new_project mode. jj/rad not in ontoref requirements — belong in orchestration project manifests. 'Framework RepoKind: ontology/schemas/manifest.ncl gains 'Framework variant; ontoref self-identifies as framework — no domain activates for the protocol itself. Web presence: personal.html and provisioning.html domain subpages. index.html gains "Project Types — Domain Extensions" section with type cards and subpage links. Nav compacted (Arch/Prov labels, solid backdrop-filter background). on+re: vcs-abstraction (adrs: adr-013) and agent-workspace-orchestration Practice nodes; 21 manifest capabilities; state.ncl catalysts updated.
1 line
32 KiB
HTML
1 line
32 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 — Provisioning Domain Extension" data-es="Ontoref — Extensión de Dominio Provisioning" data-key="prov-page-title" > Ontoref — Provisioning Domain </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(249,115,22,0.12) 0%,transparent 50% ),radial-gradient( circle at 80% 80%,rgba(251,146,60,0.1) 0%,transparent 50% ),radial-gradient( circle at 50% 20%,rgba(234,88,12,0.08) 0%,transparent 50% );}.language-toggle{position:fixed;top:2rem;right:2rem;z-index:100;display:flex;gap:0.25rem;background:rgba(15,23,42,0.88);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);border:1px solid rgba(249,115,22,0.3);border-radius:20px;padding:0.3rem 0.3rem;}.lang-btn{background:transparent;border:none;color:#94a3b8;padding:0.4rem 0.75rem;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,#f97316 0%,#ea580c 100%);color:#fff;}.lang-btn:hover{color:#f97316;}.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(249,115,22,0.15);border:1px solid #f97316;color:#f97316;padding:0.5rem 1.5rem;border-radius:50px;font-size:0.85rem;font-weight:700;margin-bottom:1.5rem;}h1{font-size:2.8rem;font-weight:800;line-height:1.2;margin-bottom:1.5rem;background:linear-gradient( 135deg,#f97316 0%,#fb923c 50%,#fdba74 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;}.highlight{color:#f97316;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:#f97316;text-align:center;}.section-title span{background:linear-gradient(135deg,#f97316 0%,#fb923c 100%);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text;}.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(249,115,22,0.08) 0%,rgba(251,146,60,0.06) 100% );border-radius:12px;padding:2rem;border-left:4px solid #f97316;transition:all 0.3s ease;}.feature-box:hover{background:linear-gradient( 135deg,rgba(249,115,22,0.13) 0%,rgba(251,146,60,0.1) 100% );transform:translateY(-3px);}.feature-title{font-size:1.15rem;font-weight:700;color:#f97316;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:#fb923c;font-weight:bold;position:absolute;left:0;}.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:#f97316;}.code-block .str{color:#4ade80;}.code-block .cmt{color:#475569;font-style:italic;}.code-block .key{color:#fb923c;}.code-block .flag{color:#60a5fa;}.code-block .dim{color:#fbbf24;}.cmd-table{width:100%;border-collapse:collapse;font-size:0.82rem;margin-top:1rem;}.cmd-table th{color:#64748b;font-weight:700;text-align:left;padding:0.4rem 0.8rem;border-bottom:1px solid #1e293b;font-family:"JetBrains Mono",monospace;font-size:0.72rem;text-transform:uppercase;letter-spacing:0.05em;}.cmd-table td{padding:0.4rem 0.8rem;border-bottom:1px solid rgba(30,41,59,0.5);font-family:"JetBrains Mono",monospace;vertical-align:top;}.cmd-table td:first-child{color:#f97316;white-space:nowrap;}.cmd-table td:last-child{color:#64748b;font-size:0.78rem;}.cmd-table-wrap{background:rgba(15,23,42,0.8);border:1px solid #1e293b;border-radius:10px;padding:1rem;overflow-x:auto;}.fsm-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:1rem;margin-top:1.5rem;}.fsm-dim{background:rgba(249,115,22,0.05);border:1px solid rgba(249,115,22,0.2);border-radius:8px;padding:1.1rem 1.25rem;}.fsm-dim-name{font-size:0.75rem;font-weight:700;text-transform:uppercase;letter-spacing:0.07em;color:#f97316;font-family:"JetBrains Mono",monospace;margin-bottom:0.5rem;}.fsm-dim-row{display:flex;gap:0.5rem;align-items:center;font-size:0.75rem;color:#64748b;font-family:"JetBrains Mono",monospace;margin-bottom:0.2rem;}.fsm-label{color:#475569;min-width:70px;}.fsm-value{color:#cbd5e1;}.fsm-blocker{color:#f87171;}.fsm-catalyst{color:#4ade80;}.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",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",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:#f97316;border-bottom-color:#f97316;}.window-body{padding:1.25rem 1.5rem;font-family:"JetBrains Mono",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:#fb923c;font-size:0.7rem;min-width:150px;flex-shrink:0;}.window-page-name{color:#f97316;font-weight:600;min-width:100px;flex-shrink:0;}.window-page-desc{color:#475569;font-size:0.68rem;}.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;}.activation-box{background:rgba(249,115,22,0.04);border:1px solid rgba(249,115,22,0.2);border-radius:16px;padding:2.5rem;margin-top:2rem;}.conn-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:1rem;margin-top:1.5rem;}.conn-node{background:rgba(249,115,22,0.06);border:1px solid rgba(249,115,22,0.2);border-radius:8px;padding:1rem 1.25rem;font-size:0.8rem;}.conn-node-name{font-family:"JetBrains Mono",monospace;font-weight:700;color:#f97316;margin-bottom:0.5rem;}.conn-node-dir{font-size:0.72rem;color:#64748b;font-family:"JetBrains Mono",monospace;display:flex;align-items:center;gap:0.3rem;}.conn-node-dir .arrow-up{color:#4ade80;}.conn-node-dir .arrow-down{color:#f87171;}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;}@media (max-width:768px){h1{font-size:2rem;}.hero-subtitle{font-size:1rem;}.section-title{font-size:1.6rem;}.language-toggle{top:1rem;right:1rem;}.features-grid{grid-template-columns:1fr;}.fsm-grid{grid-template-columns:1fr;}}html.light body{background:#f8fafc;color:#0f172a;}html.light .gradient-bg{background:radial-gradient(circle at 20% 50%,rgba(249,115,22,0.07) 0%,transparent 50%),radial-gradient(circle at 80% 80%,rgba(251,146,60,0.07) 0%,transparent 50%),radial-gradient(circle at 50% 20%,rgba(234,88,12,0.05) 0%,transparent 50%);}html.light .language-toggle{background:rgba(248,250,252,0.92);border-color:rgba(249,115,22,0.35);}html.light .lang-btn{color:#475569;}html.light .hero-subtitle{color:#334155;}html.light .feature-box{background:linear-gradient(135deg,rgba(249,115,22,0.07) 0%,rgba(251,146,60,0.05) 100%);}html.light .feature-box:hover{background:linear-gradient(135deg,rgba(249,115,22,0.12) 0%,rgba(251,146,60,0.08) 100%);}html.light .feature-text{color:#334155;}html.light .feature-text li:before{color:#ea580c;}html.light .code-block{background:#f1f5f9;border-color:#cbd5e1;color:#475569;}html.light .code-block .cmt{color:#94a3b8;}html.light .code-block .key{color:#ea580c;}html.light .cmd-table-wrap{background:#f1f5f9;border-color:#cbd5e1;}html.light .cmd-table th{color:#64748b;border-bottom-color:#cbd5e1;}html.light .cmd-table td{border-bottom-color:rgba(203,213,225,0.5);}html.light .cmd-table td:last-child{color:#64748b;}html.light .fsm-dim{background:rgba(249,115,22,0.04);border-color:rgba(249,115,22,0.15);}html.light .fsm-value{color:#334155;}html.light .conn-node{background:rgba(249,115,22,0.04);border-color:rgba(249,115,22,0.15);}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:#f97316;}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 .activation-box{background:rgba(249,115,22,0.03);border-color:rgba(249,115,22,0.15);}html.light .daemon-col-title{color:#ea580c;}html.light footer{border-top-color:rgba(0,0,0,0.1);color:#64748b;}html.light footer p:first-child{color:#475569;}</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="index.html" class="lang-btn" data-en="← Back" data-es="← Volver" data-key="nav-back" >← Back</a ><a href="architecture-diagram.html" class="lang-btn" data-en="Architecture" data-es="Arquitectura" data-key="nav-architecture" >Architecture</a ><button id="theme-btn" class="lang-btn" onclick="toggleTheme()" title="Toggle dark/light mode" >☀️</button></div><div class="container"><header><span class="status-badge" data-en="Domain Extension · DevWorkspace · Mixed" data-es="Extensión de Dominio · DevWorkspace · Mixed" data-key="prov-badge" >Domain Extension · DevWorkspace · Mixed</span ><h1 data-en="Provisioning" data-es="Provisioning" data-key="prov-h1" >Provisioning</h1><p class="hero-subtitle" data-en="Infrastructure state, workspace topology, and platform capabilities become first-class ontology nodes. FSM dimensions track provisioning state across clusters and services. Connection graphs expose upstream/downstream dependencies. Membrane gates encode the conditions that must hold for cross-workspace data or control flow." data-es="El estado de infraestructura, la topología del workspace y las capacidades de plataforma se convierten en nodos de ontología de primera clase. Las dimensiones FSM rastrean el estado de provisioning a través de clusters y servicios. Los grafos de conexión exponen dependencias upstream/downstream. Las membranas codifican las condiciones que deben cumplirse para el flujo de datos o control entre workspaces." data-key="prov-subtitle" >Infrastructure state, workspace topology, and platform capabilities become first-class ontology nodes. FSM dimensions track provisioning state across clusters and services. Connection graphs expose upstream/downstream dependencies. Membrane gates encode the conditions that must hold for cross-workspace data or control flow.</p><div class="code-block" style="max-width: 480px; margin: 0 auto; text-align: left"><span class="cmt"># Activate the provisioning domain in your repo</span><br /><span class="kw">ontoref</span> setup --kind DevWorkspace<br /><br /><span class="cmt"># Alias is now available</span><br /><span class="kw">prov</span> state </div></header><section class="section"><h2 class="section-title"><span data-en="State & Transitions" data-es="Estado & Transiciones" data-key="prov-state-title" >State & Transitions</span ></h2><p style="color: #94a3b8; margin-bottom: 2rem; font-size: 0.95rem; line-height: 1.7; max-width: 760px; margin-left: auto; margin-right: auto; text-align: center" data-en="Infrastructure state is modeled as a multi-dimensional FSM. Each dimension has a <code>current_state</code>, a <code>desired_state</code>, a <code>blocker</code> that explains what prevents the transition, and a <code>catalyst</code> that describes what would trigger it. <code>prov next</code> computes all valid transitions across every dimension simultaneously." data-es="El estado de infraestructura se modela como un FSM multi-dimensional. Cada dimensión tiene un <code>current_state</code>, un <code>desired_state</code>, un <code>blocker</code> que explica qué impide la transición y un <code>catalyst</code> que describe qué la dispararía. <code>prov next</code> computa todas las transiciones válidas en todas las dimensiones simultáneamente." data-key="prov-state-intro" >Infrastructure state is modeled as a multi-dimensional FSM. Each dimension has a <code>current_state</code>, a <code>desired_state</code>, a <code>blocker</code> that explains what prevents the transition, and a <code>catalyst</code> that describes what would trigger it. <code>prov next</code> computes all valid transitions across every dimension simultaneously.</p><div class="fsm-grid"><div class="fsm-dim"><div class="fsm-dim-name">cluster_provisioning</div><div class="fsm-dim-row"><span class="fsm-label">current</span><span class="fsm-value">bootstrapped</span></div><div class="fsm-dim-row"><span class="fsm-label">desired</span><span class="fsm-value">operational</span></div><div class="fsm-dim-row"><span class="fsm-label">blocker</span><span class="fsm-blocker">cert-manager not yet deployed</span></div></div><div class="fsm-dim"><div class="fsm-dim-name">observability</div><div class="fsm-dim-row"><span class="fsm-label">current</span><span class="fsm-value">partial</span></div><div class="fsm-dim-row"><span class="fsm-label">desired</span><span class="fsm-value">full_stack</span></div><div class="fsm-dim-row"><span class="fsm-label">catalyst</span><span class="fsm-catalyst">deploy victoria-metrics + loki</span></div></div><div class="fsm-dim"><div class="fsm-dim-name">gitops_sync</div><div class="fsm-dim-row"><span class="fsm-label">current</span><span class="fsm-value">active</span></div><div class="fsm-dim-row"><span class="fsm-label">desired</span><span class="fsm-value">active</span></div><div class="fsm-dim-row"><span class="fsm-label">blocker</span><span class="fsm-value" style="color: #4ade80">none — at desired state</span></div></div></div><div class="code-block" style="margin-top: 1.5rem"><span class="cmt"># Current FSM state across all provisioning dimensions</span><br /><span class="kw">prov</span> state<br /><br /><span class="cmt"># All valid next transitions with blockers and catalysts</span><br /><span class="kw">prov</span> next<br /><br /><span class="cmt"># Validate a decision against architectural invariants</span><br /><span class="kw">prov</span> validate <span class="str">"deploy sops-operator before cert-manager"</span></div></section><section class="section"><h2 class="section-title"><span data-en="Topology — Connections & Gates" data-es="Topología — Conexiones & Membranas" data-key="prov-topo-title" >Topology — Connections & Gates</span ></h2><p style="color: #94a3b8; margin-bottom: 2rem; font-size: 0.95rem; line-height: 1.7; max-width: 760px; margin-left: auto; margin-right: auto; text-align: center" data-en="Workspace connections encode the dependency graph between provisioning units. Gates (membranes) are the typed conditions that govern when data, tokens, or control signals can flow across a connection. <code>prov gates</code> shows current membrane status — open, closed, or partially open — with the conditions that would change each." data-es="Las conexiones de workspace codifican el grafo de dependencias entre unidades de provisioning. Las membranas son las condiciones tipadas que gobiernan cuándo pueden fluir datos, tokens o señales de control a través de una conexión. <code>prov gates</code> muestra el estado actual de cada membrana — abierta, cerrada o parcialmente abierta — con las condiciones que cambiarían cada una." data-key="prov-topo-intro" >Workspace connections encode the dependency graph between provisioning units. Gates (membranes) are the typed conditions that govern when data, tokens, or control signals can flow across a connection. <code>prov gates</code> shows current membrane status — open, closed, or partially open — with the conditions that would change each.</p><div class="conn-grid"><div class="conn-node"><div class="conn-node-name">infra-base</div><div class="conn-node-dir"><span class="arrow-up">↑</span> upstream: cloud-provider-api </div><div class="conn-node-dir"><span class="arrow-down">↓</span> downstream: app-cluster, monitoring </div></div><div class="conn-node"><div class="conn-node-name">app-cluster</div><div class="conn-node-dir"><span class="arrow-up">↑</span> upstream: infra-base, secrets-store </div><div class="conn-node-dir"><span class="arrow-down">↓</span> downstream: (none) </div></div><div class="conn-node"><div class="conn-node-name">secrets-store</div><div class="conn-node-dir"><span class="arrow-up">↑</span> upstream: vault-cluster </div><div class="conn-node-dir"><span class="arrow-down">↓</span> downstream: app-cluster </div></div></div><div class="code-block" style="margin-top: 1.5rem"><span class="cmt"># Upstream/downstream connection graph</span><br /><span class="kw">prov</span> connections<br /><br /><span class="cmt"># Membrane (gate) status — open/closed/partial + conditions</span><br /><span class="kw">prov</span> gates </div></section><section class="section"><h2 class="section-title"><span data-en="Workspace Card" data-es="Tarjeta de Workspace" data-key="prov-card-title" >Workspace Card</span ></h2><p style="color: #94a3b8; margin-bottom: 2rem; font-size: 0.95rem; line-height: 1.7; max-width: 760px; margin-left: auto; margin-right: auto; text-align: center" data-en="Available for <code>DevWorkspace</code> repos (not <code>Mixed</code>). Returns a structured summary: workspace identity, cluster list with their types and regions, overall provisioning status, and which gates are currently blocking downstream consumers. Useful as a health check or context card for agents operating in the workspace." data-es="Disponible para repos <code>DevWorkspace</code> (no <code>Mixed</code>). Devuelve un resumen estructurado: identidad del workspace, lista de clusters con sus tipos y regiones, estado general de provisioning y qué membranas están actualmente bloqueando consumidores downstream. Útil como health check o tarjeta de contexto para agentes que operan en el workspace." data-key="prov-card-intro" >Available for <code>DevWorkspace</code> repos (not <code>Mixed</code>). Returns a structured summary: workspace identity, cluster list with their types and regions, overall provisioning status, and which gates are currently blocking downstream consumers. Useful as a health check or context card for agents operating in the workspace.</p><div class="code-block"><span class="cmt"># Identity + clusters + provisioning status summary</span><br /><span class="kw">prov</span> card<br /><br /><span class="cmt"># Example output:</span><br /><span class="dim">workspace</span>: <span class="str">my-infra</span><br /><span class="dim">kind</span>: <span class="str">DevWorkspace</span><br /><span class="dim">clusters</span>: [<span class="str">prod-eu-west-1</span>, <span class="str">staging-eu-west-1</span>]<br /><span class="dim">status</span>: <span class="str">partially_operational</span><br /><span class="dim">open_gates</span>: 3<br /><span class="dim">closed_gates</span>: 1 <span class="cmt"># secrets-store → app-cluster blocked</span></div></section><section class="section"><h2 class="section-title"><span data-en="Platform Capabilities & Backlog" data-es="Capacidades de Plataforma & Backlog" data-key="prov-cap-title" >Platform Capabilities & Backlog</span ></h2><div class="features-grid"><div class="feature-box"><div class="feature-title">Platform Capabilities</div><ul class="feature-text"><li data-en="Reads the manifest capabilities section — what this workspace provides vs. requires" data-es="Lee la sección de capacidades del manifest — qué proporciona este workspace vs. qué requiere" data-key="prov-cap-1" >Reads the manifest capabilities section — what this workspace provides vs. requires</li><li data-en="Structured output: services, APIs, storage backends, auth mechanisms" data-es="Salida estructurada: servicios, APIs, backends de almacenamiento, mecanismos de auth" data-key="prov-cap-2" >Structured output: services, APIs, storage backends, auth mechanisms</li><li data-en="Feeds into gate evaluation — capabilities map to open/closed conditions" data-es="Alimenta la evaluación de membranas — las capacidades mapean a condiciones abiertas/cerradas" data-key="prov-cap-3" >Feeds into gate evaluation — capabilities map to open/closed conditions</li></ul><div class="code-block" style="margin-top: 1rem; padding: 0.9rem; font-size: 0.75rem"><span class="kw">prov</span> capabilities </div></div><div class="feature-box"><div class="feature-title">Backlog</div><ul class="feature-text"><li data-en="Provisioning-scoped backlog items from reflection/backlog.ncl" data-es="Elementos de backlog con alcance de provisioning de reflection/backlog.ncl" data-key="prov-bl-1" >Provisioning-scoped backlog items from reflection/backlog.ncl</li><li data-en="Priority filter surfaces High-priority blockers first" data-es="El filtro de prioridad muestra primero los bloqueadores de prioridad High" data-key="prov-bl-2" >Priority filter surfaces High-priority blockers first</li><li data-en="Detail view includes owning dimension, gate impact, and linked connections" data-es="La vista de detalle incluye la dimensión propietaria, impacto en membranas y conexiones vinculadas" data-key="prov-bl-3" >Detail view includes owning dimension, gate impact, and linked connections</li></ul><div class="code-block" style="margin-top: 1rem; padding: 0.9rem; font-size: 0.75rem"><span class="kw">prov</span> backlog <span class="flag">--priority</span> High<br /><span class="kw">prov</span> backlog show bl-deploy-certmgr </div></div></div></section><section class="section"><h2 class="section-title"><span data-en="Daemon UI" data-es="UI del Daemon" data-key="prov-ui-title" >Daemon UI</span ></h2><p style="color: #94a3b8; margin-bottom: 2rem; font-size: 0.95rem; line-height: 1.7; max-width: 760px; margin-left: auto; margin-right: auto; text-align: center" data-en="The provisioning domain activates the <code>/provisioning</code> page in the daemon UI. It is live-reloading and reflects the current FSM state, connection graph, and gate status without restart." data-es="El dominio provisioning activa la página <code>/provisioning</code> en la UI del daemon. Se recarga en vivo y refleja el estado FSM actual, el grafo de conexiones y el estado de membranas sin reinicio." data-key="prov-ui-intro" >The provisioning domain activates the <code>/provisioning</code> page in the daemon UI. It is live-reloading and reflects the current FSM state, connection graph, and gate status without restart.</p><div class="daemon-cols"><div><div class="daemon-col-title">/provisioning</div><div class="window-mockup"><div class="window-titlebar"><div class="window-dot red"></div><div class="window-dot yellow"></div><div class="window-dot green"></div><span>localhost:7421/provisioning</span></div><div class="window-nav"><div class="window-nav-tab active">State</div><div class="window-nav-tab">Connections</div><div class="window-nav-tab">Gates</div><div class="window-nav-tab">Capabilities</div><div class="window-nav-tab">Backlog</div></div><div class="window-body"><div class="window-page-row"><span class="window-page-route">/provisioning</span><span class="window-page-name">State</span><span class="window-page-desc">FSM dimension grid — current/desired/blocker per dimension</span></div><div class="window-page-row"><span class="window-page-route">/provisioning#connections</span><span class="window-page-name">Connections</span><span class="window-page-desc">Upstream/downstream dependency graph with status badges</span></div><div class="window-page-row"><span class="window-page-route">/provisioning#gates</span><span class="window-page-name">Gates</span><span class="window-page-desc">Membrane status — open/closed/partial with conditions</span></div></div></div></div><div><div class="daemon-col-title" style="color: #64748b; font-size: 0.85rem; font-weight: 600; text-transform: none; letter-spacing: 0"><span data-en="The provisioning page reads directly from your ontology NCL files via the daemon's file watcher. Any change to a dimension state, connection node, or gate condition is reflected in the UI within the debounce window (default 300ms). No manual refresh needed." data-es="La página de provisioning lee directamente de tus archivos NCL de ontología a través del file watcher del daemon. Cualquier cambio en el estado de una dimensión, nodo de conexión o condición de membrana se refleja en la UI dentro de la ventana de debounce (por defecto 300ms). Sin necesidad de recarga manual." data-key="prov-ui-desc" >The provisioning page reads directly from your ontology NCL files via the daemon's file watcher. Any change to a dimension state, connection node, or gate condition is reflected in the UI within the debounce window (default 300ms). No manual refresh needed.</span></div><div class="code-block" style="margin-top: 1.5rem"><span class="cmt"># Start daemon (provisioning page is served automatically)</span><br /><span class="kw">ontoref-daemon-boot</span><br /><br /><span class="cmt"># Open in browser</span><br /> open http://localhost:7421/provisioning<br /><br /><span class="cmt"># Or query the provisioning state via API</span><br /><span class="kw">curl</span> http://localhost:7421/api/provisioning/state </div></div></div></section><section class="section"><h2 class="section-title"><span data-en="Activation & CLI Reference" data-es="Activación & Referencia CLI" data-key="prov-cli-title" >Activation & CLI Reference</span ></h2><div class="activation-box"><p style="color: #94a3b8; margin-bottom: 1.5rem; font-size: 0.9rem; line-height: 1.7" data-en="Setup writes <code>repo_kind = DevWorkspace</code> (or <code>Mixed</code>) to your manifest. The <code>prov</code> alias is registered in your shell profile. The provisioning domain reads FSM state from <code>.ontology/state.ncl</code> and topology from the provisioning-extension NCL files installed by setup." data-es="Setup escribe <code>repo_kind = DevWorkspace</code> (o <code>Mixed</code>) en tu manifest. El alias <code>prov</code> se registra en tu perfil de shell. El dominio provisioning lee el estado FSM de <code>.ontology/state.ncl</code> y la topología de los ficheros NCL de extensión de provisioning instalados por setup." data-key="prov-cli-intro" >Setup writes <code>repo_kind = DevWorkspace</code> (or <code>Mixed</code>) to your manifest. The <code>prov</code> alias is registered in your shell profile. The provisioning domain reads FSM state from <code>.ontology/state.ncl</code> and topology from the provisioning-extension NCL files installed by setup.</p><div class="code-block" style="margin-top: 0"><span class="cmt"># ── Activation ──────────────────────────────────────────</span><br /><span class="kw">ontoref</span> setup --kind DevWorkspace<br /><span class="kw">ontoref</span> setup --kind Mixed<br /><br /><span class="cmt"># ── FSM state ────────────────────────────────────────────</span><br /><span class="kw">prov</span> state <span class="cmt"># FSM position across all provisioning dimensions</span><br /><span class="kw">prov</span> next <span class="cmt"># next valid transitions + blockers/catalysts</span><br /><span class="kw">prov</span> validate <decision> <span class="cmt"># check decision against ontological invariants</span><br /><br /><span class="cmt"># ── Topology ─────────────────────────────────────────────</span><br /><span class="kw">prov</span> connections <span class="cmt"># upstream/downstream dependency graph</span><br /><span class="kw">prov</span> gates <span class="cmt"># membrane status + opening conditions</span><br /><br /><span class="cmt"># ── Workspace (DevWorkspace only) ────────────────────────</span><br /><span class="kw">prov</span> card <span class="cmt"># identity, clusters, status summary</span><br /><br /><span class="cmt"># ── Capabilities & backlog ───────────────────────────────</span><br /><span class="kw">prov</span> capabilities <span class="cmt"># platform capabilities from manifest</span><br /><span class="kw">prov</span> backlog [<span class="flag">--priority</span> High|Medium|Low]<br /><span class="kw">prov</span> backlog show <id><br /><br /><span class="cmt"># All of the above also work via the ore alias:</span><br /><span class="kw">ore</span> prov state </div></div></section></div><footer><p> Ontoref — Provisioning Domain Extension </p><p data-en="DevWorkspace · Mixed · alias: prov · ontoref setup --kind DevWorkspace" data-es="DevWorkspace · Mixed · alias: prov · ontoref setup --kind DevWorkspace" data-key="prov-footer-tagline" > DevWorkspace · Mixed · alias: prov · <code style="font-size: 0.82rem; font-family: 'JetBrains Mono', monospace">ontoref setup --kind DevWorkspace</code></p></footer><script> const THEME_KEY = "ontoref-provisioning-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 = "☀️";}}function toggleTheme(){setTheme(getTheme()=== "dark" ? "light" : "dark");}setTheme(getTheme());function switchLanguage(lang){document.querySelectorAll("[data-en]").forEach(function(el){var 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>
|