Skip to content

fix(engineering-playbook): follow the plain-Markdown wiki - #60

Merged
kieronlanning merged 6 commits into
mainfrom
fix/engineering-playbook-plain-markdown-wiki
Nov 8, 2026
Merged

kieronlanning merged 6 commits into
mainfrom
fix/engineering-playbook-plain-markdown-wiki

Conversation

@kieronlanning

@kieronlanning kieronlanning commented Nov 8, 2026 •

Copy link
Copy Markdown
Contributor

Why

purview-dev/engineering-playbook was reorganised (PRs #13/#14, main at 6b68c6a) and the catalogue
entry no longer described it:

  • docs/wiki/index.md and mkdocs.yml were deleted. The wiki is now plain Markdown: Home.md is
    the hub, _Sidebar.md is the whole navigation, and the repository carries no site configuration.
  • A new page, docs/wiki/foundations/Dependency-Versions.md, is linked from Home.md and listed in
    _Sidebar.md under "Repository foundations".
  • The playbook now publishes eight skills (the eighth is purview-component-compatibility).
  • The wiki no longer states package versions; it renders registry badges instead.

This PR also applies the same rule to this repository: its own dead mkdocs.yml is gone, and the build
now reports (never fails on) any project repository that still ships one.

What changed

src/src/data/projects/engineering-playbook.yml

  • docs.exclude is now [_Sidebar.md] only — index.md no longer exists, and nothing else needs
    excluding. docs.source: github-path, docs.path: docs/wiki and docs.rootPage: Home.md all still
    resolve (Home.md is itself a conventional root page, so rootPage restates the default).
  • The first use case no longer pins "Purview.BuildSdk": "1.0.4". It uses the playbook's own
    placeholder convention ("LATEST", as in Getting-Started.md), because the page it advertises now
    deliberately states no version at all — a real number here would rot and re-introduce the
    contradiction.
  • No skill count is hand-maintained anywhere: ProjectCard.astro and projects/[project].astro derive
    it from listMirroredSkills(), i.e. from the mirror just data-sync discovers at the project's
    documentation ref. The new skill appears with no catalogue change; the sync mirrors eight skills for
    the playbook (purview-architecture, -architecture-testing, -component-compatibility,
    -engineering-principles, -org-harvest, -persistence, -telemetry, -testing-conventions).

Aggregation, proved end to end

just data-sync reports docs engineering-playbook: 22 pages (Docs synced: 16 projects, 269 pages).
The page list is exactly _Sidebar.md's order, with the new page in its sidebar position: -1 index
(from Home.md), 1 getting-started, 2 engineering-principles, 3 foundations/repository-shape,
4 foundations/project-responsibilities, 5 foundations/architecture-as-tests,
6 foundations/verification-model, 7 foundations/documentation-convention,
8 foundations/dependency-versions, 9 data/contracts-and-data-exchange, …, 21 examples/worked-examples.

No page is emitted for the deleted index.md; the only index slug is the landing page, aliased from
Home.md. The built site serves the new page (HTTP 200, title "Dependency Versions | Purview Dev"):

/docs/engineering-playbook/foundations/dependency-versions/

Note on that URL: a page's slug is its path from the docs root (ADR 0011), so a page in foundations/
publishes at /docs/<id>/foundations/<page>/, and the flat
/docs/engineering-playbook/dependency-versions/ does not exist (404). That is the documented rule —
the playbook's own Home.md states the same contract — so I neither flattened the slug nor invented a
redirect for a URL that never existed.

Badges survive the aggregator

All eleven badge images render as their absolute URLs — no raw.githubusercontent.com rewrite and no
imageBase prefix: https://img.shields.io/nuget/v/Purview.BuildSdk …
https://img.shields.io/npm/v/@purview-dev/astroc4.

rewriteDocMarkdown already returned absolute (https://///) targets untouched, so no code fix was
needed; the behaviour is now pinned by tests so a future image-rewrite change cannot silently break a
page that shows a version as a badge.

Dead references and the stale exclude

  • No reference to a playbook index page remains. The guidance that assumed "every wiki ships an
    index.md, exclude it" is corrected in docs-aggregation-rules, add-catalogue-project,
    audit-catalogue-projects, project-manifest-reference and the catalogue auditor checklist, which
    now say: the wiki is plain Markdown, Home.md is the hub, _Sidebar.md drives the order and the
    navigation, and the catalogue entry alone decides what is published.
  • An exclude naming a file that no longer exists is confirmed to be a no-op — isExcluded filters the
    files the repository ships and nothing validates the patterns against a file list, so a stale pattern
    neither warns nor fails, and no message needed tightening. A test pins it.
  • No other project entry is touched.

Site configuration files: removed here, reported elsewhere

  • mkdocs.yml is deleted from this repository. It configured a Material/TechDocs site for docs/
    that nothing builds — the site is Astro + Starlight, and no workflow, recipe or script reads it.

  • just data-sync now reports, but never fails on, a project repository that still ships one
    (findLegacySiteConfig in src/lib/docs/aggregate.ts, called on the tree the aggregation already
    fetches, deduped per project, exported and unit-tested). The live sync inside this PR's own
    just validate printed exactly one line for each of the eight that still do:

    docs architests: mkdocs.yml is a repository site configuration and the portal ignores it — the
    catalogue entry alone decides what is published, so the repository can drop the file.
    … also aspire-resourcekit, build, build-sdk, containers, event-sourcing,
      sourcegenerator-framework, zodsharp
    

    It is an advisory rather than a gate, so each of those repositories can delete the file in its own
    pull request; stripMkdocsMarkup keeps tolerating the Material markup such a file stands for until
    then (containers is the live example), and the line disappears once the file is gone.

Tests (src/tests/unit/docs.test.ts)

  • link rewriting > keeps an absolute badge image beside a relative one and
    … keeps a scoped npm badge image unchanged.
  • docs exclude matching > a pattern for a file the repository no longer ships is a no-op — root
    selection for the playbook's shape (Home.md hub, _Sidebar.md excluded, index.md matching nothing).
  • legacy site configuration > … — detection at any depth, case-insensitively, absent from a plain
    Markdown tree, and no false positive from mkdocs.yml.bak/mkdocs-notes.md.

Validation

  • just validate passed as the pre-push hook on both pushes (no --no-verify, no admin merge, no
    force-push): format → lint → typecheck → 350 unit tests → asset/catalogue checks → build (live data
    sync, 269 pages) → discovery → link crawl → generated-output check → built-output tests.
  • bun run ci:build locally: astro check 0 errors / 0 warnings / 0 hints, catalogue check 17
    projects, 294 pages built, all checks green, dist tests 42 pass / 2 skip / 0 fail.
  • just test 350 pass / 0 fail; just format-check and just lint clean.

The remaining build warnings are pre-existing and come from upstream content, untouched here:
aspirec4's ```likec4 fence in a .md page, its gitignore code fence with no highlighter,
the Vite chunk-size advisory, and LikeC4's "no likec4 documents found in workspace".

The playbook deleted docs/wiki/index.md and mkdocs.yml: the wiki is plain Markdown with Home.md as the hub and _Sidebar.md as its whole navigation. Only the navigation file is excluded now, and the first use case no longer pins Purview.BuildSdk 1.0.4 - it uses the playbook's own LATEST placeholder, so the entry no longer contradicts the page it advertises, which deliberately states no version at all.
A page can show a registry badge instead of a version, so the aggregator must leave an absolute image URL exactly as written while still resolving a relative image beside it. Also covers an exclude naming a file the repository has deleted, which must stay a no-op rather than a warning or a failure.
A mirrored product wiki is plain Markdown: Home.md is the hub, _Sidebar.md drives the order and the navigation, and the catalogue entry alone decides what is published. A repository that still carries a site file (mkdocs.yml, a generated index.md) is a deviation the portal ignores rather than a requirement, and an exclude that names a deleted file is a no-op. Removes the guidance that assumed every wiki ships an index page and excluded it.
A repository may still carry mkdocs.yml beside its Markdown; the portal never reads it, because the catalogue entry's docs block decides what is published. The aggregation now reports it once per sync - an advisory that never fails the build, so the file can be removed upstream in its own time - and findLegacySiteConfig is exported and unit-tested against a real plain-Markdown tree.
mkdocs.yml configured a Material/TechDocs site for this repository's docs/ folder that nothing builds: the site is Astro + Starlight, and no workflow, recipe or script reads the file. Removing it makes this repository follow the rule its own aggregation guidance now states - the docs are plain Markdown and no site file is required.
…shows it

The advisory went to stderr, which the pipeline does not carry into the build log, so nothing outside a developer's terminal would ever have seen it. It is printed on stdout beside the sync's own page lines now, and repeated as a ::warning workflow command on GitHub Actions, so each repository that still ships mkdocs.yml can be found and cleaned up from a green build.
@kieronlanning
kieronlanning merged commit d1da459 into main Nov 8, 2026
1 check passed
@kieronlanning
kieronlanning deleted the fix/engineering-playbook-plain-markdown-wiki branch November 8, 2026 12:41
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant