Build & deploy blocks

BlockFieldsNotes
repositoryname, url, summary?, primary_language?, body?local-dev quickstart prose lives in the body or a :dev sop
repo_pathpath, descriptionnested in repository — one row per notable path
pipelinename, repo?, trigger?, summary?, body?one per workflow
pipeline_stagename?, summary?, environment?, gates[], next[]nested in pipeline; next wires the stage DAG the flowchart draws — branch- and fan-out-safe; summary says what the stage does (the pipeline page renders per-stage detail)
releaseversion, date?, repo?, summary?, highlights[], url?one per shipped version — the Build & deploy releases table; extractor-owned (git tags), never hand-maintained

A repo_path that is really another repository says so: repo for one of OUR repos pulled in as a submodule/subtree (the structure diagram links to its page), external_url for a submodule outside our control (drawn dashed). This covers monorepos, multi-repo estates, and vendored trees with one vocabulary.

Who populates: pipelines and releases are ideal extractor territory (parse the real CI config / the git tags — see the reference WAD's extract_ci.py and extract_releases.py); repositories start from extract_repo.py and get hand-written descriptions.