Skip to content

ci: gate merges on the documentation validators - #255

Merged
axross merged 4 commits into
mainfrom
claude/issue-246-ffn3z6
Aug 19, 2026
Merged

ci: gate merges on the documentation validators#255
axross merged 4 commits into
mainfrom
claude/issue-246-ffn3z6

Conversation

@axross

@axross axross commented Aug 19, 2026

Copy link
Copy Markdown
Owner

Summary

Merge Checks ran four jobs — lint, typecheck, test, payload-artifacts — and none of them read docs/. That left this repository's 40 hand-written documents with no mechanical gate at all, while the installed living-project-documentation skill already ships five validators written for exactly that corpus. Each of them catches a defect that is invisible in review precisely because the file the author touched looks fine: a document nobody added to index.md, a link broken by a rename three documents away, a spec whose vocabulary never reached the glossary, a decision filename with an unreal date, a supersede chain left half-written. The repository has already run three renames of the kind these protect against (#228, #240, #244).

This adds a fifth Documentation job that runs all five against docs/, and node scripts/check-docs.mjs so a contributor runs exactly what CI runs. The runner is invoked directly rather than wrapped in an npm script — @axross's call, and the README command table already documents npx payload generate:importmap and npx payload generate:types the same way, so it stays the authoritative list of commands. Nothing stands between the workflow step and the gate, so the exit code the step branches on is the runner's own rather than one relayed by a package manager.

Why a project-owned runner rather than the shell loop the skill suggests. A gate over this corpus has four ways to pass, or to blame the wrong thing, that a one-liner has no room to close:

Silence What closes it
The validators go missing. The skill shipping them was renamed upstream days ago (#245, landed in #254) and the documented refresh printed Done! while never updating it. A glob matching nothing must not read as five-of-five green. the runner exits 2, naming the path it expected
The docs root goes missing. Each validator has a deliberate two-level opt-in: with no docs/index.md it exits 0 with "Nothing to check", so installing the skill never turns red a docs/ holding something else. This repository has adopted docs/. the runner exits 2 rather than letting five no-ops pass
A validator crashes. Node exits 1 on an uncaught exception — which is also how a validator reports findings, so a bug inside one would arrive as a documentation defect and CI would blame docs/ for it. scripts/validator-crash-guard.mjs, preloaded with node --import, ends a throw outside the 0/1/2 a validator can mean
The runner itself crashes. Same collision, one level up. its own main() is wrapped to exit 2

The last two were found by the independent review; both threads are resolved.

scripts/check-docs.mjs therefore exits 0 on pass, 1 on findings, and 2 when the gate could not run as intended — and the workflow step annotates 1 and 2 apart before re-raising the code, so a broken gate never reads as a documentation problem or vice versa.

Trade-offs. The job reaches an installed skill by path, which couples CI to a generated artifact. That coupling is the point — invoking the installed path is what keeps the validators current across refreshes, and vendoring copies would stop tracking upstream — but it means a future rename breaks CI. The exit-2 guard makes that break loud instead of silent, and docs/operations/agent-skills.md now records the obligation to repoint the runner in the same change. The job runs no npm ci: the runner and the validators it spawns import only the Node standard library.

Related issues

Closes #246

Verification

Every command below was run from the repository root, re-verified at dbd6cb3. Implementation ran in a delegated worker; every result here was re-run and confirmed independently before each push, rather than taken from the worker's report.

Command Result
npm run format exit 0 — no fixes applied
npm run lint exit 0 — 320 files checked, no fixes applied
npm run typecheck exit 0
node scripts/check-docs.mjs exit 0 — 5/5 validators passed (14 decision records, 5 specs, 25 indexed documents, 137 links across 40 documents)

A check that has only ever passed is not evidence of anything, so each condition was broken in turn, observed, and reverted. Nothing below reached a commit; git status was clean after each.

Condition broken Reported by Runner exit
conventions/routing.md entry removed from docs/index.md check-index 1
a relative link repointed to a non-existent document check-references 1
a glossary heading renamed away from its spec check-glossary 1
a decision record renamed to a dateless filename check-decision-naming 1
a superseded record's status flipped while superseded_by stayed check-decision-supersede 1
docs/index.md moved aside the runner's own guard 2
the installed validator directory moved aside the runner's own guard 2, naming the expected path and (ENOENT)
a throw injected into check-index.mjs's run() the crash guard 2, "the validator is at fault, not docs/"
a throw injected into the runner's own main() the runner's try/catch 2, "threw the error above before checking docs/"

Also confirmed:

  • The workflow step behaves correctly under bash -e (GitHub's default shell) with npm absent from PATH entirely. The run: body was extracted verbatim from the edited YAML and executed against a stub node returning each code: 0 → exit 0, no annotation; 1 → the findings annotation, exit 1; 2 → the gate-broken annotation, exit 2. Then run again against the real node on the real tree: exit 0.
  • The crash guard changes nothing else. Against the real installed validators: pass → 0, findings → 1, bad invocation (check-index.mjs docs extra) → 2, unadopted docs root → 0. Both crash shapes are covered — a synchronous throw during module evaluation and a rejected top-level await inside main().
  • The job needs no install. The tree was copied without node_modules/ and the runner exited 0 there.
  • package.json carries no script for it, and no check:docs reference remains anywhere in the repository.
  • The YAML parses and the docs job carries name: Documentation, actions/checkout@v7 and actions/setup-node@v7 (matching the sibling jobs, both GitHub's own actions left on major tags per docs/conventions/security.md), no npm ci step, and no cache key. The workflow-level on: gives it the same pull-request and push-to-main triggers as the other four.

Acceptance criteria

Criterion Status
A job runs all five validators against docs/, on PRs and pushes to main Met
Unindexing a document turns it red; restoring turns it green Met — exit 1, then exit 0
Each of the other four conditions turns it red on its own Met — four separate exit-1 runs
A deleted or renamed validator directory exits 2, naming the expected path Met
An absent docs/index.md exits 2 Met
The job passes on main as it stands Met — all five pass on the unmodified base tree, and this PR's Documentation job is green on every pushed head
node scripts/check-docs.mjs documented in the README command table; the counting sentence names it; package.json gains no script Met
REVIEW.md's Do Not Report list names the new job Met
Completes without npm ci, wall-clock below each existing job Met — on dbd6cb3: Documentation 12s, Lint 40s, Unit Tests 45s, Typecheck 51s, Payload Artifacts 52s
npm run lint and npm run typecheck pass Met — green in CI on every pushed head

Risks and breaking changes

No breaking change: the gate lands green, so the first thing it can catch is a regression.

  • npm run lint checks nothing under .github/ (recorded in docs/conventions/security.md), so the workflow's correctness rests on the YAML parse and the bash -e step simulation above rather than on the repository's own gate. GitHub's own expression and schema validation is exercised by this PR's own Merge Checks runs, which are green.
  • CI now depends on an installed skill's path. Mitigated by the exit-2 guard and the new obligation in docs/operations/agent-skills.md, but it is a real new coupling.
  • The crash guard replaces Node's default uncaught-exception handling inside each validator child. Deliberately scoped to the spawned validators and never to the runner — importing the guard would install those handlers on the runner itself and make its own crash exit 70, which the workflow would then annotate as a documentation finding. That is why the exit code lives only in the guard and the runner shares nothing with it but a file URL. The guard re-prints the error before exiting, so nothing is swallowed.
  • Discoverability rests on the README rather than on npm run. With no npm script, npm run no longer lists the command; the command table is where a contributor finds it, which is what makes keeping that table current load-bearing here. docs/conventions/directory-structure.md already requires consulting the README before changing verification commands.
  • Rollback is removing the docs job; nothing else depends on it.

Notes for reviewers

Start at scripts/check-docs.mjs — the exit-code contract is the load-bearing part, and everything else follows from it. scripts/validator-crash-guard.mjs is the other half of that contract and is not run directly.

The plan revision moved. Issue #246 originally required exposing the run as an npm script; @axross directed direct invocation instead on 2026-08-19, and the issue's plan now records that at revision sha256:d45b755c8f31b8df. Check the acceptance criteria against the current plan, not the archived original description.

Two decisions were settled at the plan-approval gate and are not open questions here:

One pre-existing inaccuracy was noticed and deliberately left alone as out of scope: REVIEW.md calls npm run test:unit "the Jest unit-test run" when the runner has been Vitest since #230. It sits in a paragraph this diff touches, so it is visible in the diff without being part of the change — happy to fix it here or in a separate pull request, whichever you prefer.

Merge Checks ran four jobs and none of them read `docs/`, so every defect
the installed `living-project-documentation` validators catch — an
unindexed document, a link broken by a rename three documents away, a
spec whose vocabulary never reached the glossary, a malformed decision
filename, a half-written supersede chain — reached `main` unless a
reviewer happened to notice it. Each is invisible in review precisely
because the file the author touched looks fine.

`scripts/check-docs.mjs` discovers the validators at their installed path
and runs each against `docs/`, streaming their own output. It exits 2
rather than 0 for the two ways this gate would otherwise pass while
checking nothing: a skill renamed or removed upstream leaves the
validator list empty, and an absent `docs/index.md` makes every validator
exit 0 with "Nothing to check" under its own two-level opt-in. The
Documentation job annotates that case apart from a documentation finding
and re-raises the runner's exit code.

The job runs no `npm ci`. The validators import only the Node standard
library and `npm run` executes a script without an install, so the gate
costs checkout plus Node setup and little else.

All five validators pass as things stand, so the gate lands green and the
first thing it catches is a regression.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DvYB79RNQgyuCd2jD9DboQ
@axross axross self-assigned this Aug 19, 2026
@axross

axross commented Aug 19, 2026

Copy link
Copy Markdown
Owner Author

@claude review


Generated by Claude Code

@github-actions

Copy link
Copy Markdown
Contributor

🚀 Preview deployment

https://btnopen-pr-255.vercel.app

Deployed 01fabc3. Served by an isolated Turso database (preview-pr-255) seeded from repository fixtures — no production data — with media in a dedicated preview store; both are destroyed automatically when this pull request closes. This URL is stable for the pull request and always serves the latest preview.

Comment thread scripts/check-docs.mjs
@claude

claude Bot commented Aug 19, 2026

Copy link
Copy Markdown

Code review

1 important, 0 nits

  • Importantscripts/check-docs.mjs misclassifies a validator that crashes with an uncaught exception as "reported findings" (exit 1) rather than "gate could not run" (exit 2), because Node's default uncaught-exception exit code is also 1. Verified by injecting a throw into a validator's run() locally. See inline comment for detail and a suggested direction.

Mandatory checks (per REVIEW.md)

  • Skill conformance — checked the diff against every installed skill whose trigger matches the changed surfaces: security.md's CI Workflow Supply Chain section (actions/checkout@v7 / actions/setup-node@v7 correctly left on major tags, no new third-party uses:), code-style.md's line-comment voice, directory-structure.md's scripts/*.mjs placement, and the installed living-project-documentation skill's conventions for the docs/operations/agent-skills.md edit (body placement, cross-reference resolution — reran check-references.mjs against the branch and it passes). No violations found.
  • Acceptance criteria — this PR closes Gate docs/ in Merge Checks by running the five living-project-documentation validators #246, whose plan-revision lists ten acceptance criteria. Checked each against the diff and a local worktree of the PR branch: baseline npm run check:docs (5/5 pass), the two gate-broken conditions (missing validator directory, missing docs/index.md → exit 2 with the expected message), a findings condition (unindexed document → exit 1), npm run exit-code propagation, the workflow YAML parses and its run: step behaves correctly under bash -e for exit 0/1/2, and the README/REVIEW.md documentation updates. The one criterion not directly checkable from the diff — the Documentation job's wall-clock time versus the four existing jobs — is confirmed from this PR's own Merge Checks run: Documentation finished in 13s versus Lint 54s, Payload Artifacts 52s, Typecheck 49s, Unit Tests 38s. All ten criteria are met.

This reviewer is advisory and does not gate merges.

Node exits 1 on an uncaught exception, and 1 is also how a validator
reports findings under `docs/`. A bug inside a validator therefore
reached the aggregator as a documentation defect, and the Documentation
job annotated it as one — blaming `docs/` for a failure `docs/` did not
cause. Reproduced by throwing from a validator's `run()`: the gate
reported "4/5 passed, 1 reported findings" and exited 1.

The validators ship with an installed skill and are not editable here,
so the two cases are separated from outside. `validator-crash-guard.mjs`
is preloaded into each validator with `node --import` and ends a throw
with an exit code no validator uses, which the aggregator then counts as
a check that could not run rather than as a verdict.

The guard changes nothing else: a pass still exits 0, findings 1, and a
bad invocation 2, each verified against the installed validators.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DvYB79RNQgyuCd2jD9DboQ
@axross

axross commented Aug 19, 2026

Copy link
Copy Markdown
Owner Author

@claude review


Generated by Claude Code

@github-actions

Copy link
Copy Markdown
Contributor

🚀 Preview deployment

https://btnopen-pr-255.vercel.app

Deployed 6ad9975. Served by an isolated Turso database (preview-pr-255) seeded from repository fixtures — no production data — with media in a dedicated preview store; both are destroyed automatically when this pull request closes. This URL is stable for the pull request and always serves the latest preview.

Comment thread scripts/check-docs.mjs Outdated
@claude

claude Bot commented Aug 19, 2026

Copy link
Copy Markdown

Code review — round 2 (on 6ad9975)

0 important, 1 nit

Reviewed the two commits landed since the round-1 review, on top of the full diff.

Round-1 fix verified

Reproduced the round-1 finding directly against this branch: injected a throw into check-index.mjs's run() in a worktree of 6ad9975 and ran npm run check:docs. The gate now reports 4/5 documentation validators passed, 1 could not run and exits 2 — correctly distinguishing the crash from a documentation finding rather than misreporting it as exit 1. Also independently confirmed validator-crash-guard.mjs exits 70 for both a synchronous module-eval throw and a rejected top-level await inside main(), so the guard covers both crash shapes it claims to.

  • Nit — a small duplication risk in the crash-guard exit code introduced by the fix; see the inline comment.

Mandatory checks (per REVIEW.md)

  • Skill conformance — re-checked the diff against every installed skill whose trigger matches the changed surfaces: security.md's CI Workflow Supply Chain section (actions/checkout@v7 / actions/setup-node@v7 correctly left on major tags, no new third-party uses: entry), code-style.md's line-comment voice (checked every // comment in both new .mjs files — all lowercase-led; the file-header /** */ blocks follow the same capitalized-JSDoc convention as the existing scripts/prune-preview-blobs.mjs), and directory-structure.md's scripts/*.mjs placement. No violations found.

  • Acceptance criteria — this PR closes Gate docs/ in Merge Checks by running the five living-project-documentation validators #246. Checked each of the issue's six acceptance criteria against a local worktree of 6ad9975, independently of the PR body's own verification table:

    • merge-checks.yaml has a docs job running all five validators against docs/ — confirmed by running npm run check:docs in the worktree: 5/5 pass.
    • The job fails when a document is removed from index.md — reproduced by deleting the conventions/routing.md entry: check-index.mjs reports the finding and the gate exits 1; reverted, back to 5/5 pass.
    • The job passes on main as it stands — confirmed (docs content is unchanged by this PR).
    • npm run check:docs is documented in the README command table with what it does and when to run it — confirmed.
    • REVIEW.md's Do Not Report list names the new gate — confirmed.
    • The job runs without npm ci — confirmed, no install step in the docs job.

    Also independently reproduced the two gate-broken (exit 2) conditions — a moved-aside validators directory and a moved-aside docs/index.md — both correctly reported the expected path/reason and exited 2. All criteria are met.

This reviewer is advisory and does not gate merges.

The aggregator carried its own copy of the guard's exit code, and two
copies of a wire constant drift. Importing the guard to share it would
be worse than the duplication: importing that module runs it, so the
aggregator would install the validators' crash handlers on itself and
answer its own crash with a validator's exit code.

So the code and its explanation stay in the guard, which is the only
side that needs either. The aggregator already treats any exit outside
0 and 1 as a check that reached no verdict, which is all it has to know,
and the guard now names the validator it was preloaded into.

Its own crash gets the same treatment one level up: Node would exit 1
from an uncaught exception here too, and the workflow reads 1 as
findings under `docs/`. It exits 2 instead, so a broken gate is never
reported as a documentation defect.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DvYB79RNQgyuCd2jD9DboQ
@axross

axross commented Aug 19, 2026

Copy link
Copy Markdown
Owner Author

@claude review


Generated by Claude Code

@github-actions

Copy link
Copy Markdown
Contributor

🚀 Preview deployment

https://btnopen-pr-255.vercel.app

Deployed 02848fb. Served by an isolated Turso database (preview-pr-255) seeded from repository fixtures — no production data — with media in a dedicated preview store; both are destroyed automatically when this pull request closes. This URL is stable for the pull request and always serves the latest preview.

@claude

claude Bot commented Aug 19, 2026

Copy link
Copy Markdown

Code review — round 3 (on 02848fb)

0 important, 0 nits

Reviewed the full diff fresh, including the two commits landed since round 2, in a local worktree of 02848fbf322d46a170c0225d1ab37574c715017c.

Round-2 fix verified

Reproduced the scenario directly: check-docs.mjs no longer redefines EXIT_VALIDATOR_CRASHED, and correctly relies on "any exit outside 0 and 1 is a check that reached no verdict" to catch the crash guard's exit 70. Confirmed by re-injecting a throw into check-index.mjs's run() — the gate still reports 4/5 documentation validators passed, 1 could not run and exits 2.

Also independently re-verified, by actually running the commands rather than reading the code:

  • Baseline npm run check:docs on the unmodified branch: 5/5 pass, exit 0.
  • Missing validators directory → exit 2, naming the expected path and (ENOENT).
  • Missing docs/index.md → exit 2, naming the cause.
  • An unindexed document (conventions/routing.md removed from index.md) → exit 1, check-index.mjs reports the finding.
  • The merge-checks.yaml run: block's exit-code branching, simulated under bash -e with a stub in place of npm: 0 → no annotation, exit 0; 1 → findings annotation, exit 1; 2 → gate-broken annotation, exit 2.
  • This PR's own CI (gh pr checks 255): Documentation job passes in 7s, below Lint (44s), Typecheck (45s), Unit Tests (51s), and Payload Artifacts (57s).

No new issues found in the round-3 commit or elsewhere in the diff.

Mandatory checks (per REVIEW.md)

  • Skill conformance — checked the diff against every skill whose trigger matches the changed surfaces: security.md's CI Workflow Supply Chain section (actions/checkout@v7 / actions/setup-node@v7 correctly left on major tags, no new third-party uses: entry), code-style.md's line-comment voice (every // comment in both new .mjs files is lowercase-led or a preserved proper noun; the header /** */ blocks are out-of-scope JSDoc), and directory-structure.md's scripts/*.mjs placement. No violations found.
  • Acceptance criteria — this PR closes Gate docs/ in Merge Checks by running the five living-project-documentation validators #246. Checked all ten criteria in the plan-revision against the diff and the worktree runs above: the docs job runs all five validators on PRs and pushes to main; an unindexed document turns it red and restoring turns it green; the two gate-broken conditions exit 2 naming the cause; the job passes on main's unchanged docs/ content; npm run check:docs is documented in the README command table and the counting sentence names it; REVIEW.md's Do Not Report list names the new gate; the job runs without npm ci and finishes well below the four existing jobs; npm run lint and npm run typecheck pass (confirmed via this PR's green CI runs). All ten are met.

This reviewer is advisory and does not gate merges.

@axross
axross marked this pull request as ready for review August 19, 2026 04:06
`package.json` no longer wraps `scripts/check-docs.mjs`, and the
Documentation job runs the file itself. The README command table
documents it the way it already documents `npx payload generate:importmap`
and `npx payload generate:types` — invoked directly, with the table still
the authoritative list of this repository's commands.

Nothing now stands between the workflow step and the gate, so the exit
code the step branches on is the runner's own rather than one relayed by
a package manager. Verified with `npm` absent from PATH: 0 exits clean,
1 takes the findings annotation, 2 takes the gate-broken one.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DvYB79RNQgyuCd2jD9DboQ
@github-actions

Copy link
Copy Markdown
Contributor

🚀 Preview deployment

https://btnopen-pr-255.vercel.app

Deployed dbd6cb3. Served by an isolated Turso database (preview-pr-255) seeded from repository fixtures — no production data — with media in a dedicated preview store; both are destroyed automatically when this pull request closes. This URL is stable for the pull request and always serves the latest preview.

@axross
axross marked this pull request as draft August 19, 2026 04:18
@axross

axross commented Aug 19, 2026

Copy link
Copy Markdown
Owner Author

@claude review


Generated by Claude Code

@claude

claude Bot commented Aug 19, 2026

Copy link
Copy Markdown

Code review — round 4 (on dbd6cb3)

0 important, 0 nits

Reviewed the full diff fresh in a local worktree of dbd6cb3c7f01bd41f084316da9d5d09cb2ef01e, including the commit landed since round 3.

Round-3-to-round-4 delta

The only commit since round 3 (02848fbdbd6cb3) is the direct-invocation change @axross requested: npm run check:docs is replaced by node scripts/check-docs.mjs in the workflow step, the README command table, and REVIEW.md, and check:docs is removed from package.json. It is a mechanical substitution with no logic change — confirmed by diffing 02848fb..dbd6cb3 directly.

Independently re-verified, by running the commands rather than reading the code

  • Baseline node scripts/check-docs.mjs on the unmodified worktree: 5/5 pass, exit 0.
  • Missing validators directory (.claude/skills/living-project-documentation/scripts/ moved aside) → exit 2, naming the expected path and (ENOENT).
  • Missing docs/index.md → exit 2, naming the cause.
  • A throw injected into check-index.mjs's run()validator-crash-guard.mjs catches it, reports "the validator is at fault, not docs/", exits 70, and the aggregator correctly reports "4/5 documentation validators passed, 1 could not run" and exits 2 — not the misclassified exit 1 from round 1.
  • The workflow step's exit-code branching, simulated directly against bash -e with a stub node in place of the real one: 0 → clean exit, no annotation; 1 → findings annotation, exit 1; 2 → gate-broken annotation, exit 2.
  • package.json carries no check:docs script, and no reference to it remains anywhere in the repository (grep -rn "check:docs" matches only the runner's own inline mention in a comment).
  • This PR's own CI (gh pr checks 255): Documentation passes in 12s, below Lint (40s), Typecheck (51s), Unit Tests (45s), and Payload Artifacts (52s).

No new issues found in the round-4 commit or elsewhere in the diff.

Mandatory checks (per REVIEW.md)

  • Skill conformance — checked the diff against every skill whose trigger matches the changed surfaces: security.md's CI Workflow Supply Chain section (actions/checkout@v7 / actions/setup-node@v7 correctly left on major tags, no new third-party uses: entry, no secrets in the new job), code-style.md's line-comment voice (every // comment in both .mjs files is lowercase-led or a preserved proper noun/identifier; the header /** */ blocks are out-of-scope JSDoc), directory-structure.md's scripts/*.mjs placement, and the installed living-project-documentation skill's conventions for the docs/operations/agent-skills.md edit. No violations found.
  • Acceptance criteria — this PR closes Gate docs/ in Merge Checks by running the five living-project-documentation validators #246, whose plan-revision (sha256:d45b755c8f31b8df) lists ten criteria. Checked each against the diff and the worktree runs above: the docs job runs all five validators on PRs and pushes to main; an unindexed document turns it red and restoring turns it green; the two gate-broken conditions exit 2 naming the cause; the job passes on main's unchanged docs/ content; node scripts/check-docs.mjs is documented in the README command table and the counting sentence names it, with package.json gaining no script; REVIEW.md's Do Not Report list names the new gate; the job runs without npm ci and finishes below the four existing jobs; npm run lint and npm run typecheck pass (green in this PR's CI). All ten are met.

This reviewer is advisory and does not gate merges.

@axross
axross marked this pull request as ready for review August 19, 2026 04:23
@axross
axross merged commit cde3c1a into main Aug 19, 2026
8 checks passed
@axross
axross deleted the claude/issue-246-ffn3z6 branch August 19, 2026 05:05
@github-actions

Copy link
Copy Markdown
Contributor

🚀 Preview deployment

Torn down — the isolated Turso database (preview-pr-255) and this pull request's preview media were destroyed.

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.

Gate docs/ in Merge Checks by running the five living-project-documentation validators

2 participants