Repository navigation
Prepare 2.2.0: agent reach, directed boundaries, SARIF pentest profile, and the sibling-mitigation fix - #57
Merged
Conversation
…to it The test parses this repository in its body, not in beforeAll, so it ran under the 5000ms test default rather than the 10s hook default its siblings get. On CI it takes 3.1-3.8s and has crossed 5000ms on Node 18. The whole-repository scan is the assertion's point: cwe:CWE-89 is written in grammar examples across src/, so narrowing the scan would weaken it. The global testTimeout is unchanged.
GHSA-6qxp-vccf-f47h (CVE-2026-104850, high) is in the SDK's OAuth client. guardlink-mcp only runs the SDK's stdio server, so it is not reachable here, but npm audit flags every install of guardlink until the range excludes the vulnerable versions. The lockfile resolves 1.32.1.
package.json and package-lock.json's two root entries, plus the regenerated .guardlink/ artifact set. The only change in each artifact is the generator stamp moving from guardlink@2.1.0 to guardlink@2.2.0; the annotation hash is unchanged, and guardlink sync reports no change.
[Unreleased] becomes [2.2.0], led by the change that can turn a gate red (a @mitigates no longer clears sibling handlers) and an Upgrading list: more open exposures, route_candidates in place of a guessed route, artifact regeneration, ledger compatibility with 2.1.0, and the AnnotationVerb widening for exhaustive switches. Adds a Security entry for the MCP SDK bump. The README status block is refreshed from a real guardlink status . run on this tree.
npm audit fix, without --force, plus npm update tsx (4.21.0 -> 4.23.15, inside the declared ^4.0.0), whose ~0.27 pin was holding esbuild below its fix. package.json does not change; every move is inside a declared range. One move is held back by hand: npm took @hono/node-server from 1.19.9 to 2.1.3, which the MCP SDK's range allows but is a major of that package and requires Node >= 20, while guardlink supports Node >= 18. It is pinned at 1.19.17 instead, which is past every advisory against it. npm audit: 25 -> 6 (14 -> 3 with --omit=dev). What remains has no fix in range: braces (GHSA-vfj7-8cjw-p6xm, every version) and the micromatch and fast-glob that depend on it have no patched release, and vitest, tinypool and @vitest/mocker need vitest 5, a major.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Prepares the 2.2.0 release. Nothing here publishes anything. It adds no tag, no GitHub Release, no registry push and no workflow run.
.github/workflows/release.ymlruns when a GitHub Release is published, so merging this sends nothing to npm until someone creates that Release.What changed
test(readme): the D22 test gets a timeout sized to its work.tests/readme.test.ts› D22: the grammar examples do not register as real annotations parses the whole repository inside the test body. That puts it under vitest's 5000 ms test default, not the 10 sbeforeAlldefault the other tests that parse this repository get. On CI it takes 3.1–3.8 s, and it timed out at 5000 ms on Node 18 in two recentci.ymlruns. The full scan is what the test needs:cwe:CWE-89appears in grammar examples acrosssrc/, not only in the init template, so narrowing the scan would weaken the second assertion. It now has a 30 s timeout, following the convention intests/paths-format.test.tsandtests/sidecar-handoff.test.ts. The globaltestTimeoutis unchanged.fix(deps):@modelcontextprotocol/sdkgoes to^1.31.0. This addresses GHSA-6qxp-vccf-f47h / CVE-2026-104850 (high; vulnerable>= 1.12.0, < 1.31.0). The flaw is in the SDK's OAuth client.guardlink-mcpis a server and uses onlyStdioServerTransport(src/mcp/index.ts), so this code cannot reach it. Even so,npm auditflags every install of guardlink until the version range excludes it. The lockfile resolves 1.32.1.chore(release): 2.2.0. Changespackage.jsonand the two root entries inpackage-lock.json.src/version.tsreadspackage.jsonat run time, so every surface that reports a version follows it (see CONTRIBUTING, Generated Files). The.guardlink/artifact set is regenerated, and the only change in each file is thegenerator:stamp moving fromguardlink@2.1.0toguardlink@2.2.0. The annotation hash is byte-identical,ANNOTATION_HASH_VERSION(3) andARTIFACT_SCHEMA_VERSION(2) are unchanged since v2.1.0, andguardlink sync .produces no diff.docs(changelog,readme).[Unreleased]becomes[2.2.0] — 2026-10-07, covering #46–#55. No existing entry was reworded or dropped; I added a lead, an Upgrading list, a Security entry, and--stateonhypothesis boundaries, which the Added entry left out. The lead covers the change most likely to turn a gate red: a@mitigateson one handler no longer clears the same asset and threat on sibling handlers, sovalidate,ciandsarifcan report more open exposures. The Upgrading list covers:route_candidatesreplacing a guessedcodegraph_reachabilityon ambiguous SARIF results;security-severitybands.The README's
statusblock is refreshed from a realguardlink status .run on this tree (169 files, 891 annotations).On the version number: a minor, with one type change disclosed
I am not claiming "no breaking changes". No command, flag, library subpath, JSON field or SARIF result was removed, renamed or reordered, and new JSON fields and SARIF members are additive and optional. One TypeScript change is not purely additive.
AnnotationVerbgained'agents' | 'reaches' | 'effects' | 'gates', and theAnnotationunion gainedReachesAnnotation,EffectsAnnotationandGatesAnnotation. An exhaustiveswitchoververbwith aneverdefault stops compiling until it handles the four new verbs or adds a default branch. The 2.0.0 entry described the same kind of change for'actor'/'entitles'as breaking. This release follows the precedent 2.1.0 set instead: 2.1.0 widened the exportedDiagnosticCodeunion in a minor release. The changelog's On the version number paragraph states all of this.Verification
Node v24.14.0 / npm 11.9.0, the same Node major
release.ymlpins.npm cinpm run buildnpm run lintnpm testguardlink validate . --artifacts✓ Artifacts are current.✓ Artifacts are drawable.guardlink ci .guardlink --version,guardlink-mcp --version2.2.0npm pack --dry-runversion: 2.2.0, 796 files,conformance/includednpm auditfix(deps): take in-range fixes--omit=devThe SDK advisory itself (GHSA-6qxp-vccf-f47h) is already gone in the first column.
How the transitive fixes were taken:
npm audit fixwithout--force, plusnpm update tsx(4.21.0 → 4.23.15, within the declared^4.0.0). tsx's~0.27pin was holding esbuild below its fix (GHSA-g7r4-m6w7-qqqr).package.jsondoes not change. Every move stays inside a declared range.One move held back by hand.
npm audit fixtook@hono/node-serverfrom 1.19.9 to 2.1.3. The MCP SDK's range (^1.19.9 || ^2.0.5) allows that, but it is a major of that package and declaresengines.node >= 20, while guardlink supports>= 18. The lockfile pins it at 1.19.17 instead, which is past every advisory against it (<= 1.19.14). No other runtime dependency'senginesmoved above Node 18.Still open, and why:
braces(GHSA-vfj7-8cjw-p6xm)fast-glob→micromatchmicromatch,fast-globbraces; no fix availablevitest,@vitest/mocker(GHSA-82fw-gwwq-j7x9)tinypool(GHSA-5gmw-xhrv-c9v3, GHSA-85c8-ppgw-ccpr)The two critical advisories are in the test runner, which is not shipped in the package.
Note for review: rollup 4.64.1 (dev, via vite) adds an optional
@napi-rs/lzma-linux-x64-gnuwhoseenginesexcludes Node 18 and 20. npm does not enforceenginesby default, and this PR's CI on Node 18/20/22 is the check that it does no harm.Release workflow
Nothing in
release.ymlblocks this version:release: published.id-token: write.>= 11.5.1), andrepository.urlmatches this repository.npm publishtakes the version frompackage.json. The registry's latest is2.1.0.Two things to watch when cutting the Release:
npm testafter the Release is already public, but only on Node 24, where D22 runs in about 0.7 s. The Node 18 timeouts happened inci.yml.For a reviewer
conformance/boundaries.jsonis included in the package, butpackage.jsonexportslists only./conformance/flows.json. Soimport 'guardlink/conformance/boundaries.json'fails withERR_PACKAGE_PATH_NOT_EXPORTED, even though the file is there. The changelog says it "ships in the npm package", which is true of the file. Adding the export is a one-line follow-up and is not done here.docs/SPEC.mdstill shows"generator": "guardlink@2.1.0"in an example snippet (around line 1392). It's an illustration and the spec version is decoupled from the CLI's, so I left it alone.tests/paths.test.ts› findUnmitigatedPaths — against the live repo timed out on Node 20: itsbeforeAllparses the whole repository and hit the 10 s hook default. It passed on rerun. The dependency changes did not cause it. Locally that file andtests/readme.test.tstake 1.2 s with either lockfile, and the full suite 40.9 s after the change against 44.7 s before. On CI the same file already took 8.6 s on Node 18 in this PR's earlier green run. Several suites parse this repository inbeforeAll(lookup,context,paths,subgraph,external-id,agent-block,graph-completeness), so they share the margin D22 had. The release workflow tests only on Node 24, where these run fastest. Sizing those hooks deserves its own change and is not done here.