Skip to content

Add CI gating pipeline with docs gate policy, ruleset, and repovec-ci - #12

Merged
leynos merged 17 commits into
mainfrom
ci-gating-pipeline-kpquh2
Apr 16, 2026
Merged

Add CI gating pipeline with docs gate policy, ruleset, and repovec-ci#12
leynos merged 17 commits into
mainfrom
ci-gating-pipeline-kpquh2

Conversation

@leynos

@leynos leynos commented Apr 11, 2026

Copy link
Copy Markdown
Owner

Summary

  • Adds a complete CI gating pipeline with test gates, docs gates, and a versioned enforcement policy. The changes include a new policy helper, a revised GitHub Actions workflow, and a versioned GitHub ruleset payload. Documentation and roadmaps updated to reflect the new governance model.
  • New: crates/repovec-ci (library and CLI) with unit tests and BDD tests
  • New: crates/repovec-ci/tests/docs_gate_policy_bdd.rs
  • New: crates/repovec-ci/tests/features/docs_gate.feature
  • New: crates/repovec-ci/src/main.rs and src/lib.rs
  • New: .github/rulesets/main-ci-gating.json
  • Updated: docs and roadmap docs to reflect gating model and policy payload
  • Documentation updates: docs/execplans/1-1-3-ci-gating-pipeline.md, docs/users-guide.md, docs/developers-guide.md, docs/repovec-appliance-technical-design.md, and docs/contents.md
  • Updated: .github/workflows/ci.yml to explicitly gate the CI gates and integrate the docs-gate flow

Changes

  • New: .github/rulesets/main-ci-gating.json
  • Updated: .github/workflows/ci.yml
  • New: crates/repovec-ci (library and CLI) with unit tests and BDD tests
  • New: crates/repovec-ci/tests/docs_gate_policy_bdd.rs
  • New: crates/repovec-ci/tests/features/docs_gate.feature
  • New: crates/repovec-ci/src/main.rs and src/lib.rs
  • New: docs/execplans/1-1-3-ci-gating-pipeline.md
  • New: docs/contents.md and docs/developers-guide.md updates
  • New: docs/users-guide.md
  • Updated: docs/repovec-appliance-technical-design.md (governance and CI gating section)
  • Updated: docs/roadmap.md reflecting gating status and policy payload
  • The docs/execplans/1-1-3-ci-gating-pipeline.md document introduced as part of execution plan
  • Updated repository governance references in docs

Rationale

  • Provides a versioned, testable plan and a working implementation for CI gating that aligns with the Make targets and the repository governance model. Commit gates are defined as core checks; branch protection or equivalent is documented as an external dependency.

Design and policy

  • Workstreams (summary)

    1. Define the enforcement model (branch protection vs manual gates) and gate names.
    2. Refactor CI into explicit gate jobs in the workflow.
    3. Introduce a testable CI-policy helper (Rust crate) with unit and behavioural tests.
    4. Update documentation to capture the enforcement model and guidance for maintainers.
    5. Verify locally and in GitHub with clear verification steps.
  • Gate names and structure

    • build, check-fmt, lint, test, docs-gate as required checks; markdown docs gates gated by docs changes via policy.

Verification and tests

  • Local verification should exercise Make gate commands: make build, make check-fmt, make lint, make test, and if docs changed: make markdownlint, make nixie.
  • Remote verification: PRs changing code require core gates; PRs changing docs trigger docs gate; a failing required check blocks merge; branch protection rules should reference the final job names.

Risks and mitigations

  • Branch protection may be manual if no automation exists; the plan specifies how to configure and verify.
  • The policy logic is implemented in Rust to be testable; YAML-only governance is avoided.

Definition of done

  • Workflow updated and merged; required checks configured and verified; local gates pass; docs updated; final PR demonstrates blocking merges as intended.

How to review

  • Review the execution plan for accuracy and alignment with Make targets and governance expectations. Confirm feasibility given current GitHub setup and the path to enabling the ruleset.

◳ Generated by DevBoxer ◰


ℹ️ Tag @devboxerhub to ask questions and address PR feedback

📎 Task: https://www.devboxer.com/task/a54195fa-ed7a-4ad8-b998-6e02f0892b54

Summary by Sourcery

Introduce a versioned CI gating model with explicit workflow jobs, a policy helper crate, and supporting documentation to govern required checks for code and documentation changes.

New Features:

  • Add a repovec-ci Rust crate and CLI to evaluate documentation gate requirements from changed files.
  • Add a docs-gate job to CI that conditionally runs Markdown linting and Mermaid validation based on repository changes.
  • Introduce a versioned GitHub repository ruleset payload to enforce required CI checks on the main branch.

Enhancements:

  • Refactor the CI workflow into separate build, formatting, lint, test, and docs-gate jobs aligned with Make targets.
  • Extend the Rust workspace configuration to include the new repovec-ci crate and rstest-bdd testing dependencies.

Documentation:

  • Add a CI gating execution plan, developers guide, users guide, and documentation index describing the governance model, gate set, and docs-gate behaviour.
  • Update technical design and roadmap documents to capture the CI enforcement model and the status of the gating pipeline task.

Tests:

  • Add unit tests and BDD scenarios for the docs-gate classification policy in the repovec-ci crate to validate change classification and Mermaid detection behaviour.

….1.3

Add a comprehensive execution plan document for roadmap item 1.1.3 that outlines the current state, delivery goals, constraints, workstreams, and verification steps for implementing CI gating pipeline improvements. This includes enforcing required checks, aligning workflows to Make targets, managing branch protection, introducing a testable CI policy helper, and updating maintainer-facing documentation.

Co-authored-by: devboxerhub[bot] <devboxerhub[bot]@users.noreply.github.com>
@coderabbitai

coderabbitai Bot commented Apr 11, 2026

Copy link
Copy Markdown

Add CI gating pipeline with docs-gate policy, ruleset, and repovec-ci

This PR introduces a versioned CI gating pipeline, implementing roadmap item 1.1.3 as detailed in the new execution plan (docs/execplans/1-1-3-ci-gating-pipeline.md). It adds a new Rust crate and CLI (crates/repovec-ci) that provides a testable CI-policy helper with unit and BDD test coverage, refactors the GitHub Actions workflow into explicit gate jobs, and adds a repository ruleset payload for required-check enforcement.

Key Changes

Core Implementation

  • New crates/repovec-ci crate provides a public API (DocsGateReason, DocsGatePlan, MermaidDetection, evaluate_docs_gate_in, evaluate_docs_gate_with) implementing documentation-gate classification logic with support for Mermaid diagram detection
  • CLI binary (repovec-ci) with --changed-file (repeatable) and --stdin input modes, emitting GitHub Actions-style key=value output for downstream gate requirements
  • Comprehensive test coverage: unit tests in docs_gate_unit.rs plus BDD scenarios in tests/features/docs_gate.feature with rstest-bdd macros

Workflow and Governance

  • .github/workflows/ci.yml: refactored into five explicit gate jobs (build, check-fmt, lint, test, docs-gate) mapped to make targets, with docs-gate conditionally running markdownlint and nixie based on changed-file classification
  • .github/rulesets/main-ci-gating.json: new versioned repository ruleset enforcing required status checks on main branch
  • Conservative fallback gating when changed-file information is unavailable or unreadable files are encountered

Documentation

  • docs/developers-guide.md: new maintainer guide documenting Make-target gates, stable job names, CI policy-helper public API signatures, and repovec-ci CLI specification
  • docs/users-guide.md: new contributor guide explaining documentation-gate and Mermaid validation inputs, fallback behaviour, and CI decision publication
  • docs/repovec-appliance-technical-design.md: new "Repository governance and CI gating" section defining required checks and conditional validation
  • docs/contents.md: new documentation index
  • docs/roadmap.md: updated status for item 1.1.3 to reflect workflow implementation and versioned ruleset readiness
  • docs/execplans/1-1-3-ci-gating-pipeline.md: execution plan documenting implementation state, workstreams, verification steps, and definition of done

Progress and Remediation

  • Previous reviewer warnings addressed: lib.rs reduced below 400 lines; doctests added; main.rs refactored to resolve bumpy-road-function lint failure
  • Snapshot tests integrated via insta dev-dependency with CLI output coverage

Verification

  • Local gates exercisable via make targets
  • Remote gates verified when documentation changes trigger docs-gate job
  • Ruleset enforcement pending GitHub activation once workflow is merged

Walkthrough

Add a new repovec-ci Rust crate and CLI to classify changed files and Mermaid presence, restructure CI into discrete jobs including a docs-gate job, add a versioned GitHub ruleset enforcing required checks on refs/heads/main, and add related tests, documentation and execution plans.

Changes

Cohort / File(s) Summary
CI Infrastructure
\.github/rulesets/main-ci-gating.json, \.github/workflows/ci.yml
Add a versioned GitHub ruleset requiring checks (build, check-fmt, lint, test, docs-gate) for refs/heads/main. Split CI into separate jobs, promote workflow-level env, remove coverage/upload steps, and add docs-gate job that computes changed files and conditionally runs markdownlint and nixie.
repovec-ci crate & CLI
crates/repovec-ci/Cargo.toml, crates/repovec-ci/src/lib.rs, crates/repovec-ci/src/main.rs
Add a new crate and CLI that classify changed files, detect Mermaid diagrams (Present/Absent/Unknown), and emit a stable DocsGatePlan (flags, reason, matched files, conservative fallback). Export public enums/structs and evaluators for workflow consumption.
repovec-ci tests
crates/repovec-ci/tests/*, crates/repovec-ci/tests/features/docs_gate.feature
Add unit and BDD tests (rstest, rstest-bdd) covering markdown/config classification, missing-input conservative behaviour, Mermaid detection outcomes, and expected DocsGatePlan assertions.
Workspace config
Cargo.toml
Register crates/repovec-ci as a workspace member and add rstest-bdd and macros to workspace dependencies for behavioural tests.
Documentation & Plans
docs/contents.md, docs/developers-guide.md, docs/users-guide.md, docs/execplans/1-1-3-ci-gating-pipeline.md, docs/repovec-appliance-technical-design.md, docs/roadmap.md
Add and update documentation describing the docs-gate policy, CI job names and Make targets, conservative fallback for missing changed-file lists, execution plan for CI gating, and roadmap status reflecting the versioned ruleset payload.

Sequence Diagram(s)

sequenceDiagram
    autonumber
    participant GH as "GitHub Actions"
    participant CLI as "repovec-ci CLI"
    participant FS as "Filesystem"
    participant WF as "Workflow Jobs"

    GH->>CLI: Provide changed-file list (--changed-file / stdin)
    CLI->>FS: Read listed files and scan for "```mermaid"
    CLI->>CLI: Compute DocsGatePlan (should_run, docs_gate_required, nixie_required, reason, matched_files, conservative_fallback_files)
    CLI->>GH: Emit key=value outputs (GITHUB_OUTPUT)
    GH->>WF: Publish `docs-gate` check; conditionally run markdownlint and nixie based on outputs
Loading

Poem

🚧 Gates awaken on each commit,
Files and diagrams now face the test,
Scan the diffs, decide and emit,
CI stands firm and blocks the rest,
Merge flow hums; let quality rest.

🚥 Pre-merge checks | ✅ 7
✅ Passed checks (7 passed)
Check name Status Explanation
Title check ✅ Passed The title directly describes the main changeset: adding a complete CI gating pipeline with docs gate policy, ruleset, and the repovec-ci crate.
Description check ✅ Passed The description is comprehensive and related to the changeset, detailing new crates, files, documentation updates, and the gating pipeline implementation.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.
Testing ✅ Passed All new Rust functionality is properly guarded by comprehensive test coverage: lib.rs includes runnable doctests, unit tests, and BDD scenarios covering all decision paths and edge cases; main.rs is protected by snapshot tests and unit tests; workflow correctly implements conservative fallback when changed-file data is unavailable.
User-Facing Documentation ✅ Passed New user-facing functionality is comprehensively documented in docs/users-guide.md with clear explanation of documentation gate decision logic, conservative fallback behaviour, and Mermaid validation rules, aligning precisely with implementation.
Developer Documentation ✅ Passed The developers guide comprehensively documents all new APIs, the cap-std dependency rationale, architectural boundaries, and the complete repovec-ci binary interface including all eight output keys.
Module-Level Documentation ✅ Passed All four new Rust modules in crates/repovec-ci carry comprehensive module-level docstrings using standard Rust documentation comment syntax (//!). Each docstring clearly articulates the module's purpose and utility.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch ci-gating-pipeline-kpquh2

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

@sourcery-ai

sourcery-ai Bot commented Apr 11, 2026

Copy link
Copy Markdown

Reviewer's Guide

Implements a versioned CI gating model by refactoring the GitHub Actions workflow into explicit gate jobs, introducing a dedicated Rust helper crate and CLI to decide when documentation checks should run, wiring that helper into a new docs-gate job, and documenting the enforcement model alongside a versioned GitHub ruleset payload and updated maintainer/user docs.

Sequence diagram for docs-gate job using repovec-ci helper

sequenceDiagram
    participant GH as GitHub_Actions
    participant J as Job_docs_gate
    participant G as Git_Repo
    participant CLI as repovec_ci_cli
    participant LIB as repovec_ci_lib

    GH->>J: Start docs_gate job
    J->>G: git diff to compute changed_files
    G-->>J: changed_files list

    alt have_changed_files
        J->>CLI: repovec-ci --stdin (changed_files on stdin)
    else no_changed_files
        J->>CLI: repovec-ci (no args)
    end

    CLI->>LIB: evaluate_docs_gate_in(root_dir, changed_files)
    LIB-->>CLI: DocsGatePlan

    CLI-->>J: should_run, docs_gate_required, nixie_required, reason, matched_files

    J->>J: Log decision outputs

    alt docs_gate_required == true
        J->>J: Install_markdownlint_cli2
        J->>J: make markdownlint

        alt nixie_required == true
            J->>J: setup_bun
            J->>J: install_nixie
            J->>J: make nixie
        else nixie_required == false
            J->>J: Skip nixie
        end
    else docs_gate_required == false
        J->>J: Echo "docs gates skipped"
    end

    J-->>GH: Job status for docs_gate
Loading

Class diagram for repovec-ci CI policy helper

classDiagram
    class DocsGateReason {
        <<enum>>
        +MarkdownChanged
        +MissingChangedFiles
        +NoMarkdownChanges
        +as_str() &'static str
    }

    class DocsGatePlan {
        -matched_files : Vec~String~
        -docs_gate_required : bool
        -nixie_required : bool
        -reason : DocsGateReason
        +new(matched_files : Vec~String~, docs_gate_required : bool, nixie_required : bool, reason : DocsGateReason) DocsGatePlan
        +should_run() bool
        +docs_gate_required() bool
        +nixie_required() bool
        +reason() DocsGateReason
        +matched_files() &[String]
    }

    class Functions_lib {
        <<module>>
        +evaluate_docs_gate_in(root : Dir, changed_files : IntoIterator~Item = S~) DocsGatePlan
        +evaluate_docs_gate_with(changed_files : IntoIterator~Item = S~, path_contains_mermaid : FnMut &str -> bool) DocsGatePlan
        -normalize_path(path : &str) Option~String~
        -is_markdown_path(path : &str) bool
        -path_contains_mermaid(root : Dir, path : &str) bool
    }

    class MainBinary {
        <<binary>>
        +main() void
        +run() io::Result~()~
        +parse_args(arguments : IntoIterator~Item = String~) io::Result~Input~
        +read_paths_from_stdin() io::Result~Vec~String~~
    }

    class Input {
        <<enum>>
        +ChangedFiles(Vec~String~)
        +Stdin
    }

    DocsGatePlan --> DocsGateReason : uses
    Functions_lib --> DocsGatePlan : returns
    Functions_lib --> DocsGateReason : uses

    MainBinary --> Input : uses
    MainBinary --> Functions_lib : calls
    MainBinary --> DocsGatePlan : uses
Loading

File-Level Changes

Change Details Files
Refactor CI workflow into discrete gate jobs that mirror Make targets and integrate a docs-gate that conditionally runs markdown and Mermaid checks using the new policy helper.
  • Split the previous monolithic CI job into separate build, check-fmt, lint, test, and docs-gate jobs with stable job names for branch protection.
  • Configured global workflow env vars for Rust tooling and removed inline env blocks from individual jobs where redundant.
  • Reworked lint job to install and cache Whitaker via cargo-binstall with safer shell scripting and variable naming.
  • Implemented docs-gate job that computes changed files, invokes the repovec-ci CLI to decide if docs and nixie checks are required, conditionally installs markdownlint-cli2, bun, and nixie, and runs make markdownlint and make nixie only when indicated.
  • Removed the prior coverage-generation and CodeScene upload steps from the required gate path.
.github/workflows/ci.yml
Introduce a dedicated CI policy helper crate and CLI that classifies changed files to decide when docs and Mermaid validation must run, with unit and BDD-style behavioural tests.
  • Added repovec-ci crate to the workspace including Cargo configuration and dependencies on camino, cap-std, rstest, and rstest-bdd.
  • Implemented DocsGateReason and DocsGatePlan types plus evaluate_docs_gate_in/evaluate_docs_gate_with functions to classify Markdown changes and Mermaid requirements, with conservative behaviour when no change list is available.
  • Added path normalization and Markdown extension detection helpers, including a cap-std based implementation that inspects file contents for ```mermaid blocks.
  • Wrote rstest-based unit tests for Markdown vs non-Markdown classification, mixed inputs, empty inputs, and Mermaid-triggered nixie requirements.
  • Implemented a CLI binary that parses --stdin and repeated --changed-file arguments, runs the policy, and prints GitHub Actions-compatible key=value outputs consumed by the docs-gate job.
  • Added rstest-bdd scenarios and feature file describing Markdown-only, code-only, mixed, Mermaid-bearing, and missing-input behaviours for the docs gate policy.
Cargo.toml
Cargo.lock
crates/repovec-ci/Cargo.toml
crates/repovec-ci/src/lib.rs
crates/repovec-ci/src/main.rs
crates/repovec-ci/tests/docs_gate_policy_bdd.rs
crates/repovec-ci/tests/features/docs_gate.feature
Version the GitHub repository ruleset that enforces required checks and document how to apply and update it.
  • Added a main-ci-gating ruleset JSON payload describing the desired required checks for refs/heads/main so enforcement configuration is versioned in-repo.
  • Documented gh api commands for creating and updating the ruleset and verifying its configuration in the execution plan and developers guide.
.github/rulesets/main-ci-gating.json
docs/execplans/1-1-3-ci-gating-pipeline.md
docs/developers-guide.md
Document the new CI gating model, including gate names, docs-gate behaviour, and workflow expectations for maintainers and contributors.
  • Extended the technical design doc with a "Repository governance and CI gating" section that explains the mapping of Make targets to CI jobs, conditional docs checks, and the ruleset-based merge enforcement model.
  • Updated the roadmap entry for 1.1.3 to reflect that the workflow and ruleset payload are implemented but enforcement is pending activation in GitHub.
  • Added an execution plan for the 1.1.3 CI gating pipeline that describes constraints, workstreams, verification steps, and GitHub ruleset deployment commands.
  • Added a developers guide that defines local quality gates, the GitHub Actions gate set, the CI policy helper responsibilities, and required-check enforcement workflow.
  • Added a user-facing guide with a Mermaid flowchart documenting how docs gate decisions are made from the changed-file list and when Mermaid validation runs.
  • Introduced a docs contents index and wired in the new guides and execution plan so the documentation set is navigable.
docs/repovec-appliance-technical-design.md
docs/roadmap.md
docs/execplans/1-1-3-ci-gating-pipeline.md
docs/developers-guide.md
docs/users-guide.md
docs/contents.md

Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

…docs gate

- Split monolithic CI job into stable named jobs: build, check-fmt, lint, test, docs-gate
- Docs gate runs conditionally on Markdown file changes using a testable Rust helper
- Add behavioural and unit tests for docs gate classification
- Add GitHub ruleset definition for merge check enforcement targeting main branch
- Update documentation with maintainer guidance and CI design details
- Ensure local Make targets align with CI jobs for consistency
- Defer live enforcement activation until workflow merges and verified on remote

Co-authored-by: devboxerhub[bot] <devboxerhub[bot]@users.noreply.github.com>
@leynos leynos changed the title Add CI gating pipeline execution plan doc Add CI gating pipeline with tests, docs, and policy Apr 12, 2026
leynos and others added 4 commits April 12, 2026 20:20
Add detailed instructions for creating, updating, and verifying GitHub rulesets related to the main CI gating pipeline. These commands ensure correct deployment and verification after workflow changes are merged on the remote default branch.

Co-authored-by: devboxerhub[bot] <devboxerhub[bot]@users.noreply.github.com>
…n docs gate

- DocsGatePlan now tracks whether Mermaid validation (nixie) is required.
- docs-gate CI job installs markdownlint-cli2 only when docs gate runs.
- docs-gate CI job conditionally runs markdownlint if docs gate needed.
- docs-gate CI job conditionally runs nixie only if Mermaid present in Markdown.
- User-facing docs-guide.md added to explain docs gate and Mermaid validation flow.
- Behavioural and unit tests extended to cover Mermaid validation requirements.
- Documentation updated to reflect separate conditions for markdownlint and nixie.

This improves the docs-gate CI workflow by avoiding nixie runs if no Mermaid diagrams changed, reducing unnecessary validation.

Co-authored-by: devboxerhub[bot] <devboxerhub[bot]@users.noreply.github.com>
- CI workflow now installs nixie if mermaid validation is required
- Added dependencies camino and cap-std for UTF-8 path handling in repovec-ci
- Refactored repovec-ci to use cap-std for filesystem operations
- Updated docs to reflect nixie installation step in CI gating pipeline

Co-authored-by: devboxerhub[bot] <devboxerhub[bot]@users.noreply.github.com>
- Integrate oven-sh/setup-bun@v2 GitHub Action to install Bun
- Ensure Bun is set up immediately before nixie installation in docs-gate
- Updated CI workflow and execution plan docs to reflect this dependency

Co-authored-by: devboxerhub[bot] <devboxerhub[bot]@users.noreply.github.com>
@leynos
leynos marked this pull request as ready for review April 13, 2026 19:14
sourcery-ai[bot]

This comment was marked as resolved.

@coderabbitai coderabbitai Bot added the Roadmap label Apr 13, 2026

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: e39d14d215

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread crates/repovec-ci/src/lib.rs Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 6

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In @.github/workflows/ci.yml:
- Around line 148-151: The workflow currently uses oven-sh/setup-bun@v2 with
bun-version: latest which makes CI non-deterministic; change the bun-version
input to a specific pinned release (for example replace bun-version: latest with
bun-version: "1.3.12") so the setup action uses a fixed Bun release; update the
value wherever bun-version appears in the CI job that uses the setup-bun action
to ensure reproducible builds.

In `@crates/repovec-ci/src/lib.rs`:
- Around line 50-56: The two accessors should_run() and docs_gate_required()
both return self.docs_gate_required; update the docs to clarify that
should_run() is a semantic alias for external callers and that
docs_gate_required() is the canonical name: modify the docstring for
docs_gate_required() to describe its role (returns whether the documentation
gate should run) and add a brief sentence stating that should_run() is provided
as an alias for convenience/compatibility, referencing the methods should_run()
and docs_gate_required() and the underlying field self.docs_gate_required to
make the relationship explicit.

In `@docs/execplans/1-1-3-ci-gating-pipeline.md`:
- Around line 27-35: Replace the semicolon before "and enforce those checks..."
in the paragraph that lists the two layers (the sentence starting "1. align the
repository workflow...; and 2. enforce those checks...") with a comma so it
reads "1. align the repository workflow with the Make targets that define the
commit gates, and 2. enforce those checks as merge blockers..." (or
alternatively convert the items into a numbered sub-list to remove the need for
the punctuation).
- Around line 82-90: In the sentence listing enforcement options that currently
reads "manage the rule manually in the GitHub UI and document the exact required
checks; or - manage it through repository automation...", replace the semicolon
before "or" with a comma so the clause reads "...document the exact required
checks, or manage it through repository automation..." to correct the
punctuation; update the same punctuation in the parallel list item that contains
"accepted pattern for GitHub settings management" if present.

In `@docs/repovec-appliance-technical-design.md`:
- Around line 411-416: Update the paragraph describing documentation checks to
explicitly state the safe-fallback behavior: change the text around "make
markdownlint" and "make nixie" to say these checks run when the policy
classifies Markdown changes and also run as a safe fallback if the changed-file
list is missing or malformed, and note that `make markdownlint` runs for any
changed Markdown file while `make nixie` runs only for Markdown files containing
a Mermaid diagram (or when fallback mode is active).

In `@docs/users-guide.md`:
- Around line 28-34: Update the Mermaid flowchart predicates to use
Markdown-path terminology instead of generic docs-paths: change the DocsOnly
node label from "Only_docs_paths_changed?" to "Any_markdown_paths_changed?" and
the HasDocs condition in the MixedOrCode branch from
"Any_docs_or_mermaid_docs_changed?" to "Any_markdown_paths_changed?"; ensure the
classifier referenced by Classify, DocsOnly, MixedOrCode, and HasDocs is
understood to check for Markdown extensions (.md, .markdown, .mdx) so the policy
aligns with actual inputs.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 26bed694-180f-46ba-b0e5-a6044a2cffb8

📥 Commits

Reviewing files that changed from the base of the PR and between 4b747c8 and e39d14d.

⛔ Files ignored due to path filters (1)
  • Cargo.lock is excluded by !**/*.lock
📒 Files selected for processing (14)
  • .github/rulesets/main-ci-gating.json
  • .github/workflows/ci.yml
  • Cargo.toml
  • crates/repovec-ci/Cargo.toml
  • crates/repovec-ci/src/lib.rs
  • crates/repovec-ci/src/main.rs
  • crates/repovec-ci/tests/docs_gate_policy_bdd.rs
  • crates/repovec-ci/tests/features/docs_gate.feature
  • docs/contents.md
  • docs/developers-guide.md
  • docs/execplans/1-1-3-ci-gating-pipeline.md
  • docs/repovec-appliance-technical-design.md
  • docs/roadmap.md
  • docs/users-guide.md

Comment thread .github/workflows/ci.yml Outdated
Comment thread crates/repovec-ci/src/lib.rs
Comment thread docs/execplans/1-1-3-ci-gating-pipeline.md
Comment thread docs/execplans/1-1-3-ci-gating-pipeline.md
Comment thread docs/repovec-appliance-technical-design.md Outdated
Comment thread docs/users-guide.md Outdated
…ck handling

- Docs gate now considers documentation-tooling config files (e.g., .markdownlint-cli2.jsonc) as inputs that trigger validation.
- Mermaid detection enhanced to handle unreadable files conservatively, requiring nixie validation and exposing fallback files to CI.
- Updated CLI to support --help and improved usage messages.
- CI workflow builds repovec-ci once and invokes binary directly.
- Documentation updated to reflect broader documentation input handling and fallback behavior.
- Behavioral tests expanded to cover new docs tooling paths and fallback cases.

This change improves accuracy and safety of documentation validation in CI, ensuring tooling config changes trigger appropriate checks and fallback detection paths are observable.

Co-authored-by: devboxerhub[bot] <devboxerhub[bot]@users.noreply.github.com>
@leynos leynos changed the title Add CI gating pipeline with tests, docs, and policy Add CI gating pipeline with tests, docs, policy, and governance Apr 13, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 8

♻️ Duplicate comments (1)
docs/users-guide.md (1)

29-37: ⚠️ Potential issue | 🟡 Minor

Rename the flowchart predicates to match the implemented classifier.

Replace the docs paths and mermaid docs labels with terminology that covers
Markdown anywhere in the repository plus documentation-tooling inputs such as
.markdownlint-cli2.jsonc. Leave the current labels in place and README/config
changes follow the wrong branch in this user-facing explanation.

🛠 Patch
-    Classify --> DocsOnly{Only_docs_paths_changed?}
+    Classify --> DocsOnly{Only_documentation_inputs_changed?}
@@
-    MixedOrCode --> HasDocs{Any_docs_or_mermaid_docs_changed?}
+    MixedOrCode --> HasDocs{Any_documentation_inputs_changed?}
@@
-    RequireDocs --> CheckNixie{Mermaid_docs_changed?}
+    RequireDocs --> CheckNixie{Mermaid_or_conservative_path?}

Triage: [type:docstyle]

Based on learnings: When a change reaches CI, the workflow must validate whether documentation validation is required and whether Mermaid diagram validation should run based on the changed-file list, documentation-tooling configuration changes, and Markdown file contents containing Mermaid diagrams.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/users-guide.md` around lines 29 - 37, Update the flowchart predicates in
docs/users-guide.md to match the implemented classifier: rename the node label
for DocsOnly from "Only_docs_paths_changed?" to
"Only_documentation_inputs_changed?", rename the HasDocs predicate from
"Any_docs_or_mermaid_docs_changed?" to "Any_documentation_inputs_changed?", and
rename the CheckNixie label from "Mermaid_docs_changed?" to
"Mermaid_or_conservative_path?"; make these exact string replacements for the
nodes Classify -> DocsOnly, MixedOrCode -> HasDocs, and RequireDocs ->
CheckNixie so the diagram terminology aligns with the code that checks Markdown
and documentation-tooling inputs.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In @.github/workflows/ci.yml:
- Around line 159-165: The "Install nixie" CI step uses a floating Git URL (uv
tool install git+https://github.com/leynos/nixie) which can change unexpectedly;
update that command to pin the dependency to an immutable ref by appending
@<tag-or-commit> (e.g., uv tool install
git+https://github.com/leynos/nixie@<commit-or-tag>) so the "Install nixie" step
always installs a reproducible version.

In `@crates/repovec-ci/src/lib.rs`:
- Around line 240-255: The current use of matched_files.iter().any(...)
short-circuits and can skip collecting later unreadable Markdown files into
conservative_fallback_files; replace the .any(...) call with an explicit full
pass (e.g., for path in matched_files.iter() { ... }) that: 1) still returns
true for nixie_required if any path_requires_nixie (set a local bool
nixie_required = false and set to true when detection.requires_nixie()), 2)
always pushes path.clone() into conservative_fallback_files when
detection.is_unknown(), and 3) preserves the existing early-return for
is_docs_tooling_config_path(path) / skip for non-markdown via
is_markdown_path(path) logic inside that loop so no unreadable Markdown is
missed.

In `@crates/repovec-ci/src/main.rs`:
- Around line 116-131: Current tests only exercise --help and invalid-flag
paths; add unit tests calling parse_args to cover the CLI branches used by the
workflow: a test for no arguments (ensure it produces the expected default Input
variant), a test for "--stdin" parsing into Input::Stdin (or equivalent), tests
for repeated "--changed-file" values (ensure multiple entries are collected into
the appropriate Input variant/field), a test for missing "--changed-file" value
that returns io::ErrorKind::InvalidInput with USAGE in the message, and a test
asserting the mutually-exclusive flags produce an error; locate and use the
parse_args function, Input enum variants, and the USAGE constant to implement
these assertions.

In `@crates/repovec-ci/tests/features/docs_gate.feature`:
- Around line 44-49: Add a new BDD Scenario to the docs_gate.feature that
mirrors the existing "Missing changed-file input runs the docs gate
conservatively" scenario but covers an unreadable Markdown file path: name it
like "Unreadable changed Markdown triggers conservative fallback", use a Given
step that marks a specific changed Markdown file as unreadable (so Mermaid
detection cannot read it), then When the docs gate policy is evaluated; assert
Then the docs gate runs, And Mermaid validation is required, And the docs gate
reason is conservative_fallback_files, and ensure the scenario verifies the
workflow publishes the list of files that caused the conservative fallback
(i.e., the unreadable file path).

In `@docs/contents.md`:
- Around line 3-29: The contents.md index is a flat list and must be reorganized
into stable, grouped sections: add an explicit top-level title "Documentation
contents" and a self-reference link at the top, then split entries into logical
groups (e.g. "Contributor guides" for Users guide and Developers guide, "Design
& Architecture" for repovec-appliance-technical-design and
complexity-antipatterns-and-refactoring-strategies, "Plans & Execution" for
Roadmap and execplans, "Reference & Style" for documentation-style-guide,
ortho-config-users-guide, testing guides, scripting-standards, etc.), reorder
entries for stable priority within each group, use inline links with short
audience-focused descriptions for each item, and ensure filenames like
users-guide.md, developers-guide.md, repovec-appliance-technical-design.md,
roadmap.md, execplans/1-1-3-ci-gating-pipeline.md, documentation-style-guide.md,
ortho-config-users-guide.md,
reliable-testing-in-rust-via-dependency-injection.md, rust-doctest-dry-guide.md,
rust-testing-with-rstest-fixtures.md, rstest-bdd-users-guide.md,
complexity-antipatterns-and-refactoring-strategies.md, and
scripting-standards.md are placed into the appropriate groups with clear
descriptions and stable ordering.

In `@docs/developers-guide.md`:
- Around line 66-72: Update the paragraph that begins "When the changed-file
list is unavailable" to explicitly state that the missing-input fallback not
only forces the documentation gate but also requires running `make nixie`
(Mermaid validation) instead of `make markdownlint`, so that both documentation
validation and Mermaid validation are performed when the changed-file list is
unavailable; reference and modify the sentence that currently contrasts "`make
nixie`" and "`make markdownlint`" to include the new wording about requiring
`make nixie`.
- Around line 29-36: Add the missing formatting step to the Markdown-change
checklist by inserting the "make fmt" invocation (e.g., make fmt 2>&1 | tee
/tmp/repovec-make-fmt.log) into the existing block that currently runs set -o
pipefail, make markdownlint and make nixie; ensure the additional set -o
pipefail is preserved around the make fmt call so the sequence becomes set -o
pipefail, make fmt ..., set -o pipefail, make markdownlint ..., set -o pipefail,
make nixie ... and update the checklist text accordingly.

In `@docs/execplans/1-1-3-ci-gating-pipeline.md`:
- Around line 43-46: Update the current-state bullet to state that docs-gate
runs markdown checks via `make markdownlint` when Markdown files change, and
runs `make nixie` when Markdown files contain Mermaid diagrams, but also
conservatively triggers both checks if documentation-tooling configuration files
change (so changes to tooling config cause both docs-gate and Mermaid validation
to run) and likewise triggers both when the changed-file list is missing or
unreadable (safe-fallback behavior). Mention that the job still publishes a
stable required check result in all cases.

---

Duplicate comments:
In `@docs/users-guide.md`:
- Around line 29-37: Update the flowchart predicates in docs/users-guide.md to
match the implemented classifier: rename the node label for DocsOnly from
"Only_docs_paths_changed?" to "Only_documentation_inputs_changed?", rename the
HasDocs predicate from "Any_docs_or_mermaid_docs_changed?" to
"Any_documentation_inputs_changed?", and rename the CheckNixie label from
"Mermaid_docs_changed?" to "Mermaid_or_conservative_path?"; make these exact
string replacements for the nodes Classify -> DocsOnly, MixedOrCode -> HasDocs,
and RequireDocs -> CheckNixie so the diagram terminology aligns with the code
that checks Markdown and documentation-tooling inputs.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 2847023a-46c9-4981-a1c7-ca5d31332fd4

📥 Commits

Reviewing files that changed from the base of the PR and between e39d14d and e060cd5.

📒 Files selected for processing (10)
  • .github/workflows/ci.yml
  • crates/repovec-ci/src/lib.rs
  • crates/repovec-ci/src/main.rs
  • crates/repovec-ci/tests/docs_gate_policy_bdd.rs
  • crates/repovec-ci/tests/features/docs_gate.feature
  • docs/contents.md
  • docs/developers-guide.md
  • docs/execplans/1-1-3-ci-gating-pipeline.md
  • docs/repovec-appliance-technical-design.md
  • docs/users-guide.md

Comment thread .github/workflows/ci.yml
Comment thread crates/repovec-ci/src/lib.rs Outdated
Comment thread crates/repovec-ci/src/main.rs
Comment thread crates/repovec-ci/tests/features/docs_gate.feature
Comment thread docs/contents.md Outdated
Comment thread docs/developers-guide.md Outdated
Comment thread docs/developers-guide.md Outdated
Comment thread docs/execplans/1-1-3-ci-gating-pipeline.md Outdated
leynos and others added 3 commits April 14, 2026 11:16
- Updated GitHub Actions workflow to trigger core CI gate jobs (`build`, `check-fmt`, `lint`, `test`) on pull request updates and pushes to `main` branch only.
- Removed running core CI jobs on every branch push to avoid duplicate runs.
- Adjusted documentation to reflect new CI triggering strategy.
- Ensures required checks remain visible during merge decisions while reducing redundant CI runs on push branches.

Co-authored-by: devboxerhub[bot] <devboxerhub[bot]@users.noreply.github.com>
- Install @mermaid-js/mermaid-cli and chrome-headless-shell in docs-gate job when required
- Cache ~/.local/share/whitaker and refine Whitaker installation in lint job
- Update docs to reflect these changes

Co-authored-by: devboxerhub[bot] <devboxerhub[bot]@users.noreply.github.com>
…g config

- Docs gate now treats unreadable Markdown files as requiring conservative fallback to ensure validation safety.
- Documentation-tooling config changes trigger docs gate requiring both markdownlint and nixie checks.
- Enhanced CLI argument parsing with better error messages and mutual exclusivity enforced between --stdin and --changed-file.
- Updated GitHub Actions workflow to pin nixie tool by commit hash for stability.
- Added behavioural tests covering unreadable markdown fallback scenario.
- Improved documentation to reflect these policy and tooling changes.

Co-authored-by: devboxerhub[bot] <devboxerhub[bot]@users.noreply.github.com>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

♻️ Duplicate comments (4)
docs/developers-guide.md (2)

66-72: ⚠️ Potential issue | 🟡 Minor

State that the missing-input fallback also forces make nixie.

The paragraph only describes the docs-gate half of the conservative path. The
implemented policy runs both documentation validation and Mermaid validation
when the changed-file list is unavailable or malformed.

Triage: [type:docstyle]

Based on learnings: When the changed-file list is unavailable or malformed, apply safe default policy: run both documentation gate and Mermaid validation.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/developers-guide.md` around lines 66 - 72, Update the paragraph
describing the conservative fallback for an unavailable or malformed
changed-file list to state that the fallback runs both the documentation gate
and Mermaid validation by forcing the broader target `make nixie` (not just
`make markdownlint`); mention the implemented policy explicitly (changed-file
list unavailable/malformed -> run both documentation validation and Mermaid
validation) and reference the user-visible flow in users-guide.md for context,
so readers understand that the conservative path runs `make nixie`.

29-36: ⚠️ Potential issue | 🟡 Minor

Add make fmt to the Markdown-change checklist.

The documentation workflow here still omits the required formatting pass after
Markdown edits.

Triage: [type:docstyle]

🛠 Patch
 ```sh
 set -o pipefail
+make fmt 2>&1 | tee /tmp/repovec-make-fmt.log
+set -o pipefail
 make markdownlint 2>&1 | tee /tmp/repovec-make-markdownlint.log
 set -o pipefail
 make nixie 2>&1 | tee /tmp/repovec-make-nixie.log
</details>
As per coding guidelines, "Run `make fmt` after any documentation changes to format all Markdown files and fix table markup."

<details>
<summary>🤖 Prompt for AI Agents</summary>

Verify each finding against the current code and only fix it if needed.

In @docs/developers-guide.md around lines 29 - 36, Update the Markdown-change
checklist in the developers guide to include the required formatting step:
insert a make fmt invocation (logging to /tmp/repovec-make-fmt.log) before
running make markdownlint and make nixie in the checklist block so the
sequence becomes set -o pipefail → make fmt → make markdownlint → make nixie;
modify the checklist snippet in docs/developers-guide.md accordingly to ensure
every doc edit runs the formatter.


</details>

</blockquote></details>
<details>
<summary>.github/workflows/ci.yml (1)</summary><blockquote>

`160-165`: _⚠️ Potential issue_ | _🟠 Major_

**Pin `nixie` to an immutable Git ref.**

Install a tag or commit instead of the repository default branch. As written,
the required docs gate can change or fail when `leynos/nixie` moves
independently of this repository.

  
<details>
<summary>🛠 Patch</summary>

```diff
-          uv tool install git+https://github.com/leynos/nixie
+          uv tool install git+https://github.com/leynos/nixie@<tag-or-commit>
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/ci.yml around lines 160 - 165, The workflow step "Install
nixie" currently installs the repo default branch; change the install command in
that step to pin to an immutable ref by using a specific tag or commit SHA
(e.g., replace the URL passed to uv tool install for leynos/nixie with
git+https://github.com/leynos/nixie@<tag-or-commit-sha>) so the CI uses a fixed
release; update the command in the "Install nixie" step accordingly and commit
the chosen tag or SHA.
docs/execplans/1-1-3-ci-gating-pipeline.md (1)

43-46: ⚠️ Potential issue | 🟡 Minor

Describe the full docs-gate policy in these summaries.

These bullets omit the conservative paths and read as if every documentation
change runs make nixie. Mirror the implemented behaviour: docs-gate is the
required check, make markdownlint runs for Markdown inputs, and make nixie
also runs for Mermaid-bearing Markdown plus conservative fallback cases.

Triage: [type:docstyle]

Based on learnings: Documentation-tooling configuration changes trigger both documentation gate and Mermaid validation as a conservative default; when the changed-file list is unavailable or malformed, apply safe default policy: run both documentation gate and Mermaid validation.

Also applies to: 58-61, 199-202

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/execplans/1-1-3-ci-gating-pipeline.md` around lines 43 - 46, Update the
summary to fully describe the docs-gate policy: state that docs-gate is the
required check, that `make markdownlint` runs when Markdown files are detected,
and that `make nixie` runs only for Markdown files containing Mermaid diagrams
but also in conservative fallback cases (e.g., documentation-tooling/config
changes or when the changed-file list is unavailable or malformed) so both
checks run by default in those scenarios; apply the same wording changes
wherever the brief summaries mention `docs-gate`, `make markdownlint`, or `make
nixie`.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In @.github/workflows/ci.yml:
- Around line 156-159: Replace the mutable tag on the GitHub Action step that
currently uses "uses: oven-sh/setup-bun@v2" with a specific commit SHA for
oven-sh/setup-bun so the workflow is pinned; locate the step referencing
oven-sh/setup-bun and change the uses value to the corresponding full commit SHA
for the v2 release (keep the bun-version: "1.3.12" input intact) to eliminate
the supply-chain risk from a floating tag.

In `@docs/developers-guide.md`:
- Around line 14-115: The developers-guide.md needs canonical developers-guide
structure: add a brief opening paragraph stating audience and scope, insert
early links to design docs/decision records, convert major unnumbered headings
(e.g., "Local quality gates", "GitHub Actions gate set", "CI policy helper",
"Required-check enforcement") to a numbered section hierarchy (1., 2., 3., ...),
clearly separate normative rules from informative explanation within each
section, include compact interface maps or workflow diagrams for subsystem
guidance, and ensure references sync with decision records; update headings and
content in developers-guide.md (and internal subsection headings) accordingly so
the file follows the repository's canonical developers-guide format.

---

Duplicate comments:
In @.github/workflows/ci.yml:
- Around line 160-165: The workflow step "Install nixie" currently installs the
repo default branch; change the install command in that step to pin to an
immutable ref by using a specific tag or commit SHA (e.g., replace the URL
passed to uv tool install for leynos/nixie with
git+https://github.com/leynos/nixie@<tag-or-commit-sha>) so the CI uses a fixed
release; update the command in the "Install nixie" step accordingly and commit
the chosen tag or SHA.

In `@docs/developers-guide.md`:
- Around line 66-72: Update the paragraph describing the conservative fallback
for an unavailable or malformed changed-file list to state that the fallback
runs both the documentation gate and Mermaid validation by forcing the broader
target `make nixie` (not just `make markdownlint`); mention the implemented
policy explicitly (changed-file list unavailable/malformed -> run both
documentation validation and Mermaid validation) and reference the user-visible
flow in users-guide.md for context, so readers understand that the conservative
path runs `make nixie`.
- Around line 29-36: Update the Markdown-change checklist in the developers
guide to include the required formatting step: insert a `make fmt` invocation
(logging to /tmp/repovec-make-fmt.log) before running `make markdownlint` and
`make nixie` in the checklist block so the sequence becomes set -o pipefail →
make fmt → make markdownlint → make nixie; modify the checklist snippet in
docs/developers-guide.md accordingly to ensure every doc edit runs the
formatter.

In `@docs/execplans/1-1-3-ci-gating-pipeline.md`:
- Around line 43-46: Update the summary to fully describe the docs-gate policy:
state that docs-gate is the required check, that `make markdownlint` runs when
Markdown files are detected, and that `make nixie` runs only for Markdown files
containing Mermaid diagrams but also in conservative fallback cases (e.g.,
documentation-tooling/config changes or when the changed-file list is
unavailable or malformed) so both checks run by default in those scenarios;
apply the same wording changes wherever the brief summaries mention `docs-gate`,
`make markdownlint`, or `make nixie`.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 0c122ed9-40ac-4160-9c21-f5a76cac9bf1

📥 Commits

Reviewing files that changed from the base of the PR and between e060cd5 and 6fe8a77.

📒 Files selected for processing (4)
  • .github/workflows/ci.yml
  • docs/developers-guide.md
  • docs/execplans/1-1-3-ci-gating-pipeline.md
  • docs/roadmap.md

Comment thread .github/workflows/ci.yml Outdated
Comment thread docs/developers-guide.md Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 5

♻️ Duplicate comments (1)
docs/developers-guide.md (1)

14-120: 🧹 Nitpick | 🔵 Trivial

Number the major sections.

The coding guidelines require numbered sections for long-form developers guide content. Apply a numbering scheme to the major headings: "1. Local quality gates", "2. GitHub Actions gate set", "3. CI policy helper", "4. Required-check enforcement".

Triage: [type:docstyle]

♻️ Proposed section numbering
-## Local quality gates
+## 1. Local quality gates

-## GitHub Actions gate set
+## 2. GitHub Actions gate set

-## CI policy helper
+## 3. CI policy helper

-## Required-check enforcement
+## 4. Required-check enforcement

As per coding guidelines, "Use canonical filename docs/developers-guide.md for developers guide documentation with... numbered sections for long-form content."

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/developers-guide.md` around lines 14 - 120, Prefix the four major
headings with ordered section numbers as required by the style guide: change
"Local quality gates" → "1. Local quality gates", "GitHub Actions gate set" →
"2. GitHub Actions gate set", "CI policy helper" → "3. CI policy helper", and
"Required-check enforcement" → "4. Required-check enforcement"; ensure any
internal references (e.g., the link to users-guide.md or the ruleset
filename/reference) remain correct after renaming the headings and update any
nearby sentences that mention those headings by name if necessary.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In @.github/workflows/ci.yml:
- Around line 148-151: The workflow step currently uses the mutable action
reference oven-sh/setup-bun@v2 which can change; update that step to pin the
action to the supplied commit SHA 0c5077e514 (replace oven-sh/setup-bun@v2 with
oven-sh/setup-bun@0c5077e514) while keeping the existing condition (if:
steps.docs_gate_plan.outputs.nixie_required == 'true') and bun-version: "1.3.12"
intact so the gate step is stable and supply-chain safe.

In `@crates/repovec-ci/src/lib.rs`:
- Around line 19-113: Add runnable Rustdoc examples for DocsGateReason::as_str,
each public DocsGatePlan accessor (should_run, docs_gate_required,
nixie_required, reason, matched_files, conservative_fallback_files) and the
evaluate_docs_gate_with function by adding /// examples that include "use
repovec_ci::..." imports, construct the types or call evaluate_docs_gate_with
with representative inputs, and assert expected return values/outputs; ensure
examples are real doctest code blocks (```rust ... ```) that compile and assert
values (e.g., assert_eq!(DocsGateReason::MissingChangedFiles.as_str(),
"missing-changed-files") and similar checks for DocsGatePlan accessors and
evaluate_docs_gate_with) so the docs are executable and demonstrate usage and
outcomes.
- Around line 1-413: The file exceeds the 400-line limit because the long
#[cfg(test)] mod tests is embedded in src/lib.rs; extract those tests into
separate test modules so src/lib.rs contains only policy logic (DocsGatePlan,
evaluate_docs_gate_with, path_contains_mermaid, is_markdown_path, etc.). Create
one or more test files (e.g. tests/docs_gate.rs or tests/unit/docs_gate.rs) that
import the crate (use repovec_ci::{evaluate_docs_gate_with, MermaidDetection,
DocsGateReason, DocsGatePlan}) and re-create the existing test cases (including
the rstest parameterized cases and named tests like
markdown_paths_trigger_the_docs_gate,
unreadable_markdown_requests_nixie_conservatively,
mixed_input_returns_only_markdown_matches). Remove the entire #[cfg(test)] mod
tests block from src/lib.rs after moving tests so the public API and helper
functions remain unchanged.

In `@crates/repovec-ci/src/main.rs`:
- Around line 23-55: The function run contains multiple clusters of nested
conditional logic around computing plan from Input which triggers the Whitaker
lint; extract that logic into a new helper (e.g., fn compute_plan(input: Input)
-> io::Result<Plan>) that performs the match on Input::Help /
Input::ChangedFiles / Input::Stdin and calls Dir::open_ambient_dir(".",
ambient_authority()), evaluate_docs_gate_in(&root, paths) and
read_paths_from_stdin() as needed, returning the evaluated plan (or early
handling for Help). Replace the match in run with a single call to
compute_plan(input) and keep the subsequent writeln! calls unchanged so run
becomes linear and the nested clusters are removed; reference symbols: run,
compute_plan (new), Input::Help, Input::ChangedFiles, Input::Stdin,
Dir::open_ambient_dir, evaluate_docs_gate_in, read_paths_from_stdin.

In `@crates/repovec-ci/tests/docs_gate_policy_bdd.rs`:
- Around line 97-102: The helper function plan is incorrectly marked const fn
despite never being evaluated at compile time; remove the const annotation so
the signature becomes fn plan(world: &PolicyWorld) -> &DocsGatePlan and keep the
match logic and panic! unchanged, updating the declaration from const fn
plan(...) to fn plan(...).

---

Duplicate comments:
In `@docs/developers-guide.md`:
- Around line 14-120: Prefix the four major headings with ordered section
numbers as required by the style guide: change "Local quality gates" → "1. Local
quality gates", "GitHub Actions gate set" → "2. GitHub Actions gate set", "CI
policy helper" → "3. CI policy helper", and "Required-check enforcement" → "4.
Required-check enforcement"; ensure any internal references (e.g., the link to
users-guide.md or the ruleset filename/reference) remain correct after renaming
the headings and update any nearby sentences that mention those headings by name
if necessary.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: b3f57b0d-9932-4d0f-9b43-55eefe38d820

📥 Commits

Reviewing files that changed from the base of the PR and between 6fe8a77 and 1b4b296.

📒 Files selected for processing (9)
  • .github/workflows/ci.yml
  • crates/repovec-ci/src/lib.rs
  • crates/repovec-ci/src/main.rs
  • crates/repovec-ci/tests/docs_gate_policy_bdd.rs
  • crates/repovec-ci/tests/features/docs_gate.feature
  • docs/contents.md
  • docs/developers-guide.md
  • docs/execplans/1-1-3-ci-gating-pipeline.md
  • docs/users-guide.md

Comment thread .github/workflows/ci.yml Outdated
Comment thread crates/repovec-ci/src/lib.rs Outdated
Comment thread crates/repovec-ci/src/lib.rs
Comment thread crates/repovec-ci/src/main.rs
Comment thread crates/repovec-ci/tests/docs_gate_policy_bdd.rs
@leynos

This comment was marked as resolved.

@leynos

leynos commented Apr 14, 2026

Copy link
Copy Markdown
Owner Author

@coderabbitai Please suggest a fix for the following lint violations and provide an AI coding agent prompt for the fix:

Error:   --> crates/repovec-ci/src/main.rs:23:4
   |
23 |    fn run() -> io::Result<()> {
   |  _____^^^_____________________-
   | | ____________________________|
   | ||
24 | ||     let mut stdout = BufWriter::new(io::stdout().lock());
25 | ||     let input = parse_args(std::env::args().skip(1))?;
26 | ||     let plan = match input {
...  ||
29 | ||             stdout.flush()?;
30 | ||             return Ok(());
   | ||_- Complexity bump 1 spans 2 lines.
...  |
38 | |              evaluate_docs_gate_in(&root, read_paths_from_stdin()?)
39 | |          }
   | |__- Complexity bump 2 spans 2 lines.
   |
note: Detected 2 complexity bumps above the threshold 2.5.
  --> crates/repovec-ci/src/main.rs:23:4
   |
23 | fn run() -> io::Result<()> {
   |    ^^^
   = help: Extract helper functions from the highlighted regions to reduce clustered complexity.
   = note: `-D bumpy-road-function` implied by `-D warnings`
   = help: to override `-D warnings` add `#[allow(bumpy_road_function)]`

error: could not compile `repovec-ci` (bin "repovec-ci") due to 1 previous error
warning: build failed, waiting for other jobs to finish...
Error: 
Error: Compilation failed with toolchain `nightly-2025-09-18`

Caused by:
    command failed: env -u CARGO -u RUSTC CLIPPY_DISABLE_DOCS_LINKS="null" DYLINT_LIBS="[\"/home/runner/.local/share/whitaker/lints/nightly-2025-09-18/x86_64-unknown-linux-gnu/lib/libwhitaker_suite@nightly-2025-09-18.so\"]" DYLINT_METADATA="null" DYLINT_NO_DEPS="0" RUSTC_WORKSPACE_WRAPPER="/home/runner/.dylint_drivers/nightly-2025-09-18/dylint-driver" RUSTUP_TOOLCHAIN="nightly-2025-09-18" "cargo" "check" "--target-dir" "/home/runner/work/repovec-appliance/repovec-appliance/target/dylint/target/nightly-2025-09-18" "--all-targets" "--all-features"

Stack backtrace:
   0: <anyhow::Error>::msg::<alloc::string::String>
   1: anyhow::__private::format_err
   2: <std::process::Command as dylint_internal::command::CommandExt>::success
   3: dylint::run_with_name_toolchain_map
   4: dylint::run
   5: cargo_dylint::main
   6: std::sys::backtrace::__rust_begin_short_backtrace::<fn() -> core::result::Result<(), dylint::error::ColorizedError<anyhow::Error>>, core::result::Result<(), dylint::error::ColorizedError<anyhow::Error>>>
   7: std::rt::lang_start::<core::result::Result<(), dylint::error::ColorizedError<anyhow::Error>>>::{closure#0}
   8: std::rt::lang_start_internal
   9: main
  10: <unknown>
  11: __libc_start_main
  12: _start
make[1]: *** [Makefile:46: whitaker-lint] Error 1
make[1]: Leaving directory '/home/runner/work/repovec-appliance/repovec-appliance'
make: *** [Makefile:43: lint] Error 2

@coderabbitai

This comment was marked as resolved.

@coderabbitai

This comment was marked as resolved.

- Implemented detailed evaluation of documentation-gate policy in the repovec-ci crate
- Added extensive inline documentation with examples for DocsGatePlan and DocsGateReason
- Introduced unit tests covering docs-gate classification scenarios
- Simplified main.rs by refactoring plan computation with compute_plan helper
- Updated developers-guide.md with structured sections on local quality gates and CI policy helper
- Minor workflow update to fix bun version reference

This enables better CI gating based on documentation changes, enhancing repo quality and tooling.

Co-authored-by: devboxerhub[bot] <devboxerhub[bot]@users.noreply.github.com>
@coderabbitai

coderabbitai Bot commented Apr 14, 2026

Copy link
Copy Markdown

Caution

Failed to replace (edit) comment. This is likely due to insufficient permissions or the comment being deleted.

Error details
{"name":"HttpError","status":500,"request":{"method":"PATCH","url":"https://api.github.com/repos/leynos/repovec-appliance/issues/comments/4229568114","headers":{"accept":"application/vnd.github.v3+json","user-agent":"octokit.js/0.0.0-development octokit-core.js/7.0.6 Node.js/24","authorization":"token [REDACTED]","content-type":"application/json; charset=utf-8"},"body":{"body":"<!-- This is an auto-generated comment: summarize by coderabbit.ai -->\n<!-- This is an auto-generated comment: review in progress by coderabbit.ai -->\n\n> [!NOTE]\n> Currently processing new changes in this PR. This may take a few minutes, please wait...\n> \n> <details>\n> <summary>⚙️ Run configuration</summary>\n> \n> **Configuration used**: Organization UI\n> \n> **Review profile**: ASSERTIVE\n> \n> **Plan**: Pro\n> \n> **Run ID**: `771d6026-62c7-4c40-941f-43b2d664ca3b`\n> \n> </details>\n> \n> <details>\n> <summary>📥 Commits</summary>\n> \n> Reviewing files that changed from the base of the PR and between 1b4b296bf00a3606b07e5f9b6819691479576daf and 4a2720f720318d5d92522781455db3205428cf20.\n> \n> </details>\n> \n> <details>\n> <summary>📒 Files selected for processing (6)</summary>\n> \n> * `.github/workflows/ci.yml`\n> * `crates/repovec-ci/src/lib.rs`\n> * `crates/repovec-ci/src/main.rs`\n> * `crates/repovec-ci/tests/docs_gate_policy_bdd.rs`\n> * `crates/repovec-ci/tests/docs_gate_unit.rs`\n> * `docs/developers-guide.md`\n> \n> </details>\n> \n> ```ascii\n>  ______________________________________\n> < My code review levels are over 9000! >\n>  --------------------------------------\n>   \\\n>    \\   (\\__/)\n>        (•ㅅ•)\n>        /   づ\n> ```\n\n<!-- end of auto-generated comment: review in progress by coderabbit.ai -->\n\n<!-- walkthrough_start -->\n\n## Walkthrough\n\nAdd a new repovec-ci Rust crate and CLI to classify documentation changes and Mermaid presence, restructure CI into discrete jobs including docs-gate, add a versioned GitHub ruleset enforcing required checks on refs/heads/main, and add documentation and execution plans describing the gating pipeline.\n\n## Changes\n\n|Cohort / File(s)|Summary|\n|---|---|\n|**CI Infrastructure** <br> `\\.github/rulesets/main-ci-gating.json`, `\\.github/workflows/ci.yml`|Add a versioned GitHub ruleset requiring checks (`build`, `check-fmt`, `lint`, `test`, `docs-gate`) for `refs/heads/main`. Split CI into separate jobs, promote shared env to workflow level, and implement `docs-gate` job that computes changed files and conditionally runs `markdownlint` and `nixie`.|\n|**repovec-ci crate & CLI** <br> `crates/repovec-ci/Cargo.toml`, `crates/repovec-ci/src/lib.rs`, `crates/repovec-ci/src/main.rs`|Add a new crate and binary that classify changed files, detect Mermaid diagrams, and emit a stable DocsGatePlan (reason, matched files, conservative fallback, flags). Provide public enums/structs and evaluators used by the workflow.|\n|**repovec-ci tests** <br> `crates/repovec-ci/tests/*`, `crates/repovec-ci/tests/features/docs_gate.feature`|Add unit and BDD tests (rstest, rstest-bdd) covering markdown/config classification, missing-input conservative behaviour, Mermaid detection (present/absent/unknown) and expected DocsGatePlan outcomes.|\n|**Workspace config** <br> `Cargo.toml`|Register `crates/repovec-ci` as a workspace member and add `rstest-bdd` and macro dependency entries for behavioural tests.|\n|**Documentation & Plans** <br> `docs/contents.md`, `docs/developers-guide.md`, `docs/users-guide.md`, `docs/execplans/1-1-3-ci-gating-pipeline.md`, `docs/repovec-appliance-technical-design.md`, `docs/roadmap.md`|Add and update docs describing docs-gate policy, CI job names and Make targets, conservative fallback for missing changed-file lists, execution plan for CI gating, and roadmap status reflecting the versioned ruleset payload.|\n\n## Sequence Diagram(s)\n\n```mermaid\nsequenceDiagram\n    participant GH as GitHub Actions\n    participant CLI as repovec-ci CLI\n    participant FS as Filesystem\n    participant WF as Workflow Jobs\n\n    GH->>CLI: Supply changed-file list (--changed-file / stdin)\n    CLI->>FS: Read listed files and scan for \"```mermaid\"\n    CLI->>CLI: Compute DocsGatePlan (should_run, docs_gate_required, nixie_required, reason, matched_files, conservative_fallback_files)\n    CLI->>GH: Emit key/value outputs for workflow (GITHUB_OUTPUT)\n    GH->>WF: Publish `docs-gate` check; conditionally trigger markdownlint and nixie based on outputs\n```\n\n## Poem\n\n> 🚧 Gates awaken on each commit,  \n> Docs and diagrams now face a test,  \n> Files scanned, a verdict writ,  \n> CI holds merges where rules insist,  \n> Workflow hums and keeps the pipeline blessed.\n\n<!-- walkthrough_end -->\n\n<!-- pre_merge_checks_walkthrough_start -->\n\n<details>\n<summary>🚥 Pre-merge checks | ✅ 5 | ❌ 2</summary>\n\n### ❌ Failed checks (2 warnings)\n\n|        Check name       | Status     | Explanation                                                                                                                                                                                         | Resolution                                                                                                                                                                   |\n| :---------------------: | :--------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n|         Testing         | ⚠️ Warning | PR lacks doctests for public APIs (DocsGateReason::as_str, DocsGatePlan accessors), snapshot tests for CLI output, and exceeds 400-line limit.                                                      | Add runnable doctest examples to all public APIs and implement snapshot tests for CLI output using insta framework.                                                          |\n| Developer Documentation | ⚠️ Warning | The developers' guide omits public API surface documentation, build dependency details, and CLI binary specifications for the new documentation-input classification logic in the repovec-ci crate. | Expand the CI policy helper section in docs/developers-guide.md with function signatures, usage examples, cap-std dependency rationale, and repovec-ci binary CLI interface. |\n\n<details>\n<summary>✅ Passed checks (5 passed)</summary>\n\n|         Check name         | Status   | Explanation                                                                                                                                                                                                                         |\n| :------------------------: | :------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n|         Title check        | ✅ Passed | The title precisely describes the main changeset: introducing a complete CI gating pipeline with supporting tests, documentation, policy helpers, and governance artefacts.                                                         |\n|      Description check     | ✅ Passed | The description comprehensively documents the changeset, covering new files, updates, rationale, design decisions, verification steps, risks, and definition of done—all directly related to the CI gating pipeline implementation. |\n|     Docstring Coverage     | ✅ Passed | Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.                                                                                                                                                |\n|  User-Facing Documentation | ✅ Passed | Pull request includes comprehensive user-facing documentation in docs/users-guide.md describing documentation gate functionality, Mermaid validation behaviour, and CI workflow flags.                                              |\n| Module-Level Documentation | ✅ Passed | All new Rust modules include explicit module-level documentation using the `//!` syntax, clearly explaining each module's purpose and utility.                                                                                      |\n\n</details>\n\n<sub>✏️ Tip: You can configure your own custom pre-merge checks in the settings.</sub>\n\n</details>\n\n<!-- pre_merge_checks_walkthrough_end -->\n\n<!-- finishing_touch_checkbox_start -->\n\n<details>\n<summary>✨ Finishing Touches</summary>\n\n<details>\n<summary>📝 Generate docstrings</summary>\n\n- [ ] <!-- {\"checkboxId\": \"7962f53c-55bc-4827-bfbf-6a18da830691\"} --> Create stacked PR\n- [ ] <!-- {\"checkboxId\": \"3e1879ae-f29b-4d0d-8e06-d12b7ba33d98\"} --> Commit on current branch\n\n</details>\n<details>\n<summary>🧪 Generate unit tests (beta)</summary>\n\n- [ ] <!-- {\"checkboxId\": \"f47ac10b-58cc-4372-a567-0e02b2c3d479\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Create PR with unit tests\n- [ ] <!-- {\"checkboxId\": \"6ba7b810-9dad-11d1-80b4-00c04fd430c8\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Commit unit tests in branch `ci-gating-pipeline-kpquh2`\n\n</details>\n\n</details>\n\n<!-- finishing_touch_checkbox_end -->\n\n<!-- tips_start -->\n\n---\n\n\n\n<sub>Comment `@coderabbitai help` to get the list of available commands and usage tips.</sub>\n\n<!-- tips_end -->\n\n<!-- internal state start -->\n\n\n<!-- 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 -->\n\n<!-- internal state end -->"},"request":{"retryCount":3,"signal":{},"retries":3,"retryAfter":16}}}

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@docs/developers-guide.md`:
- Around line 87-91: The compound sentence in the documentation lacks a comma
before "so": update the sentence "The helper emits conservative-fallback fields
so workflow logs can distinguish an actual Mermaid match from an unreadable file
that forced `make nixie` to run." by inserting a comma before "so" to read
"...conservative-fallback fields, so workflow logs can distinguish..." to
improve clarity in the developers-guide.md text.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 771d6026-62c7-4c40-941f-43b2d664ca3b

📥 Commits

Reviewing files that changed from the base of the PR and between 1b4b296 and 4a2720f.

📒 Files selected for processing (6)
  • .github/workflows/ci.yml
  • crates/repovec-ci/src/lib.rs
  • crates/repovec-ci/src/main.rs
  • crates/repovec-ci/tests/docs_gate_policy_bdd.rs
  • crates/repovec-ci/tests/docs_gate_unit.rs
  • docs/developers-guide.md

Comment thread docs/developers-guide.md Outdated
@coderabbitai

This comment was marked as resolved.

- Refactor main.rs to replace compute_plan with more explicit functions:
  print_usage, evaluate_from_paths, evaluate_from_stdin, and write_plan.
- Use match on Input enum directly in run() for clearer logic.
- Extract plan output logic into write_plan helper.
- Update developers-guide.md with expanded, clearer public API surface docs for repovec-ci,
  including detailed types, enums, functions, and rationale for cap-std usage.

This change improves code clarity and maintainability while enhancing documentation for
consumers of the repovec-ci crate's API.

Co-authored-by: devboxerhub[bot] <devboxerhub[bot]@users.noreply.github.com>
@leynos leynos changed the title Add CI gating pipeline with tests, docs, policy, and governance Add CI gating pipeline with tests, docs, policy, governance, and CLI Apr 14, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@crates/repovec-ci/src/main.rs`:
- Around line 54-64: Add insta as a dev-dependency in Cargo.toml and add
snapshot tests that lock the CLI stdout/stderr contract and write_plan
formatting/ordering: create integration tests (e.g., tests/cli_snapshots.rs)
that (1) call write_plan with deterministic DocsGatePlan fixtures to assert the
exact key=value ordering and field formatting via insta::assert_snapshot!, (2)
run the compiled binary (or main::run entry) capturing --help output, (3) run
variations for --changed-file and --stdin (including empty stdin) capturing
stdout, and (4) assert stderr and exit codes for invalid flags; ensure tests use
deterministic inputs (fixed DocsGatePlan, sorted matched_files) so snapshots are
stable.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 9294bbc2-f179-4792-a488-187febcae986

📥 Commits

Reviewing files that changed from the base of the PR and between 4a2720f and fb4acd9.

📒 Files selected for processing (2)
  • crates/repovec-ci/src/main.rs
  • docs/developers-guide.md

Comment thread crates/repovec-ci/src/main.rs
leynos and others added 2 commits April 14, 2026 17:40
Refactor and clean up the developers-guide section for the repovec-ci crate.
- Remove outdated notes about testing frameworks.
- Streamline explanations of DocsGateReason, DocsGatePlan, MermaidDetection, and
  related functions.
- Improve formatting and explanatory text regarding cap-std rationale.
- Enhance binary usage description for better readability.
- Rename output keys for clarity (`matched_count` to
  `matched_files_count`, `conservative_fallback_count` to
  `conservative_fallback_files_count`).

Overall, improve the accuracy and clarity of the documentation to aid future
contributors and users.

Co-authored-by: devboxerhub[bot] <devboxerhub[bot]@users.noreply.github.com>
Added new tests using insta snapshots to verify consistent CLI help output, handling of changed files input, empty stdin input, and invalid flag errors in repovec-ci. This improves test coverage and ensures stability of CLI user experience.

Co-authored-by: devboxerhub[bot] <devboxerhub[bot]@users.noreply.github.com>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@docs/developers-guide.md`:
- Around line 145-155: Update the docs to match the actual stdout keys emitted
by the repovec-ci binary: in docs/developers-guide.md replace the listed output
keys `matched_files_count` and `conservative_fallback_files_count` with the real
keys `matched_count` and `conservative_fallback_count` to mirror the contract
implemented in crates/repovec-ci/src/main.rs (the stdout `key=value` emitter in
main). Ensure the rest of the keys remain unchanged so the guide and binary
output stay in lockstep.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 3204d19d-3448-416c-a457-44aef1cd602e

📥 Commits

Reviewing files that changed from the base of the PR and between fb4acd9 and 8ecb1d7.

📒 Files selected for processing (1)
  • docs/developers-guide.md

Comment thread docs/developers-guide.md
@leynos leynos changed the title Add CI gating pipeline with tests, docs, policy, governance, and CLI Add CI gating pipeline with docs gate policy, ruleset, and repovec-ci Apr 14, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@crates/repovec-ci/src/main.rs`:
- Around line 8-12: The USAGE text for the CLI is incorrect for how parse_args
handles --changed-file (it accepts one path per flag, not multiple values);
update the USAGE constant so it documents repeated flags explicitly (e.g.
replace the single-flag "<path>..." form with a repeated-flag form such as
"<path> [--changed-file <path> ...]") so the usage string in USAGE matches the
behavior of parse_args and the --changed-file flag.
- Around line 59-62: Update the output key names to match the documented
$GITHUB_OUTPUT contract by changing the two keys written in the output writer:
replace "matched_count" with "matched_files_count" in the writeln! that uses
plan.matched_files().len(), and replace "conservative_fallback_count" with
"conservative_fallback_files_count" in the writeln! that uses
plan.conservative_fallback_files().len(); keep the same values
(plan.matched_files().len() and plan.conservative_fallback_files().len()) and
leave the corresponding comma-joined file lists unchanged.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 5a21b070-0a24-443d-96fd-c86375cd1c2b

📥 Commits

Reviewing files that changed from the base of the PR and between 8ecb1d7 and 1780ca7.

⛔ Files ignored due to path filters (5)
  • Cargo.lock is excluded by !**/*.lock
  • crates/repovec-ci/src/snapshots/repovec_ci__tests__changed_file_docs_output.snap is excluded by !**/*.snap
  • crates/repovec-ci/src/snapshots/repovec_ci__tests__help_output.snap is excluded by !**/*.snap
  • crates/repovec-ci/src/snapshots/repovec_ci__tests__invalid_flag_error.snap is excluded by !**/*.snap
  • crates/repovec-ci/src/snapshots/repovec_ci__tests__stdin_empty_output.snap is excluded by !**/*.snap
📒 Files selected for processing (2)
  • crates/repovec-ci/Cargo.toml
  • crates/repovec-ci/src/main.rs

Comment thread crates/repovec-ci/src/main.rs
Comment thread crates/repovec-ci/src/main.rs Outdated
Improved the usage message to allow multiple --changed-file flags with clearer syntax.
Renamed output keys from matched_count and conservative_fallback_count to matched_files_count and conservative_fallback_files_count respectively for clearer semantics.
Updated related tests, snapshots, and GitHub Actions workflow accordingly.

Co-authored-by: devboxerhub[bot] <devboxerhub[bot]@users.noreply.github.com>
Replaced the setup-bun GitHub action reference from a short commit hash to a longer, more precise commit hash to ensure exact version consistency in the CI pipeline.

Co-authored-by: devboxerhub[bot] <devboxerhub[bot]@users.noreply.github.com>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In @.github/workflows/ci.yml:
- Around line 116-126: When base_ref is absent we currently call
target/debug/repovec-ci with no args (in the else branch), which the helper
interprets as an empty changed_files list; instead, change the else branch to
signal "missing input" so the helper emits the conservative plan (require docs
gate and run Mermaid validation). Update the script so that when base_ref is
unavailable (the branch controlling changed_files and the else that currently
executes target/debug/repovec-ci >>"${GITHUB_OUTPUT}"), you invoke repovec-ci
with an explicit missing-input indicator or environment flag (e.g., a
--missing-input or a specific stdin token) so repovec-ci can detect unavailable
diff and set docs_gate_required=true; keep references to base_ref,
changed_files, target/debug/repovec-ci, and GITHUB_OUTPUT when implementing the
change.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 48a8b06e-8ae7-41be-90f3-d2d923afe936

📥 Commits

Reviewing files that changed from the base of the PR and between 1780ca7 and c46ef50.

⛔ Files ignored due to path filters (4)
  • crates/repovec-ci/src/snapshots/repovec_ci__tests__changed_file_docs_output.snap is excluded by !**/*.snap
  • crates/repovec-ci/src/snapshots/repovec_ci__tests__help_output.snap is excluded by !**/*.snap
  • crates/repovec-ci/src/snapshots/repovec_ci__tests__invalid_flag_error.snap is excluded by !**/*.snap
  • crates/repovec-ci/src/snapshots/repovec_ci__tests__stdin_empty_output.snap is excluded by !**/*.snap
📒 Files selected for processing (3)
  • .github/workflows/ci.yml
  • crates/repovec-ci/src/main.rs
  • docs/developers-guide.md

Comment thread .github/workflows/ci.yml
@leynos

leynos commented Apr 15, 2026

Copy link
Copy Markdown
Owner Author

@coderabbitai Have the following now been resolved?

Annul any requirements that violate the en-GB-oxendict spelling (-ize / -yse / -our) conventions (for example a request to replace "normalize" with "normalise" or "artefact" with "artifact"), or where the requirement unnecessarily increases cyclomatic complexity.

Please address the comments from this code review:

## Overall Comments
- For the `repovec-ci` CLI, consider explicitly handling `--help`/`-h` and printing a short usage message instead of treating all unknown flags (including help) as `InvalidInput` errors.
- In `path_contains_mermaid`, you currently treat any file read error as `true` (i.e., as if Mermaid is present); consider distinguishing/logging the I/O error path so it’s possible to tell the difference between real Mermaid detections and conservative fallbacks when diagnosing CI behaviour.
- The `docs-gate` workflow step calls `cargo run -p repovec-ci` each time it needs a decision, which rebuilds the binary on every run; you could speed this up by adding a dedicated build step and then invoking the compiled binary directly in subsequent steps.

## Individual Comments

### Comment 1
<location path="docs/developers-guide.md" line_range="65-67" />
<code_context>
+gate conservatively instead of risking a skipped validation.
+
+`make nixie` is narrower than `make markdownlint`: Mermaid validation runs only
+when one of the changed Markdown files contains a Mermaid diagram. The user
+visible flow is documented in [users-guide.md](users-guide.md).
+
+## CI policy helper
</code_context>
<issue_to_address>
**suggestion (typo):** Consider hyphenating "user-visible" as a compound adjective.

Since it’s used as an adjective before a noun here, hyphenating to “user-visible flow” keeps it consistent with “user-visible behaviour” elsewhere in the docs.

```suggestion
`make nixie` is narrower than `make markdownlint`: Mermaid validation runs only
when one of the changed Markdown files contains a Mermaid diagram. The user-visible
flow is documented in [users-guide.md](users-guide.md).
```
</issue_to_address>

### Comment 2
<location path="crates/repovec-ci/src/lib.rs" line_range="1" />
<code_context>
+//! CI policy helpers for repository automation and merge gating.
+
+use camino::Utf8Path;
</code_context>
<issue_to_address>
**issue (review_instructions):** Add rstest-bdd behavioural tests for the docs-gate policy helper in addition to the existing unit tests.

You only cover the docs-gate policy with `rstest` unit tests in this crate, while the roadmap and repo policy require both unit and behavioural tests for new features.

Implement `rstest-bdd` scenarios (e.g. in `crates/repovec-ci/tests/docs_gate_policy_bdd.rs` and the associated `.feature` file) that exercise the full decision surface described in the docs: docs-only changes, code-only changes, mixed changes, missing/empty change lists, and Mermaid vs non-Mermaid Markdown. Wire those scenarios to the `evaluate_docs_gate_in`/`evaluate_docs_gate_with` API so the behaviour is covered end-to-end rather than just through unit tests.

<details>
<summary>Review instructions:</summary>

**Path patterns:** `**/*`

**Instructions:**
For any new feature or change to an existing feature, both behavioural *and* unit tests are required.

</details>
</issue_to_address>

### Comment 3
<location path="docs/execplans/1-1-3-ci-gating-pipeline.md" line_range="133" />
<code_context>
+1. confirm whether branch protection will be managed manually or through
+   automation
+2. choose the exact check names that branch protection will require
+3. record that choice in the design document or an ADR if the policy is meant
+   to be durable
+
</code_context>
<issue_to_address>
**suggestion (review_instructions):** Expand the acronym "ADR" on first use (for example, "architecture decision record (ADR)") to satisfy the acronym-definition requirement.

ADR is relatively domain-specific, so it should be expanded the first time it appears in this document. Consider phrasing this as something like:

"...in the design document or an architecture decision record (ADR) if the policy is meant..."

<details>
<summary>Review instructions:</summary>

**Path patterns:** `**/*.md`

**Instructions:**
Define uncommon acronyms on first use.

</details>
</issue_to_address>

### Comment 4
<location path="docs/developers-guide.md" line_range="41" />
<code_context>
+These Make targets are the source of truth for local validation and for CI. Do
+not duplicate or partially reimplement them in workflow YAML.
+
+## GitHub Actions gate set
+
+The repository CI workflow exposes five stable, required job names:
</code_context>
<issue_to_address>
**suggestion (review_instructions):** Introduce "continuous integration (CI)" before using the acronym "CI" later in this section.

This section refers to "The repository CI workflow" without previously expanding CI in this document. To align with the acronym rule, add an earlier mention such as "continuous integration (CI) workflow" so that subsequent uses of "CI" are clear.

<details>
<summary>Review instructions:</summary>

**Path patterns:** `**/*.md`

**Instructions:**
Define uncommon acronyms on first use.

</details>
</issue_to_address>

### Comment 5
<location path="docs/users-guide.md" line_range="9" />
<code_context>
+
+## Documentation gate decisions
+
+When a change reaches CI, the workflow decides whether documentation validation
+is required and whether Mermaid diagram validation should also run. The
+decision is based on the changed-file list and, for Markdown files, whether the
</code_context>
<issue_to_address>
**suggestion (review_instructions):** Expand "CI" as "continuous integration (CI)" at first use in this guide.

This is the first use of "CI" in this file, so it should be written as something like "continuous integration (CI)" here. Subsequent uses can then safely use the acronym on its own.

<details>
<summary>Review instructions:</summary>

**Path patterns:** `**/*.md`

**Instructions:**
Define uncommon acronyms on first use.

</details>
</issue_to_address>

### Comment 6
<location path="docs/contents.md" line_range="5" />
<code_context>
+
+- [Documentation contents](contents.md): index of the repository documentation
+  set.
+- [Users guide](users-guide.md): user-visible workflows and CI behaviour that
+  contributors and operators need to understand.
+- [Developers guide](developers-guide.md): maintainer workflow, quality gates,
</code_context>
<issue_to_address>
**suggestion (review_instructions):** Expand "CI" to "continuous integration (CI)" in this index entry.

Because this is the first occurrence of "CI" in this file, expand it here (for example, "continuous integration (CI) behaviour") so the acronym is defined in-context before being reused elsewhere.

<details>
<summary>Review instructions:</summary>

**Path patterns:** `**/*.md`

**Instructions:**
Define uncommon acronyms on first use.

</details>
</issue_to_address>

### Comment 7
<location path="docs/contents.md" line_range="24" />
<code_context>
+  guidance on deterministic test design.
+- [rstest-bdd users guide](rstest-bdd-users-guide.md): behavioural testing
+  reference used by this repository.
+- [Rust doctest DRY guide](rust-doctest-dry-guide.md): guidance for keeping
+  Rust documentation examples maintainable.
+- [Rust testing with rstest fixtures](rust-testing-with-rstest-fixtures.md):
</code_context>
<issue_to_address>
**suggestion (review_instructions):** Expand the acronym "DRY" (e.g. "Don't Repeat Yourself (DRY)") in this entry.

"DRY" is an acronym and is first introduced here. To satisfy the acronym-definition rule, consider wording this as "Rust doctest Don't Repeat Yourself (DRY) guide" or similar, so readers see the expansion alongside the acronym.

<details>
<summary>Review instructions:</summary>

**Path patterns:** `**/*.md`

**Instructions:**
Define uncommon acronyms on first use.

</details>
</issue_to_address>

@coderabbitai

coderabbitai Bot commented Apr 15, 2026

Copy link
Copy Markdown

Tip

For best results, initiate chat on the files or code changes.

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
echo "=== Comment 1: user-visible hyphenation in developers-guide.md ==="
grep -n 'user.visible\|user visible' docs/developers-guide.md

echo ""
echo "=== Comment 2: BDD test files exist ==="
ls crates/repovec-ci/tests/ 2>/dev/null
ls crates/repovec-ci/tests/features/ 2>/dev/null

echo ""
echo "=== Comment 3: ADR expansion in execplans doc ==="
grep -n 'ADR\|architecture decision' docs/execplans/1-1-3-ci-gating-pipeline.md | head -20

echo ""
echo "=== Comment 4: CI acronym expansion in developers-guide.md ==="
sed -n '1,45p' docs/developers-guide.md

echo ""
echo "=== Comment 5: CI acronym expansion in users-guide.md ==="
sed -n '1,20p' docs/users-guide.md

echo ""
echo "=== Comment 6 & 7: CI and DRY in contents.md ==="
cat docs/contents.md

echo ""
echo "=== Overall comment 1: --help/-h handling in main.rs ==="
grep -n 'Help\|help\|\-h\b' crates/repovec-ci/src/main.rs | head -30

echo ""
echo "=== Overall comment 2: MermaidDetection::Unknown / path_contains_mermaid ==="
grep -n 'Unknown\|I/O\|io_err\|unreadable\|error' crates/repovec-ci/src/lib.rs | head -20

echo ""
echo "=== Overall comment 3: cargo run in CI workflow ==="
grep -n 'cargo run\|cargo build\|repovec-ci' .github/workflows/ci.yml | head -20

Length of output: 6456


@leynos Every item is resolved on the current branch. No requirements needed to be annulled — none violated en-GB-oxendict spelling or unnecessarily increased cyclomatic complexity.

# Comment Status
Overall 1 --help/-h prints usage instead of InvalidInput parse_args matches "--help" | "-h"Input::Help; run() calls print_usage
Overall 2 Distinguish I/O errors from real Mermaid detections ✅ Unreadable files return MermaidDetection::Unknown (not true/Present)
Overall 3 docs-gate rebuilding binary on every step ✅ Workflow has a dedicated cargo build --quiet -p repovec-ci step; subsequent steps invoke target/debug/repovec-ci directly
1 "user-visible" hyphenation in developers-guide.md ✅ Line 76: "The user-visible flow is documented…"
2 rstest-bdd behavioural tests for the docs-gate policy tests/docs_gate_policy_bdd.rs and tests/features/docs_gate.feature present
3 Expand ADR on first use in execplans/1-1-3-ci-gating-pipeline.md "architecture decision record (ADR)" on lines 135–136 and 310
4 Expand CI on first use in developers-guide.md ✅ Opening paragraph: "continuous integration (CI) workflow"
5 Expand CI on first use in users-guide.md ✅ Line 9: "continuous integration (CI)"
6 Expand CI on first use in docs/contents.md "continuous integration (CI) and documentation-gate behaviour"
7 Expand DRY on first use in docs/contents.md "Rust doctest Don't Repeat Yourself (DRY) guide"

…dd test

Changed the plan function in crates/repovec-ci/tests/docs_gate_policy_bdd.rs from a regular function returning a reference using as_ref().unwrap_or_else() to a const fn with a match statement for Option handling. This refactors the test code for clarity and const correctness.

Co-authored-by: devboxerhub[bot] <devboxerhub[bot]@users.noreply.github.com>
@leynos
leynos merged commit d125c81 into main Apr 16, 2026
7 checks passed
@leynos
leynos deleted the ci-gating-pipeline-kpquh2 branch April 16, 2026 01:36
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant