·
12 commits
to main
since this release
Immutable
release. Only release title and notes can be modified.
Changelog
✨ Features
- b744f34: feat!: read every setting under its prefixed name and no other (#807) (@jmrplens)
- 6bac542: feat(1:1): publish the three clean sent-field blocks, and give memberroles a context (#685) (@jmrplens)
- 9798d14: feat(1to1): R-PAGE, the dimension that asks whether a list says where it ends (#719) (@jmrplens)
- eb67d88: feat(audit): the e2e coverage command, credited from what the server dispatched (#728) (@jmrplens)
- 3d777c9: feat(audit): two gates for the card shape, reporting what the migration owes (#712) (@jmrplens)
- 6379aba: feat(e2e): call the real server by canonical action ID on every surface (#724) (@jmrplens)
- 71d7812: feat(e2e): declare the call record the rebuilt suite writes and the audit reads (#722) (@jmrplens)
- 6bbaaab: feat(e2e): measure the server binary in the transport modules (#771) (@jmrplens)
- 64343ca: feat(e2e): record what the old suite drives, and the two baselines it produces (#732) (@jmrplens)
- 76c611d: feat(e2e): record what the server dispatched, not what the test asked for (#725) (@jmrplens)
- 9c8d44d: feat(e2e): start the real server from a harness that probes before it writes (#723) (@jmrplens)
- 35e00d2: feat(e2e): the fixture library, with the shared World and the run-scoped sweep (#729) (@jmrplens)
- 015a351: feat(e2e): the runtime packages, their first tests on the real binary, and a non-blocking CI job (#733) (@jmrplens)
- fbe86dc: feat(eval): stop publishing, tell the truth about the numbers, and measure the prompt leak (#772) (@jmrplens)
- f3bad2f: feat(http): publish an ETag on the three unauthenticated documents (#694) (@jmrplens)
- 41b95a8: feat(http): serve the SEP-2127 card at /server-card, the catalog at the legacy path (#692) (@jmrplens)
- 0a488d5: feat(modeleval): build the Free worlds a case runs in, one recipe at a time (#800) (@jmrplens)
- 9290d77: feat(modeleval): call a model, and hash exactly what was sent (#799) (@jmrplens)
- 55fe5c9: feat(modeleval): decide what an attempt was worth, from the record alone (#798) (@jmrplens)
- f484278: feat(modeleval): declare what one run writes down, before anything writes it (#785) (@jmrplens)
- f55be12: feat(modeleval): finish the corpus, and write down what the move left behind (#794) (@jmrplens)
- c892584: feat(modeleval): hold a case's answer where nothing that asks it can read (#792) (@jmrplens)
- 6d01453: feat(modeleval): publish a measurement only when it can say what it measured (#804) (@jmrplens)
- 737e701: feat(modeleval): put the corpus to a model and write down what happened (#803) (@jmrplens)
- aba93c3: feat(modeleval): raise the world every case runs in, licensed half included (#801) (@jmrplens)
- 34893e1: feat(modeleval): send a model's own call and say what the server ran (#797) (@jmrplens)
- 7ce34e7: feat(modeleval): show a model the slice of the catalog it can be given (#806) (@jmrplens)
- 874fd3f: feat(release): attest the container image on both registries, and declare Docker Hub (#684) (@jmrplens)
- a036dcd: feat(tenancy): bound tools/list across the process (RTC-007) (#1046) (@jmrplens)
- 726f26c: feat(toolutil): add the one card writer and the value vocabulary it needs (#709) (@jmrplens)
🐛 Bug Fixes
- 0249c8d: fix(1to1): stop advertising thirteen fields that can never be filled (#696) (@jmrplens)
- 8a006be: fix(1to1): stop publishing ten fields no Grape entity exposes (#695) (@jmrplens)
- 7066112: fix(audit): make one rule decide what a GraphQL document is (#769) (@jmrplens)
- 6407369: fix(bench): draw the benchmark charts so a reader can read them (#795) (@jmrplens)
- 93d7500: fix(bench): survive a port lost between reserving it and the child binding it (#793) (@jmrplens)
- 3744f9f: fix(build): stop a failed recording reading as a fresh inventory (#770) (@jmrplens)
- 3267f05: fix(docs): check the anchor half of every documentation link (#788) (@jmrplens)
- 0bf10e9: fix(gitlab): keep a pinned tier through the lazy re-initialization (#1052) (@jmrplens)
- f8a3bbd: fix(http): a blocked address still serves a credential already admitted (#789) (@jmrplens)
- 85a30d2: fix(identity): check the canonical document is a Person before using it (#764) (@jmrplens)
- a8e73ce: fix(markdown): link only an http address, and carry a backslashed pipe as text (#721) (@jmrplens)
- a9f4194: fix(mergerequests): read the merge request back when a cancelled auto-merge answers without one (#752) (@jmrplens)
- 8adba88: fix(meta): stop an alias from rewriting an action the tool routes (#700) (@jmrplens)
- 26d6aeb: fix(model-results): merge a re-run case by case, and let a report be rehearsed (#809) (@jmrplens)
- 6b4cf9c: fix(model-results): refuse the two merges that would publish one label over two measurements (#812) (@jmrplens)
- 549c49f: fix(notifications): refuse a level the update scope does not accept (#852) (@jmrplens)
- 5f0d1dc: fix(oauth): advertise one scope, so a client asks GitLab for one (#705) (@jmrplens)
- 4d73bc0: fix(release): sign and attest the image outside the job that builds it (#689) (@jmrplens)
- a7d7c5b: fix(releaselinks): stop promising a field GitLab does not send (#853) (@jmrplens)
- 663fad3: fix(repository): echo the archive subdirectory back to the caller (#855) (@jmrplens)
- 534d12d: fix(server): drop a failed shape before its refusal reaches the caller (#768) (@jmrplens)
- 441bd3b: fix(settings): publish GitLab's answer and refuse an unsendable patch (#854) (@jmrplens)
- e4aa7c1: fix(telemetry): name the action a dispatcher ran, and count individual safe-mode previews (#706) (@jmrplens)
- 28b0203: fix(telemetry): name the action on the first call a process serves (#816) (@jmrplens)
- 2f74572: fix(telemetry): name the action registration bound to an individual tool (#701) (@jmrplens)
- 9ae164b: fix(test): give the polling-transition test a budget two polls fit in (#686) (@jmrplens)
- ca49017: fix(test-tooling): give a mutant a timeout it can survive being started in (#813) (@jmrplens)
- 7ebcc61: fix(tools): stop rendering credentials in tool Markdown (#708) (@jmrplens)
- 856a0a6: fix: three published claims the code stopped making, and a decoder that accepted an ambiguous identity (#805) (@jmrplens)
⚡ Performance
- 4098b13: perf(tests): cut a quarter off the unit suite and close every coverage gap (#811) (@jmrplens)
📚 Documentation
- df52b3a: docs(1to1): declare the 49 project-group fields as a wrong route annotation (#688) (@jmrplens)
- 706f74b: docs(adr-0018): correct what publishes the catalog, and pin the citation (#691) (@jmrplens)
- 7848eb4: docs(eval): withdraw the published model numbers (#783) (@jmrplens)
- 7db1440: docs(oauth): check read_api beside api on a writable deployment's application (#702) (@jmrplens)
- c95f436: docs(upstream): go-sdk 1273 is merged, and not yet in a release (#814) (@jmrplens)
- 890a089: docs(upstream): record the go-sdk batch and the auto-merge cancel annotation (#753) (@jmrplens)
- 8588a08: docs(upstream): record the go-sdk findings and correct the auto-merge entry (#784) (@jmrplens)
- 46be989: docs(upstream): record the merge requests that landed and the versions carrying them (#681) (@jmrplens)
- c613692: docs(upstream): record the two client-go merges and the page merge, and give six entries their summary rows (#739) (@jmrplens)
- 0995293: docs(upstream): record three GitLab endpoints that declare a response they do not send (#682) (@jmrplens)
- 4da8537: docs: retire the deleted e2e suite from the documents that still ran it, and sweep the dependencies (#767) (@jmrplens)
🚧 Maintenance
- e7ae118: Answer the rework verdicts the mutation round left open (#818) (@jmrplens)
- 8d253ce: Ask the discovery audit a parameter-guidance question that can fire (#856) (@jmrplens)
- 9606d79: Bind every template the server registers, and credit only what it acknowledges (#925) (@jmrplens)
- 5e9388f: Bound the OAuth identity cache and the round trips that verify a new token (#1087) (@jmrplens)
- 73a0bd7: Bound the calls the process holds open at once, sized by its descriptor limit (#1088) (@jmrplens)
- b174740: Bound the stateful sessions the process keeps, and reserve each one's stream when it opens (#1089) (@jmrplens)
- 93ced00: Close four request gaps: broadcast color, appearance site name, bulk publish options, service account get (#1010) (@jmrplens)
- 0add077: Close the Markdown card sweep: both staged rules now gate (#895) (@jmrplens)
- 3329276: Close the conditions the action-ID audit never evaluated both ways (#894) (@jmrplens)
- 08a0f72: Close the gate on the 15 tools domains the quota cut off (batch 2b) (#829) (@jmrplens)
- e4fe114: Close the invisible pairs batch 4 left open, in sixteen packages (#891) (@jmrplens)
- 89c1912: Close the mutation and condition gate on 29 more tools domains (batch 2) (#827) (@jmrplens)
- 7f96a54: Close the mutation and condition gate on 46 tools domains (batch 1 of 4) (#823) (@jmrplens)
- 306b6e5: Close the mutation and condition gate on the last 42 tools domains (batch 2 tail) (#832) (@jmrplens)
- 0d4ada4: Close the mutation and condition gate on the rest of internal/ (#820) (@jmrplens)
- c2a52b3: Close the mutation and condition gates on 51 more tool packages, and the swaps no fixture could see (#867) (@jmrplens)
- f306fed: Close the mutation and condition gates on eleven shared packages (#886) (@jmrplens)
- 4725de0: Close the mutation and condition gates on five generators (#979) (@jmrplens)
- efdde8e: Close the mutation and condition gates on six shared packages (#980) (@jmrplens)
- 164bdcb: Close the mutation and condition gates on sixteen audit commands (#884) (@jmrplens)
- 9627e3c: Close the mutation and condition gates on ten generators (#885) (@jmrplens)
- e6483d6: Close the mutation and condition gates on the last sixteen tool packages (#868) (@jmrplens)
- f365ba8: Close the mutation and condition gates on twelve audit commands (#978) (@jmrplens)
- 048501c: Close the mutation and condition gates on twenty repository commands (#871) (@jmrplens)
- 23672ba: Close the mutation and condition sweep of cmd/server (#1015) (@jmrplens)
- 8c61edc: Close the tenant policy gate and write the rule down (#994) (@jmrplens)
- a8eb803: Close the thirteen mutants the action-ID audit was left with (#890) (@jmrplens)
- 8bca87f: Close what the wave 1 layers left open, and refresh the generated artifacts once (#1040) (@jmrplens)
- 2658ee3: Compile the mutation runs under -trimpath so a worker's copy reuses the build cache (#1062) (@jmrplens)
- ea9850e: Complete a user from the captured answer in one place, and bring internal/toolutil to its gate (#1067) (@jmrplens)
- 5d30721: Confirm a 401 that names nothing before ending a pooled credential (#938) (@jmrplens)
- 28e1ee3: Confirm a pull mirror that overwrites diverged branches (#796) (@jmrplens)
- ad9e5ee: Correct the report texts and doc comments that describe a state the code left (#1003) (@jmrplens)
- 814e5a8: Correct the survivor taxonomy and put the sweep brief in plan (#834) (@jmrplens)
- f3b3ede: Count each capability at the grain it varies along (#923) (@jmrplens)
- 54628cf: Count every method's server span as arriving in the e2e flush (#933) (@jmrplens)
- 663ea35: Decide in the tenant policy register what makes a pool entry busy (#992) (@jmrplens)
- 42f8ab3: Decide in the tenant policy register what zero means for the authentication budgets (#993) (@jmrplens)
- 52da33d: Decide in the tenant policy register which bucket a method is charged to (#991) (@jmrplens)
- 867b627: Declare every tenant decision in one register (#984) (@jmrplens)
- da44e5a: Declare the 1:1 audit's oracle artifacts and re-pin its live record (#1000) (@jmrplens)
- 2fd7a3b: Decode resource URI variables once, and expand ours by RFC 6570 (#930) (@jmrplens)
- cdc580b: Decode the vulnerability and security finding fields the schema offers (#1007) (@jmrplens)
- ca6adc0: Delete the ActionSpecs twenty-three packages declared and nothing served (#859) (@jmrplens)
- ab45cd3: Delete the constants nothing reads, and add the rule that sees them (#846) (@jmrplens)
- 06cd1bc: Demand a canonical action ID wherever one is published (#860) (@jmrplens)
- e17b831: Describe a 401 by both of its causes (#921) (@jmrplens)
- 71fcce0: Detect the tier without an administrator token, where GitLab allows it (#899) (#900) (@jmrplens)
- 988c910: Drive the HTTP overlay's authentication budgets and bring internal/config to its gate (#1063) (@jmrplens)
- 17f13ba: Escalate on distinct rejected tokens, and make the auth budgets configurable (#897) (@jmrplens)
- e76b6f1: Exclude a standalone utility by every spelling on every surface (#929) (@jmrplens)
- a163ddc: Fix what the review of the exclusion, resource URI, sweep, mutation and flush layers found (#935) (@jmrplens)
- 73b285b: Fix what the stack's own gates found at its tip, and refresh what it moves (#862) (@jmrplens)
- 4519a40: Fix what the whole-stack review of 902-905 found (#926) (@jmrplens)
- f2f4b0e: Fix what the whole-stack review of 907 to 937 found (#946) (@jmrplens)
- 2b8b835: Fix what the whole-stack review of issue 565 found (#995) (@jmrplens)
- 96f4a29: Gate the em dash in CI, on the diff and on the pull request description (#835) (@jmrplens)
- 065a404: Gate the tenant policy register against the code (#985) (@jmrplens)
- 5423779: Give the Claude Desktop bundle a Linux entry (#918) (@jmrplens)
- d1ca5f9: Give the surface audit an exit code, and two rules it can answer (#861) (@jmrplens)
- a21f75c: Hand a request only connections dialed under its own destination rule (#944) (@jmrplens)
- 608d665: Hint a permission GitLab refuses with 401 on every route that does (#939) (@jmrplens)
- 544af4f: Hold seven declaration tables to what they answer, and flatten fields the way the encoder does (#1002) (@jmrplens)
- 10dee2b: Hold the Orbit output types and client-go's decoders to the kinds GitLab.com sent (#1074) (@jmrplens)
- de1ab3b: Hold the carried-channel matrix to what go-sdk does (#1011) (@jmrplens)
- d3d6893: Hold the e2e suite's quotations of served text to the catalog (#924) (@jmrplens)
- f23bb84: Hold the security filter lists and scan profile names to what GitLab 19.5 takes, and publish the Terraform state times (#1073) (@jmrplens)
- 373a7d8: Judge decoders typed by a generic receiver, and accept the numbers json.Number accepts (#1004) (@jmrplens)
- b731191: Leave output_path as it was when a package download fails (#943) (@jmrplens)
- e30abf5: Let a group share grant a custom role, at every access level GitLab takes (#1071) (@jmrplens)
- 1bda710: Let a group tool introduce itself instead of its first action (#826) (@jmrplens)
- 659350f: Let the site audit pass when npm answers with a 5xx (#845) (@jmrplens)
- 60b8808: Make PKG mean one package in the mutation recipe (#877) (@jmrplens)
- 0f21651: Make R-PATH see values, not only names (#857) (@jmrplens)
- 9d7c02f: Make a complete Docker e2e run skip nothing it has not declared (#1039) (@jmrplens)
- 2e66209: Make the mutation gate measure a command instead of praising it (#873) (@jmrplens)
- b3beae2: Make three tests hold what their names and comments claim (#837) (@jmrplens)
- 6dabbc7: Measure the OAuth verification ceiling with an OAuth driver for bench-fairness (#1091) (@jmrplens)
- 0ea4abd: Measure the conditions of a package that declares a function once per platform (#1064) (@jmrplens)
- 74697f1: Move client-go to v3.14.0 and add package.get (#962) (@jmrplens)
- 4b4d52a: Name a capability by its action ID in every corrective hint (#888) (@jmrplens)
- 0e7970c: Name actions by their canonical ID in every sentence the server serves (#941) (@jmrplens)
- 67e98ea: Name an approver on the second approval rule the paging scenario adds (#1038) (@jmrplens)
- fddc525: Name the action IDs the catalog holds in five documentation pages (#850) (@jmrplens)
- fc7b414: Name the canonical action ID in all 569 places that did not (#838) (@jmrplens)
- 8f24d0d: Name the package each admin action routes to as its owner (#847) (@jmrplens)
- 9a160fe: Name the standalone actions in telemetry and in the e2e projection (#922) (@jmrplens)
- 6cefaba: Narrow a cross-link to the session that is shown it (#849) (@jmrplens)
- 6d2041c: Offer the event filters GitLab accepts, and refuse an action it would ignore (#1070) (@jmrplens)
- 0e8c0e8: Page the fifteen list actions that returned one page and no way to ask for the next (#1005) (@jmrplens)
- 0889ab8: Page the lists that read only GitLab's first page, and name the flag behind an attestation 404 (#1065) (@jmrplens)
- 349deb6: Pair compact projections in the type grain and fix the families it shows (#1001) (@jmrplens)
- b2e5e4e: Pass the handler's context to every SDK call, and gate it (#940) (@jmrplens)
- 273f642: Pin the site's fast-uri, ip-address and undici past this week's advisories (#1076) (@jmrplens)
- 2140b33: Pin what a go-sdk client does with this server's refusals, and record the three go-sdk defects behind them (#1032) (@jmrplens)
- 852a653: Publish commit trailers as the lists GitLab sends, and read them past client-go's decode failure (#1072) (@jmrplens)
- 37e9241: Publish or declare the last sent fields the type and package grains report (#1035) (@jmrplens)
- 318b926: Publish the author and rendered text the context commit list sends, and give the pin its own answer (#1066) (@jmrplens)
- 4c2f805: Publish the entity GitLab answers with on the access-request routes (#875) (@jmrplens)
- 92ca71f: Put the rate limiter's refusal-window cases on a clock the test owns (#878) (@jmrplens)
- 9201486: Re-pin the GraphQL schema to 19.5.0-pre and answer what the endpoint comparison found (#1037) (@jmrplens)
- fd93a5f: Read the application statistics GitLab sends with a thousands separator (#1069) (@jmrplens)
- d9851d2: Read the authentication budgets from the tenant policy register (#988) (@jmrplens)
- ae115f2: Read the capability names a handler's error hints spell (#880) (@jmrplens)
- 7eed8c9: Read the pool and admission values from the tenant policy register (#987) (@jmrplens)
- 519c1c8: Read the rate charges and the tier paging from the tenant policy register (#989) (@jmrplens)
- b1b44d7: Read the subscription holdings from the tenant policy register (#986) (@jmrplens)
- 9ba57ba: Record a CI variable key as :key, not as the endpoint (#874) (@jmrplens)
- d16a99a: Record client-go v3.14.0 and say in the README what goes upstream (#949) (@jmrplens)
- d63cb4c: Record issue 951's decisions on the held-call and session ceilings, and say one credential can fill them (#1093) (@jmrplens)
- efbf719: Record that rmcp merged the float fix Codex was waiting on (#998) (@jmrplens)
- e54b91b: Record the answers on the joint client-go merge request and stop job.cancel sending null (#1081) (@jmrplens)
- 5da9699: Record the go-sdk read and the knowledge-graph skip markers (#1080) (@jmrplens)
- 6ccd42f: Record the hash and symbol conditions the live API record left empty (#999) (@jmrplens)
- f04e7d2: Record the joint client-go merge request and where every upstream contribution stands (#1018) (@jmrplens)
- 7eede0b: Record the merge of gitlab-org/gitlab!255702 and the rebase of gitlab-org/gitlab!255704 (#1084) (@jmrplens)
- 3b73faf: Record the nulls client-go sends on a partial package-protection update (#858) (@jmrplens)
- b822c05: Record the one request the client-go bump silently changed (#842) (@jmrplens)
- e70924c: Record the revoked GPG UID fix as merged upstream (#919) (@jmrplens)
- 7af85c0: Record the saved view fix in review upstream, and refresh the generated artifacts (#1048) (@jmrplens)
- d7ca575: Record the snippet clone URL documentation as merged (#914) (@jmrplens)
- f0f9363: Record the split of gitlab-org/api/client-go!3063 in the register (#1086) (@jmrplens)
- c560f43: Record the tenant policy baselines and pin who a tenant is (#990) (@jmrplens)
- 85e44fb: Record the upstream contributions of 27 and 28 September, and bring the dependencies up to date (#1058) (@jmrplens)
- 285266c: Record the upstream merge requests read on 2026-09-29 (#1078) (@jmrplens)
- 001a013: Record the upstream merge, answers and pushes of 2026-09-29 (#1079) (@jmrplens)
- 77e72c4: Record the upstream state of 2026-09-30 in the register (#1083) (@jmrplens)
- a146348: Record what GitLab does with each null an always-sent option writes (#1033) (@jmrplens)
- c245555: Record what GitLab.com's Orbit routes answer and hold the Orbit output types to it (#1036) (@jmrplens)
- 78d0fdd: Record what client-go v3.12.0 owes the one-to-one promise (#844) (@jmrplens)
- 9f15f07: Record where each upstream contribution stood on 2026-09-24 (#936) (@jmrplens)
- dcf0760: Refuse a blank namespace id or search query instead of answering with someone else's namespace (#1068) (@jmrplens)
- 6cf683b: Refuse a skip command in a pull request description (#1098) (@jmrplens)
- 2719831: Refuse a start that still sets the retired EXCLUDE_TOOLS, as the retired read-only switches already do (#1092) (@jmrplens)
- cb6379f: Regenerate at the top of stack 934 and lint every tree cold in CI (#948) (@jmrplens)
- b3342fc: Report the quick actions of an epic note, and decode the epic fields the schema offers (#1008) (@jmrplens)
- 1337f43: Resolve a legacy action spelling from the group that owns it (#848) (@jmrplens)
- bca32a1: Retire the captured reads client-go v3.12.0 made unnecessary (#843) (@jmrplens)
- 783f3ef: Say at startup which HTTP-only flags a stdio run ignores, and refuse the ones it cannot ignore safely (#1090) (@jmrplens)
- 633a794: Say who may push or merge on a branch rule, and decode what five GraphQL domains dropped (#1009) (@jmrplens)
- 92117ba: Say why the harness has no exit status, when it has none (#881) (@jmrplens)
- f605911: Select the fields the vulnerability output type already published (#879) (@jmrplens)
- 84b17ea: Send a model to the resource it asked about, not a neighbour of it (#851) (@jmrplens)
- 50ef2cf: Serialize go/packages type-checking in race builds, working around golang/go#81122 (#1082) (@jmrplens)
- a45ffde: Serve the server card after every form of the endpoint (#1061) (@jmrplens)
- 1a3d309: Specify tenant policy before any code (#565) (#898) (@jmrplens)
- 7baa4a4: Start one pipeline in the Pages unpublish scenario, so no deployment lands after the unpublish (#1094) (@jmrplens)
- f826565: State where the server stands on rate limiting tool invocations and on clientInfo (#1047) (@jmrplens)
- 80e7c39: Stop CodeRabbit writing into the pull request description (#840) (@jmrplens)
- aa47012: Stop golangci-lint-action restoring its own analysis cache in CI (#1097) (@jmrplens)
- 87517ca: Stop judging an outbound proxy on a private address as the destination (#947) (@jmrplens)
- e7db75c: Stop publishing output fields GitLab does not send (#1006) (@jmrplens)
- ed58d02: Strip the refused Host from exported logs, and keep the e2e harness to one waiter per child (#865) (@jmrplens)
- eed351b: Sweep personal snippets, and make the orphan sweep reach killed runs (#931) (@jmrplens)
- d11577b: Take client-go to v3.12.0 (#841) (@jmrplens)
- b75ead6: Teach the licensed suite the hints the server actually emits (#906) (@jmrplens)
- b98e75d: Time the mutation baseline by the clock, under gremlins' own tags (#932) (@jmrplens)
- b44ab96: Update the dependencies the cooldown admits, and pin the site past five advisories published on 29 September (#1085) (@jmrplens)
- e180b24: Wait for the project and group transfers GitLab 19.4 applies in the background (#1034) (@jmrplens)
- 9c8390b: Wait out two GitLab races the Docker EE run of this stack hit (#1077) (@jmrplens)
- 3e1a184: build(e2e): remove the enterprise analysis pass and every mention of the tag (#743) (@jmrplens)
- d6653b4: chore(deps): bump actions/attest from 4.2.1 to 4.2.2 in the actions-all group (#887) (@dependabot[bot])
- 7a18afe: chore(identity): fetch the canonical #person, keep no copy of it (#762) (@jmrplens)
- 6323ed1: chore(identity): sync the canonical #person snapshot (@jmrplens)
- 986faa7: chore(identity): sync the canonical #person snapshot (@jmrplens)
- a079485: chore(release): move VERSION to 3.1.0 (#815) (@jmrplens)
- b3dc67a: chore: refresh the generated artifacts at the top of the stack (#754) (@jmrplens)
- 194953f: chore: update manifests for v3.0.0 (@jmrplens)
- c37ad56: ci: rerun a test binary that stopped without a word, and keep the streams of a failed leg (#738) (@jmrplens)
- da3943d: cmd/audit_action_ids: check the action IDs the server publishes against the catalog (#836) (@jmrplens)
- f3f02d3: refactor(1to1): one output type per entity, and the thirty fields GitLab sends (#698) (@jmrplens)
- 5338ad6: refactor(eval): delete cmd/eval_mcp_surfaces and everything that pointed at it (#808) (@jmrplens)
- cebcaf1: refactor(eval): delete the answer-keyed guidance, and gate it shut (#776) (@jmrplens)
- 5790580: refactor(eval): delete the exact-envelope prompt path (#774) (@jmrplens)
- 4587cbf: refactor(eval): replace both surfaces' prompts with a surface contract, and gate it (#779) (@jmrplens)
- e6c5a18: refactor(markdown): the card vocabulary for issues, projects, groups, users and access (#716) (@jmrplens)
- 2dbcc41: refactor(markdown): the card vocabulary for merge requests, CI/CD, repository content and packages (#717) (@jmrplens)
- 72157a0: refactor(markdown): the card vocabulary for security, planning, integrations and the instance surfaces (#718) (@jmrplens)
- 39db26d: refactor(markdown): the last wave, and both gates at zero (#720) (@jmrplens)
- b05fd40: refactor(testutil): one shard mechanism for the two records that share it (#802) (@jmrplens)
- 4305bd4: refactor(tools): share the post-registration visibility pass with the evaluator (#736) (@jmrplens)
- 3801427: refactor(toolutil): the shared renderers, the registry and the refusal envelope onto Card (#711) (@jmrplens)
- 7d5f9eb: refactor: remove 171 silenced lint findings and keep the 268 that earn it (#761) (@jmrplens)
- 3c3069a: test(bench): bound the steady phase by turns where the assertion is about turns (#787) (@jmrplens)
- 77f82b2: test(bench_resources): time the percentile test on a clock it controls (#1051) (@jmrplens)
- 3f58de0: test(e2e): S22, the coverage record, binary coverage, the launcher lessons and per-action observation (#763) (@jmrplens)
- 040368f: test(e2e): admin_mode on the fixture token, and one seed per consumer (#726) (@jmrplens)
- d4c5592: test(e2e): assert the actions the old CE suite covered and the port left behind (#751) (@jmrplens)
- e43da83: test(e2e): bound a cleanup's calls by the cleanup budget, and de-flake the balancer affinity test (#756) (@jmrplens)
- baf7c44: test(e2e): cover every catalog action and make the rebuilt suite the release gate (#757) (@jmrplens)
- ef784ca: test(e2e): delete the old EE half and drop the enterprise build constraint (#742) (@jmrplens)
- 7b3df23: test(e2e): delete the superseded suite, fix the gate it leaves behind, and retire RegisterAllMeta (#760) (@jmrplens)
- 1580bb0: test(e2e): port the MCP-layer families of the old CE suite (#750) (@jmrplens)
- d9753ba: test(e2e): port the admin, runner and instance-settings CE families (#745) (@jmrplens)
- 7220828: test(e2e): port the first half of the old EE suite to the runtime packages (#740) (@jmrplens)
- 91dcce8: test(e2e): port the issue, merge request, snippet, wiki and search families (#749) (@jmrplens)
- 91eb4f8: test(e2e): port the project and group families of the old CE suite (#747) (@jmrplens)
- d5bdae3: test(e2e): port the repository, CI, environment, release and package families of the old CE suite (#748) (@jmrplens)
- 41b9404: test(e2e): port the second half of the old EE suite, the group and epic families (#741) (@jmrplens)
- b3c37e2: test(e2e): port the user, access, token and to-do families of the old CE suite (#746) (@jmrplens)
- c314704: test(e2e): sweeps in common driven by what each session serves (#735) (@jmrplens)
- 37b5d45: test(server): assert what a narrowed read_api token is served, and spell the module path once (#731) (@jmrplens)
- fb6a2fe: test(server): close the stdin pipe's write end before its read end (#791) (@jmrplens)
- 85ab706: test(server): spend each OpenTelemetry delegation before the tests run (#1049) (@jmrplens)
Full changelog: v3.0.0...v3.1.0
Verify the assets
All binaries are listed in checksums.txt, signed keylessly with cosign:
cosign verify-blob \
--bundle checksums.txt.sigstore.json \
--certificate-identity "https://github.com/jmrplens/gitlab-mcp-server/.github/workflows/release.yml@refs/tags/v3.1.0" \
--certificate-oidc-issuer "https://token.actions.githubusercontent.com" \
checksums.txt
sha256sum --check --ignore-missing checksums.txt