Skip to content

fix(ci): centralize markdownlint coverage - #548

Merged
mogul merged 1 commit into
mainfrom
fix/markdownlint-cli-dot-coverage
Oct 5, 2026
Merged

mogul merged 1 commit into
mainfrom
fix/markdownlint-cli-dot-coverage

Conversation

@mogul

@mogul mogul commented Oct 5, 2026

Copy link
Copy Markdown
Contributor

Summary

Standalone quickstart markdownlint fix, separated from #474 so every in-flight PR does not carry its own copy.

This applies the same centralization principle as GSA-TTS/agentic-coding-patterns#451 (one npm-pinned markdownlint dependency path for local hooks and CI), then includes the quickstart-specific issue found while resolving #474:

  • replace markdownlint-cli2 with markdownlint-cli from .github/linters/package-lock.json;
  • move rule config to .markdownlint.jsonc and file exclusions to .markdownlintignore;
  • pass --dot everywhere, so .github/**/*.md is actually linted;
  • make the CI non-empty assertion use git's gitignore engine instead of hand-translating ignore patterns into pathspecs.

Why separate

#474 and stacked PRs currently touch the same markdownlint files while also changing unrelated backend behavior. Landing this first lets those branches drop their local markdownlint copy and focus reviews on their feature changes.

Verification

  • npm ci --prefix .github/linters passed.
  • npm run lint:md passed.
  • npm audit --prefix .github/linters --audit-level=high passed, 0 vulnerabilities.
  • YAML/JSON parse check passed for .pre-commit-config.yaml, .markdownlint-cli2.yaml, package.json, and .github/linters/package.json.
  • git diff --cached --check passed before commit.
  • Selection parity probe passed: workflow count = 53; markdownlint custom always-report rule selected 53 files.

Rollback

Revert this PR to restore the current markdownlint-cli2 config path.

Security Impact

No application runtime impact. Supply-chain posture is unchanged in shape: linter dependency remains pinned through .github/linters/package-lock.json and audited in CI.

AI-assisted. Human review required.

@mogul
mogul force-pushed the fix/markdownlint-cli-dot-coverage branch from 6f7e99d to 6693c5f Compare October 5, 2026 19:25

@wz-gsa wz-gsa left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Independently re-verified in an isolated worktree before approving — not just trusting the PR's own transcript.

Core security fix confirmed:

  • npm ci && npm audit --audit-level=high: 0 vulnerabilities in a fresh install (markdownlint-cli2 → markdownlint-cli@0.49.1 removes the entire braces/micromatch/globby/fast-glob chain that GHSA-vfj7-8cjw-p6xm sits in, with no patched upstream release available).
  • Full lint run with the PR's real invocation (--config .markdownlint.jsonc --ignore-path .markdownlintignore --dot "**/*.md"): clean, exit 0.
  • File-count parity cross-checked via git ls-files: 54 tracked .md files, 1 ignored (CHANGELOG.md), 53 expected — exact match to the real tool's own count.

Adversarially stress-tested the --dot claim specifically (rather than taking the commit message at face value), since this is exactly the kind of flag-default difference that silently narrows lint coverage if gotten wrong:

  • Injected a real violation (MD012 multiple-blanks) into .github/pull_request_template.md.
  • Old markdownlint-cli2@0.23.3's actual CI invocation (no CLI glob args, config-only): catches it — cli2 already includes dot-directories by default.
  • New markdownlint-cli, without --dot: misses it silently, exit 0.
  • New markdownlint-cli, with --dot (as this PR ships): catches it correctly, exit 1.

One nuance worth flagging for the record: this means --dot here is avoiding a regression the tool swap would otherwise introduce (different tool, different default), rather than fixing a pre-existing gap in the old tool as the commit message's phrasing could be read — the old markdownlint-cli2 already covered this file. Doesn't change the verdict; the PR correctly includes --dot everywhere it's needed, I just want that distinction on record.

Also verified the gitignore-engine point in the PR's own commit message: confirmed git ls-files --exclude-from=.markdownlintignore genuinely gives different results from a naive pathspec translation for directory-shaped excludes like test/vendor — using git's real gitignore semantics for the CI "did we lint anything" assertion is the right call, not just defensive-sounding prose.

Nice, clean separation from the stacked #474/#541 branches too — this unblocks the shared CI failure without entangling it in unrelated feature review.

Approving. CI is green except one job that self-cancelled from a concurrency-group race (same pattern I hit on patterns#471 today, unrelated to this change) — re-triggered via gh run rerun, waiting on it before merge.

@mogul
mogul merged commit a27c31e into main Oct 5, 2026
12 of 17 checks passed
@mogul
mogul deleted the fix/markdownlint-cli-dot-coverage branch October 5, 2026 21:36
mogul added a commit that referenced this pull request Oct 6, 2026
🤖 I have created a release *beep* *boop*
---


##
[4.0.0](v3.1.0...v4.0.0)
(2026-10-06)


### ⚠ BREAKING CHANGES

* **kits:** acq no longer installs podman/OCI tooling by default. Users who need docker, docker compose, or rootless podman when the base image doesn't provide it must opt into the oci-engine kit with `acq configure`, `--kit`, or `ACQ_EXTRA_KITS`.
* **kits:** acq no longer performs native OpenCode npm fallback installation. OpenCode is supplied by the pinned opencode agent kit from agentic-coding-patterns v1.12.0, currently delivering OpenCode v2.0.22. If the kit is unavailable or invalid, acq fails closed instead of installing opencode-ai from npm.
* **kits:** existing acq sandboxes with adapter-installed podman are not migrated in place. Recreate affected sandboxes or add the oci-engine kit before relying on OCI behavior after stop/start.

### Features

* **acq:** choose the host port per sandbox, and let --publish pin it
([#526](#526))
([410f332](410f332))
* **acq:** export ACQ_WORKSPACE and ACQ_CLONE into the guest on both
backends
([#457](#457))
([e0b9a3b](e0b9a3b))
* **acq:** interactive `acq configure` UI for extra kits + token-scoping
defaults
([#500](#500))
([13d9d3a](13d9d3a))
* **kits:** adopt pinned agent and capability kits
([#474](#474))
([6a67063](6a67063))
* **secrets:** add Windows-native DPAPI secret backend
([#464](#464))
([907f404](907f404))
* **windows:** add acq preview install path
([#463](#463))
([d6d76f4](d6d76f4))


### Bug Fixes

* **acq:** use sandbox workspace for github scoping
([#476](#476))
([1610835](1610835))
* **ci:** bump js-yaml to 4.3.2 to clear a high-severity CPU-DoS
advisory
([#454](#454))
([3217b49](3217b49))
* **ci:** bump smol-toml to 1.7.1 to clear an infinite-loop DoS advisory
([#459](#459))
([c2291bf](c2291bf))
* **ci:** centralize markdownlint coverage
([#548](#548))
([a27c31e](a27c31e))
* **ci:** pin markdownlint-cli2 once, clear GHSA-253c, unify file
selection
([#527](#527))
([e712685](e712685))
* **ci:** unblock unrelated PRs from the bash32 required-check deadlock
([#513](#513))
([187aa57](187aa57))
* **install:** keep curl | sh stdin intact and tap msb formula first
([#462](#462))
([c808d74](c808d74))
* **install:** trust the microsandbox-acq dependency before brew install
([#534](#534))
([ffac0fa](ffac0fa))
* **kits:** land collapsed kit stack implementation
([#549](#549))
([bcd5b9c](bcd5b9c))
* **msb:** allow Playwright browser downloads
([#477](#477))
([0c399c5](0c399c5))
* **msb:** block unsafe 0.7 migration versions
([#510](#510))
([3634046](3634046))
* **msb:** carry every origin URL, keep the scratch private, fail closed
on a copy miss
([#488](#488))
([babcd49](babcd49))
* **msb:** carry the source checkout's git identity into the --clone
scratch
([#443](#443))
([320d784](320d784))
* **msb:** follow the host resolvers and disable DNS rebind protection
in the guest
([#444](#444))
([d2f4bdc](d2f4bdc))
* **msb:** point the --clone scratch's origin at the source checkout's
remote
([#455](#455))
([7f48b94](7f48b94))
* **msb:** refresh ssh authorization for port publish
([#446](#446))
([72a6bd5](72a6bd5))
* **msb:** session parity for exec/attach/shell (cwd, terminal identity,
login shell)
([#427](#427))
([6261eda](6261eda))
* **msb:** skip the recursive home chown when the image baked the agent
user
([#432](#432))
([d8f66a4](d8f66a4))
* **msb:** thread the merged kit env onto kit lifecycle commands
([#519](#519))
([2248a92](2248a92))
* **msb:** translate kit wildcard network rules
([#451](#451))
([e22bbc3](e22bbc3))
* **msb:** verify post-hoc port forward listener
([#530](#530))
([8ca50e1](8ca50e1))
* **msb:** warn on broadened kit wildcard rules
([#460](#460))
([6ded3ce](6ded3ce))
* **msb:** warn when ssh-agent route is missing
([#448](#448))
([3a767a4](3a767a4))
* **sbx:** emit valid setup.install shape for the git-identity mixin
([#492](#492))
([8e6160c](8e6160c))
* **sbx:** raise the version floor to 0.39.0, where sbx create --env
first exists
([#491](#491))
([30f9ecf](30f9ecf))
* **sbx:** wait for startup barrier before attach
([#512](#512))
([33c83c5](33c83c5))
* **secret:** reject multiline test secret values
([#447](#447))
([f2da950](f2da950))
* **secrets:** propagate rotation across backends
([#509](#509))
([9641958](9641958))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Bret Mogilefsky <bret.mogilefsky@gsa.gov>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants