Repository navigation
fix(ci): centralize markdownlint coverage - #548
Conversation
0a22598 to
6f7e99d
Compare
6f7e99d to
6693c5f
Compare
wz-gsa
left a comment
There was a problem hiding this comment.
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.1removes the entirebraces/micromatch/globby/fast-globchain thatGHSA-vfj7-8cjw-p6xmsits 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.mdfiles, 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 (
MD012multiple-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.
🤖 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>
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:
markdownlint-cli2withmarkdownlint-clifrom.github/linters/package-lock.json;.markdownlint.jsoncand file exclusions to.markdownlintignore;--doteverywhere, so.github/**/*.mdis actually linted;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/linterspassed.npm run lint:mdpassed.npm audit --prefix .github/linters --audit-level=highpassed, 0 vulnerabilities..pre-commit-config.yaml,.markdownlint-cli2.yaml,package.json, and.github/linters/package.json.git diff --cached --checkpassed before commit.Rollback
Revert this PR to restore the current
markdownlint-cli2config path.Security Impact
No application runtime impact. Supply-chain posture is unchanged in shape: linter dependency remains pinned through
.github/linters/package-lock.jsonand audited in CI.AI-assisted. Human review required.