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",
  ],
}
