let d = import "../defaults.ncl" in d.make_mode String { id = "sync-ontology", trigger = "Synchronize .ontoref/ontology/ declarations with actual project artifacts — detect drift between declared practice nodes and the crates/site structure under code/, and propose ontology patches.", preconditions = [ ".ontoref/ontology/core.ncl exists", "nickel binary available on PATH", "rg (ripgrep) available on PATH", ], steps = [ { id = "scan", action = "Enumerate the implementation structure: crates under code/crates/, config under code/site/config/, content directories, and the rendering profile declarations. Extract the artifact paths actually present.", cmd = "ls code/crates/ 2>/dev/null; echo '---'; ls code/site/config/ 2>/dev/null", actor = 'Both, on_error = { strategy = 'Stop }, }, { id = "export-core", action = "Export .ontoref/ontology/core.ncl and collect the artifact_paths declared on each practice node.", cmd = "nickel export .ontoref/ontology/core.ncl 2>/dev/null", actor = 'Both, depends_on = [{ step = "scan" }], on_error = { strategy = 'Stop }, }, { id = "diff", action = "Compare scan results against core.ncl artifact_paths. Categorize each: OK (node path exists), STALE (declared path absent under code/), MISSING (significant artifact with no node). Account for the code/ prefix introduced by the constellation layout.", actor = 'Both, depends_on = [{ step = "export-core" }], on_error = { strategy = 'Continue }, }, { id = "propose", action = "Generate Nickel patches: corrected artifact_paths for STALE nodes, new Practice node stubs for MISSING artifacts. Present for human review; do not apply automatically.", actor = 'Both, depends_on = [{ step = "diff" }], on_error = { strategy = 'Stop }, }, ], }