///|
fn select_default_entry(
  catalog : Array[@moonbook.BookCatalogEntry],
  goal : String,
) -> @moonbook.BookCatalogEntry? {
  let notes = goal.to_lower()
  let book_id = if notes.contains("finance") ||
    notes.contains("ledger") ||
    notes.contains("budget") ||
    notes.contains("daily") {
    "finance"
  } else {
    "coding"
  }
  match @moonbook.find_catalog_entry(catalog, book_id) {
    Some(entry) => Some(entry)
    None => if catalog.is_empty() { None } else { Some(catalog[0]) }
  }
}

///|
fn mayor_goal_decomposition_prompt(
  catalog : Array[@moonbook.BookCatalogEntry],
  goal : String,
  explicit_book_id? : String? = None,
) -> String {
  [
    mayor_goal_prompt_header(catalog, goal, explicit_book_id~),
    "Rules:",
    mayor_goal_decomposition_rules().join("\n"),
    "Required output contract: \{mayor_goal_decomposition_contract()}",
    "Fields:",
    mayor_goal_decomposition_contract_fields().join("\n"),
  ].join("\n")
}

///|
fn mayor_goal_prompt_header(
  catalog : Array[@moonbook.BookCatalogEntry],
  goal : String,
  explicit_book_id? : String? = None,
) -> String {
  [
    "You are the Mayor claw for MoonTown.",
    "Decide whether the town goal should stay in one MoonBook or decompose into multiple isolated MoonBooks.",
    "Available books: \{catalog.map(fn(entry) { entry.id }).join(", ")}",
    "Explicit book: \{explicit_book_id.unwrap_or("none")}",
    "Goal: \{goal}",
  ].join("\n")
}

///|
fn mayor_goal_decomposition_contract() -> String {
  "mayor.goal.decomposition.v1"
}

///|
fn mayor_goal_decomposition_rules() -> Array[String] {
  [
    "- parallelize only when the goal names meaningfully distinct knowledge subjects or domains",
    "- each lane must own an isolated wiki/workspace", "- prefer one lane if shared context is essential and decomposition would create artificial fragmentation",
    "- if decomposing, emit one lane per durable knowledge subject", "- each lane objective must be self-contained and book-local",
  ]
}

///|
fn mayor_goal_decomposition_contract_fields() -> Array[String] {
  [
    "- parallelizable: bool", "- summary: string", "- lanes: [{book_id, objective, rationale}]",
  ]
}