Skip to content

ci: assert that a repo path quoted in a doc or build file exists - #773

Merged
DavidCozens merged 2 commits into
mainfrom
ci/quoted-path-gate
Aug 17, 2026
Merged

ci: assert that a repo path quoted in a doc or build file exists#773
DavidCozens merged 2 commits into
mainfrom
ci/quoted-path-gate

Conversation

@DavidCozens

@DavidCozens DavidCozens commented Aug 17, 2026

Copy link
Copy Markdown
Collaborator

Purpose

Two pieces of repository hygiene, no issue behind either.

.coderabbit.yaml had drifted from docs/NAMING.md in two places, so reviews
were being held to a rule the repository no longer states. And a repo-relative
path written in prose or in a build file is checked by nothing: mkdocs build --strict resolves Markdown links between pages, docs-links.yml resolves
external URLs, and neither sees a path in code font in a sentence, in a CMake
list, in a Compose mount or in a path filter. A rename leaves those green and
pointing nowhere — which is what four of them were doing.

Change Description

.coderabbit.yaml. Tier 1 is stated as docs/NAMING.md now states it:
decided by linkage, not by whether an integrator is meant to call the
identifier, so a library-internal class spanning two translation units from a
Core/Source/ *Private.h takes the prefix. The outX out-parameter clause is
removed — the S23.22 audit deleted that rule from NAMING.md, and the public API
carries two conventions (size_t* bytesRead, uint8_t* keyOut) with which one
wins still open; naming either here would decide by config what nobody has
decided. A path_instructions entry now covers build files, which matched no
entry at all. It includes *.mk alongside Makefile: solidsyslog.mk is the
make integration this repository actually ships.

The gate. scripts/check_references.py extracts repo-relative paths from
the tracked *.md, *.yaml, *.yml, *.cmake and CMakeLists.txt files and
asserts each exists, wired into docs-build beside check_platform_docs.py.
It runs in 0.1 s.

The extraction is deliberately narrow, because a heuristic loose enough to need
a long exception list is one that gets switched off. Three rules do the work,
and each was added to kill a class of noise the previous run surfaced rather
than chosen up front:

  • A token is a path only if its first segment is something git tracks at the top
    of the repository, or . / ... That drops #include <mbedtls/ssl.h>, every
    URL and every and/or without naming any of them. It costs a top-level
    directory renamed wholesale.
  • A path git ignores is a build artefact — it does not exist in a fresh
    checkout, so asserting it would be asserting that the build ran.
  • A YAML block scalar, and an inline run: / command: / entrypoint:, is
    shell rather than repository text: its paths are relative to a working
    directory the check cannot know. Nothing is lost, because a shell command
    naming a path that does not exist fails the job it sits in — which is exactly
    what a CMake list or a Compose mount does not do.
  • A path is written as one: its last segment carries a suffix, or it has the
    trailing slash that says it is a directory. This separates ci/pin-action-shas
    (a branch), Bdd/Targets/Common/BddTargetInteractive (a component) and
    Core/Platform (two directories written as one) from actual paths, at the cost
    of a directory referred to without its slash.

Five exceptions remain, each commented with why, and all five are one thing: a
document quoting a path as some other file would write it, in order to state a
rule about how paths are written. The docstring says that past a handful the
extraction is wrong and should be tightened rather than the list grown.

Structured for #740, which is the same idea one level up — assert that a
SolidSyslog symbol named in the docs resolves to a declared one. Same files,
same extraction pass, same exception problem. It is a second KINDS row, not a
second script: Kind holds how a reference is found, how it resolves, what to
say when it does not, and an unassertable hook that is handed every reference
of its kind at once so a check needing git asks git once. #740 is deliberately
not implemented here.

Test Evidence

Run over the tree before wiring in. The first pass found 75, all but a handful
of them noise; each tightening above removed a class, ending at 8: 4 real stale
references and 4 illustrative ones. Fixed in this PR, which is the evidence the
gate works:

  • Bdd/Targets/FreeRtos/README.md — three links ../../ deep where the file
    sits three levels down. Bdd/README.md, docs/containers.md and
    .devcontainer/devcontainer.json all resolved to nothing on GitHub and in a
    clone. Line 64 of the same file already had it right.
  • docs/misra-deviations.md D.004 — named Core/Source/RecordStore.c, which
    has been SolidSyslogRecordStore.c since the prefix rule this PR's first
    commit restates.

Negative test: a code span, a Markdown link and a fenced-block path, each naming
a file that does not exist, were added to docs/bdd.md and all three were
caught. A run outside a git checkout exits 1 rather than finding nothing and
passing.

python3 scripts/check_references.py and python3 scripts/check_platform_docs.py
both green. markdownlint-cli2 v0.22.1 clean over the two changed .md files. No
production source changed, so no clang-format reflow and no misra_renumber.py.

Areas Affected

.coderabbit.yaml, scripts/, the docs-build CI lane, and two documentation
files. No production source, no public API, no build behaviour.

Summary by CodeRabbit

  • New Features

    • Added automated validation for repository-relative paths referenced in documentation and build files.
    • Validation reports missing paths with file and line details.
  • Documentation

    • Corrected broken links in FreeRTOS documentation.
    • Updated MISRA deviation records to reference the correct source file.
  • Chores

    • Improved naming guidance for C/C++ identifiers and added conventions for build and workflow files.

DavidCozens and others added 2 commits August 17, 2026 18:19
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Aug 17, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Caution

Review failed

Failed to post review comments.

GitHub was unavailable or timed out while CodeRabbit was posting the review. Please request a new review later if the pull request still needs one. This happened while posting 3 inline comments. Use @coderabbitai full review to retry the review.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 7b49f9e3-9e46-49f9-9101-5328949fc07d

📥 Commits

Reviewing files that changed from the base of the PR and between 8518ab6 and d6da3df.

📒 Files selected for processing (5)
  • .coderabbit.yaml
  • .github/workflows/ci.yml
  • Bdd/Targets/FreeRtos/README.md
  • docs/misra-deviations.md
  • scripts/check_references.py

Included review availability: 1 review is currently available. Based on recent review activity, included reviews refill at 2 per hour.

⏰ Context from checks skipped due to timeout. (14)
  • GitHub Check: bdd-freertos-qemu-plustcp
  • GitHub Check: bdd-linux-syslog-ng
  • GitHub Check: build-freertos-host-tdd-plustcp
  • GitHub Check: build-freertos-target-lwip
  • GitHub Check: analyze-iwyu
  • GitHub Check: build-windows-msvc
  • GitHub Check: sanitize-linux-gcc
  • GitHub Check: analyze-iwyu-freertos-lwip
  • GitHub Check: analyze-iwyu-freertos-plustcp
  • GitHub Check: analyze-cppcheck
  • GitHub Check: analyze-tidy-freertos-plustcp
  • GitHub Check: analyze-tidy-freertos-lwip
  • GitHub Check: integration-windows-openssl
  • GitHub Check: analyze-tidy
⚠️ CI failures not shown inline (2)

GitHub Actions: CodeQL / analyze-codeql: ci: assert that a repo path quoted in a doc or build file exists

Conclusion: failure

View job details

##[group]Run github/codeql-action/init@5595ccaf912efad79be6eef63a5619ff05969be3
 with:
   languages: c-cpp
   build-mode: manual
   queries: security-extended
   analysis-kinds: code-scanning
   ***REDACTED_SECRET_ASSIGNMENT***
   matrix: null
   debug: false
   check-run-id: 95446486014
 env:
   ANALYSIS_PLATFORMS: Posix;StdAtomic;OpenSsl
 ##[endgroup]
 Job run UUID is 226e28eb-b996-47eb-9705-ba553a9c0934.
 ##[warning]An unexpected error occurred when sending a status report: No server is currently available to service your request. Sorry about that. Please try resubmitting your request and contact us if the problem persists.
 ##[error]Encountered an error while trying to determine feature enablement: HttpError: No server is currently available to service your request. Sorry about that. Please try resubmitting your request and contact us if the problem persists.

GitHub Actions: CodeQL / 0_analyze-codeql.txt: ci: assert that a repo path quoted in a doc or build file exists

Conclusion: failure

View job details

##[group]Run github/codeql-action/init@5595ccaf912efad79be6eef63a5619ff05969be3
 with:
   languages: c-cpp
   build-mode: manual
   queries: security-extended
   analysis-kinds: code-scanning
   ***REDACTED_SECRET_ASSIGNMENT***
   matrix: null
   debug: false
   check-run-id: 95446486014
 env:
   ANALYSIS_PLATFORMS: Posix;StdAtomic;OpenSsl
 ##[endgroup]
 Job run UUID is 226e28eb-b996-47eb-9705-ba553a9c0934.
 ##[warning]An unexpected error occurred when sending a status report: No server is currently available to service your request. Sorry about that. Please try resubmitting your request and contact us if the problem persists.
 ##[error]Encountered an error while trying to determine feature enablement: HttpError: No server is currently available to service your request. Sorry about that. Please try resubmitting your request and contact us if the problem persists.
🧰 Additional context used
📓 Path-based instructions (3)
**/*.{md,mdc}

📄 CodeRabbit inference engine (CLAUDE.md)

Use two-digit zero-padded epic and story identifiers in issue titles, issue bodies, CLAUDE.md, and memory files; do not apply this convention to code, ADRs, or other repository documentation.

Files:

  • Bdd/Targets/FreeRtos/README.md
  • docs/misra-deviations.md
Bdd/**

⚙️ CodeRabbit configuration file

Bdd/**: BDD infrastructure. Two hard rules:

  • .feature files are the product-owner contract — never edit a
    feature file to fix breakage. When an internal constant/port/name
    moves and breaks a scenario, compensate in the Python step layer.
  • Python steps must stay Windows-portable: process.kill() not
    signal.SIGKILL; os.path.join (not forward-slash literals) for
    paths passed to CreateProcess; 127.0.0.1 not localhost. Prefer
    test-side portability fixes over changing production semantics.

Files:

  • Bdd/Targets/FreeRtos/README.md
**/*.md

⚙️ CodeRabbit configuration file

**/*.md: Documentation prose. Use UK English. Flag statements that contradict
the authoritative references (docs/NAMING.md, docs/misra-deviations.md,
CLAUDE.md) — e.g. a naming shape or tier claim that no longer matches
the code. Keep story/epic references in the padded E00 / S00.00
form. Do not nitpick Conventional-Commits-style headings.

Files:

  • Bdd/Targets/FreeRtos/README.md
  • docs/misra-deviations.md
🧠 Learnings (14)
📚 Learning: 2026-07-30T20:58:05.395Z
Learnt from: DavidCozens
Repo: cososo-ltd/solid-syslog PR: 677
File: .github/workflows/ci.yml:0-0
Timestamp: 2026-07-30T20:58:05.395Z
Learning: When reviewing this repo’s GitHub Actions workflow YAML (shell commands inside `run:` steps), do NOT apply the repo’s “absolute-path requirement” from `CLAUDE.md` “Bash execution rules,” since that rule targets interactive working-session tool invocations. For CI steps that perform the same purpose, keep using the established relative-path convention and/or `$(pwd)` when referencing paths, unless workflow-specific guidance in the repo explicitly overrides it.

Applied to files:

  • .github/workflows/ci.yml
📚 Learning: 2026-08-05T11:44:28.296Z
Learnt from: DavidCozens
Repo: cososo-ltd/solid-syslog PR: 703
File: .github/workflows/codeql.yml:13-17
Timestamp: 2026-08-05T11:44:28.296Z
Learning: For GitHub Actions workflow YAML files, do not raise stock yamllint-style findings about unquoted `on:`, spaced branch lists such as `[ main ]`, or missing YAML document-start markers while this repository lacks a yamllint configuration and CI gate covering all workflows. Reconsider these findings only after yamllint is configured and enforced in CI for every workflow file.

Applied to files:

  • .github/workflows/ci.yml
📚 Learning: 2026-08-01T19:48:52.950Z
Learnt from: DavidCozens
Repo: cososo-ltd/solid-syslog PR: 690
File: Core/Source/SolidSyslogStatic.c:27-32
Timestamp: 2026-08-01T19:48:52.950Z
Learning: In C source, header, and Markdown comments or prose, name API functions in full or use the documented <Class>_Function placeholder. Do not flag established type-family shorthand such as "Null* siblings," "NullSender," "NullStore," or "NullBuffer." Existing wildcard function notation such as "SolidSyslogNull*_Get()" is outside this rule and should be handled separately.

Applied to files:

  • Bdd/Targets/FreeRtos/README.md
  • docs/misra-deviations.md
📚 Learning: 2026-08-06T11:52:57.204Z
Learnt from: DavidCozens
Repo: cososo-ltd/solid-syslog PR: 710
File: docs/iec62443.md:0-0
Timestamp: 2026-08-06T11:52:57.204Z
Learning: For Markdown files in cososo-ltd/solid-syslog, use UK English, check for contradictions with docs/NAMING.md, docs/misra-deviations.md, and CLAUDE.md, and format epic and story references with zero-padding. API identifiers are exempt and do not need to be written in full.

Applied to files:

  • Bdd/Targets/FreeRtos/README.md
  • docs/misra-deviations.md
📚 Learning: 2026-08-10T06:09:40.460Z
Learnt from: DavidCozens
Repo: cososo-ltd/solid-syslog PR: 729
File: scripts/check_platform_docs.py:263-281
Timestamp: 2026-08-10T06:09:40.460Z
Learning: In solid-syslog Markdown documentation, apply the one-claim-one-place rule: state each rule or exception at its authoritative location, and avoid repeating mechanism-specific exceptions in summaries, CI lane descriptions, or nearby text when the generated output or linked authoritative rule already provides that context.

Applied to files:

  • Bdd/Targets/FreeRtos/README.md
  • docs/misra-deviations.md
📚 Learning: 2026-08-11T22:46:51.793Z
Learnt from: DavidCozens
Repo: cososo-ltd/solid-syslog PR: 752
File: docs/rfc-compliance.md:0-0
Timestamp: 2026-08-11T22:46:51.793Z
Learning: Use UK English spelling in Markdown documentation prose for the cososo-ltd/solid-syslog project. When quoting an official RFC section title verbatim, preserve the RFC's original spelling rather than changing it.

Applied to files:

  • Bdd/Targets/FreeRtos/README.md
  • docs/misra-deviations.md
📚 Learning: 2026-08-11T09:17:25.898Z
Learnt from: DavidCozens
Repo: cososo-ltd/solid-syslog PR: 749
File: Core/Interface/SolidSyslogOriginSd.h:0-0
Timestamp: 2026-08-11T09:17:25.898Z
Learning: In RFC compliance documentation and public interface comments, document caller or integrator obligations using the concise construction “the [constraint] is [actor]'s to observe/bound” when it remains explicit. Prefer this established wording over longer responsibility phrasing.

Applied to files:

  • Bdd/Targets/FreeRtos/README.md
  • docs/misra-deviations.md
📚 Learning: 2026-07-15T17:01:34.247Z
Learnt from: DavidCozens
Repo: cososo-ltd/solid-syslog PR: 623
File: docs/security-levels.md:67-67
Timestamp: 2026-07-15T17:01:34.247Z
Learning: For MkDocs-authored security (and similarly structured) Markdown pages that embed SVG diagrams via `<object type="image/svg+xml" data="...">` with an `<img src="..." ...>` fallback, preserve the intentionally asymmetric relative paths: set the `object[data]` attribute relative to the rendered page URL (often page-relative like `../assets/...`), because MkDocs 1.6.1’s relative-path treeprocessor rewrites only `a[href]` and `img[src]` (not `object[data]`). Separately, set the fallback `img[src]` path to match how GitHub renders the nested `<img>` after sanitizing/removing `<object>` (e.g., `assets/...` relative to the Markdown file’s directory such as `docs/`). Don’t “symmetrize” these paths during review.

Applied to files:

  • docs/misra-deviations.md
📚 Learning: 2026-08-06T11:52:59.963Z
Learnt from: DavidCozens
Repo: cososo-ltd/solid-syslog PR: 710
File: docs/iec62443.md:165-167
Timestamp: 2026-08-06T11:52:59.963Z
Learning: In SolidSyslog Markdown documentation, treat `Log()` and `Service()` as established shorthand for the producer/consumer seam. Do not request replacing them with `SolidSyslog_Log` or `SolidSyslog_Service` in an individual document. Any terminology change should be made only through a repository-wide documentation decision and applied consistently across the documentation.

Applied to files:

  • docs/misra-deviations.md
📚 Learning: 2026-08-09T21:28:23.422Z
Learnt from: DavidCozens
Repo: cososo-ltd/solid-syslog PR: 711
File: docs/misra-deviations.md:43-45
Timestamp: 2026-08-09T21:28:23.422Z
Learning: For published SolidSyslog documentation Markdown pages, flag a Markdown link to a repository source-tree path only when an in-site generated API page exists for that target; prefer linking to the generated API page. Do not flag external references such as GitHub issues or pull requests, external products, example repositories, release-please, or container image repositories. Also, treat literal `GIT_REPOSITORY https://github.com/...` text in CMake examples as plain code/configuration text, not as a Markdown link.

Applied to files:

  • docs/misra-deviations.md
📚 Learning: 2026-08-09T22:04:14.484Z
Learnt from: DavidCozens
Repo: cososo-ltd/solid-syslog PR: 711
File: docs/platforms/fatfs/setup.md:0-0
Timestamp: 2026-08-09T22:04:14.484Z
Learning: In Markdown documentation, do not flag the phrase “fill the rest of what your build needs” as a preposition error. Here, “the rest of” correctly governs the noun clause; replacing it with “fill the rest with what your build needs” changes the intended meaning.

Applied to files:

  • docs/misra-deviations.md
📚 Learning: 2026-08-10T16:40:28.155Z
Learnt from: DavidCozens
Repo: cososo-ltd/solid-syslog PR: 730
File: docs/iec62443.md:0-0
Timestamp: 2026-08-10T16:40:28.155Z
Learning: When editing solid-syslog documentation other than docs/tls.md, do not hand-maintain duplicate enumerations of TLS contract obligations. Link to docs/tls.md as the authoritative contract instead, since duplicate lists can become stale; rely on generated platform manifests to prevent documentation drift.

Applied to files:

  • docs/misra-deviations.md
📚 Learning: 2026-08-12T20:10:50.363Z
Learnt from: DavidCozens
Repo: cososo-ltd/solid-syslog PR: 759
File: docs/iec62443.md:47-47
Timestamp: 2026-08-12T20:10:50.363Z
Learning: In cososo-ltd/solid-syslog documentation, use bare names such as `Resolver`, `Datagram`, `Stream`, `Sender`, `Buffer`, `Store`, `Mutex`, `AtomicCounter`, `StructuredData`, and `SecurityPolicy` for architectural roles. Use the full `SolidSyslog<Class>` form only when referring to the corresponding public C type or API identifier. Follow the terminology established in `docs/roles/index.md`, `docs/porting.md`, and `docs/core/index.md`.

Applied to files:

  • docs/misra-deviations.md
📚 Learning: 2026-08-13T15:07:17.665Z
Learnt from: DavidCozens
Repo: cososo-ltd/solid-syslog PR: 764
File: docs/security/triage-runbook.md:3-6
Timestamp: 2026-08-13T15:07:17.665Z
Learning: Documentation files under docs/ must link to published repository-root documents using repository-relative source paths, such as ../../SECURITY.md. The hooks/source_links.py build hook routes these links to generated published pages. Do not link directly to hand-written generated site paths such as docs/security/policy.md, because those links fail on GitHub and in repository clones.

Applied to files:

  • docs/misra-deviations.md
🪛 ast-grep (0.45.1)
scripts/check_references.py

[error] 121-127: Command coming from incoming request
Context: subprocess.run(
["git", "-C", ROOT, *arguments],
input=stdin,
capture_output=True,
text=True,
check=False,
)
Note: [CWE-78] Improper Neutralization of Special Elements used in an OS Command ('OS Command Injection').

(subprocess-from-request)


[warning] 114-114: File path is request-/variable-derived; validate and normalize to prevent path traversal.
Context: open(os.path.join(ROOT, relative), encoding="utf-8")
Note: [CWE-22] Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal').

(open-filename-from-request)

🪛 LanguageTool
docs/misra-deviations.md

[uncategorized] ~437-~437: Use a comma before “and” if it connects two independent clauses (unless they are closely connected and short).
Context: ...ripting, so the finding no longer arises and the deviation had nothing left to autho...

(COMMA_COMPOUND_SENTENCE_2)


[style] ~437-~437: Would you like to use the Oxford spelling “authorize”? The spelling ‘authorise’ is also correct.
Context: ...s and the deviation had nothing left to authorise. cppcheck-misra reports no 18.4 finding...

(OXFORD_SPELLING_Z_NOT_S)


[grammar] ~438-~438: Make sure that the singular noun after the number ‘18.4’ is correct.
Context: ...thorise. cppcheck-misra reports no 18.4 finding in SolidSyslogRecordStore.c; the supp...

(CD_POINT_CD_NN)

🪛 Ruff (0.16.1)
scripts/check_references.py

[warning] 56-57: Unparenthesized implicit string concatenation in collection

Did you forget a comma?

(ISC004)


[warning] 72-73: Unparenthesized implicit string concatenation in collection

Did you forget a comma?

(ISC004)


[warning] 119-119: Missing type annotation for *arguments

(ANN002)


[error] 122-122: subprocess call: check for execution of untrusted input

(S603)


[error] 123-123: Starting a process with a partial executable path

(S607)


[warning] 177-177: for loop variable word overwritten by assignment target

(PLW2901)


[warning] 179-180: Replace yield over for loop with yield from

Replace with yield from

(UP028)


[warning] 249-249: Missing return type annotation for special method __init__

Add return type annotation: None

(ANN204)


[warning] 293-294: Use a single if statement instead of nested if statements

(SIM102)

Walkthrough

Added a repository-reference validator for Markdown and build files. The CI workflow now runs it. Three FreeRTOS README links and one MISRA deviation reference were corrected. C/C++ naming and build-file review guidance was updated.

Changes

Repository reference validation

Layer / File(s) Summary
Reference scanner and resolver
scripts/check_references.py
Added Git-aware file discovery, path extraction, root-relative and file-relative resolution, exclusions, reference kinds, and validation reporting.
CI wiring and reference corrections
.github/workflows/ci.yml, Bdd/Targets/FreeRtos/README.md, docs/misra-deviations.md
The docs-build job runs scripts/check_references.py. Broken README links and the retired MISRA deviation path now reference the correct locations.
Naming and path review guidance
.coderabbit.yaml
Tier 1 naming guidance now uses linkage. The separate outX rule was removed. Review instructions now cover repository-relative paths in CMake, make, and workflow files.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Merge Risk: 🟡 Moderate · up to d6da3

The PR adds repository-reference validation and updates naming guidance, but the current implementation can still miss stale references to root-level files, while the configuration wording and file matching scope need tightening. Merge should wait for these bounded correctness and configuration issues to be addressed.

Sequence Diagram(s)

sequenceDiagram
  participant CI as docs-build
  participant Validator as scripts/check_references.py
  participant Repository as Git repository
  CI->>Validator: Run reference validation
  Validator->>Repository: Read tracked files and repository paths
  Repository-->>Validator: Return path data
  Validator->>Validator: Extract and resolve references
  Validator-->>CI: Return success or exit status 1
Loading
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 75.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title uses Conventional Commits format and clearly states the main change: validating repository paths in documentation and build files.
Description check ✅ Passed The description completes all required sections and provides clear purpose, implementation details, test evidence, and affected areas.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch ci/quoted-path-gate

Comment @coderabbitai help to get the list of available commands.

@DavidCozens
DavidCozens merged commit 8d9d744 into main Aug 17, 2026
38 of 39 checks passed
@DavidCozens
DavidCozens deleted the ci/quoted-path-gate branch August 17, 2026 18:10
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