Skip to content

Publication catalog

The policy branch publishes a branch-owned allowlist of human-readable documentation through docs/publication-catalog.json. The unrelated site branch consumes this catalog together with the skill and webapp catalogs and assembles the only GitHub Pages deployment for this repository.

Ownership

policy owns each document's stable local ID, canonical Markdown source path, optionality, and the publication landing document. The effective cross-branch identity is policy:<document-id>.

site owns the portal home page, navigation labels and ordering, generated destinations, the reviewed source-revision lock, the Zensical build, and Pages deployment. policy continues to run only its branch-local MkDocs build and must not gain a Pages deployment route.

The catalog field home: true identifies the landing document for the policy section. It does not select the global portal home.

Schema versions

Schema version 1 declares Markdown documents. Schema version 2 retains the same document contract and adds explicit non-Markdown asset roots:

{
  "schema_version": 2,
  "documents": [
    {
      "id": "overview",
      "source": "docs/index.md",
      "optional": false,
      "home": true
    }
  ],
  "assets": [
    {
      "source": "docs/assets",
      "destination": "assets",
      "optional": false
    }
  ]
}

Each document contains exactly id, source, optional, and home. A required document source must identify an existing regular Markdown file. An optional document source may be absent, but when present it must also be a regular Markdown file. Exactly one non-optional document is the publication landing page.

Each version 2 asset contains exactly source, destination, and optional. Asset destinations are relative to the policy namespace in the generated site. Markdown files are forbidden inside asset roots because every published Markdown page must be named explicitly in documents. Asset roots must not contain a nested .git subtree in any letter case.

All source and destination values are portable relative POSIX paths. They may not be absolute, contain empty, . or .. components, use backslashes or colons, enter a .git subtree in any letter case, traverse symbolic links, or escape the declared source root.

Validation

Run the validator from the repository root:

python scripts/validate_publication_catalog.py
python -m scripts.validate_publication_catalog

The validator rejects duplicate JSON members, unsupported fields, unsafe or symbolic-link paths, duplicate IDs and destinations, invalid home declarations, missing required sources, and undeclared schema versions.

A publication-set change is complete only after both the policy pull request and the dependent site pull request pass. The site source lock must record the reviewed full commit SHA that contains the catalog change.