let d = import "../defaults.ncl" in d.make_mode String { id = "sync-ontology", trigger = "Synchronize .ontology/ declarations with actual project artifacts — detect drift, propose patches, apply with confirmation", preconditions = [ "ONTOREF_PROJECT_ROOT is set and points to a project with .ontology/core.ncl", "nickel binary is available on PATH", "Nushell >= 0.110.0 is available", ], steps = [ { id = "scan", action = "Analyze project structure: crates, scenarios, agents, CI, forms, modes. If nightly toolchain is available, extract pub API surface via cargo doc JSON.", cmd = "./ontoref sync scan", actor = 'Both, on_error = { strategy = 'Stop }, }, { id = "diff", action = "Compare scan results against .ontology/core.ncl nodes and edges. Categorize each item as OK, MISSING (artifact without node), STALE (node without artifact), DRIFT (node outdated), or BROKEN (edge referencing missing node).", cmd = "./ontoref sync diff", actor = 'Both, depends_on = [{ step = "scan" }], on_error = { strategy = 'Stop }, }, { id = "propose", action = "Generate Nickel code for new nodes (MISSING), mark stale nodes for removal, generate updated nodes for DRIFT, mark broken edges for deletion.", cmd = "./ontoref sync propose", actor = 'Both, depends_on = [{ step = "diff" }], on_error = { strategy = 'Stop }, }, { id = "review", action = "Human reviews the proposal. Agent can skip this step.", actor = 'Human, depends_on = [{ step = "propose" }], on_error = { strategy = 'Stop }, }, { id = "apply", action = "Apply approved changes to .ontology/core.ncl. Each category (add/remove/update) confirmed separately.", cmd = "./ontoref sync apply", actor = 'Human, depends_on = [{ step = "review" }], on_error = { strategy = 'Stop }, }, { id = "verify", action = "Run nickel typecheck on modified files. Execute sync diff again to confirm zero drift.", cmd = "nickel typecheck .ontology/core.ncl && ./ontoref sync diff", actor = 'Both, depends_on = [{ step = "apply" }], on_error = { strategy = 'Stop }, }, ], postconditions = [ "nickel export .ontology/core.ncl succeeds without errors", "sync diff reports zero MISSING, STALE, or BROKEN items", "All existing ADR Hard constraints still pass", ], }