ontoref/reflection/modes/sync-ontology.ncl

68 lines
2.5 KiB
Plaintext
Raw Normal View History

2026-03-13 00:21:04 +00:00
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",
],
}