# PACKAGE_CATALOG javadoc — 이전 카탈로그와 트리의 크기
  /**
   * Every direct child package of the production root, and what it may depend on.
   *
   * <p>Closed, and compared for exact equality against what is on disk. The previous catalog listed
   * thirteen packages and the tree held twenty-two: {@code audit}, {@code config}, {@code failure},
   * {@code fileserver}, {@code h2}, {@code idempotency}, {@code lock}, {@code notification} and
   * {@code outbox} were governed by nothing, so a new package — or a new edge out of one of them —
   * was green by omission.
   *
   * <p>{@code api} is the innermost: it names nobody. Everything else may reach it, and the
   * declared edges beyond that are what the module map actually claims.

# DAG 테스트가 기록한 사이클

  @Test
  @DisplayName("the declared edges form a DAG")
  void theDeclaredEdgesFormADag() {
    List<String> cycles = new java.util.ArrayList<>();
    for (String start : PACKAGE_CATALOG.keySet()) {
      if (reaches(start, start, new TreeSet<>())) {
        cycles.add(start);
      }
    }

    assertThat(cycles)
        .as(
            "transaction -> postgresql and postgresql -> transaction both existed, so neither could"
                + " be extracted or swapped without unpicking the other first")
        .isEmpty();
