• v0.20.0 31693766e2

    v0.20.0
    Some checks failed
    drift / govulncheck (pull_request) Has been skipped
    drift / surface-diff (pull_request) Successful in 30s
    drift / forgejo-smoke (pull_request) Has been skipped
    ci / mcp-conformance (pull_request) Successful in 1m33s
    ci / mcp-conformance (push) Successful in -31s
    drift / govulncheck (push) Has been skipped
    drift / surface-diff (push) Successful in -39s
    drift / forgejo-smoke (push) Has been skipped
    ci / gate (push) Failing after 2m21s
    ci / gate (pull_request) Failing after 9m20s
    Stable

    hexajon released this 2026-10-18 05:28:05 +00:00 | 58 commits to main since this release

    Changelog

    Features

    • 33173cc feat(adr)!: #530 resolve cross-repo record links and rename the skip flag
    • f6fc229 feat(adr)!: adr check reads only the Decision issues list
    • fcff867 feat(adr): #492 group adr check problems by file with plain messages and JSON
    • f4a7763 feat(adr): #508 add adr rebuild and report index status/title drift
    • 8f514e4 feat(adr): #508 flag an index date drift in adr check
    • bc222e8 feat(adr): read a cross-forge decision-issue link on its own forge
    • 75f9c1a feat(adr): remove the legacy docs/adr layout
    • f5a8416 feat(adr): verify every file reference in a record
    • 5929085 feat(forge-test): #796 cache pinned binaries in a host store and copy them into the VM
    • 1c9eea6 feat(gate): scan every lockfile with osv-scanner
    • 975e6d1 feat(git): require git 2.38, run git in the C locale, and pin the porcelain format
    • 9dedee7 feat(guard): #653 add the guard package with its three write effects
    • 4e97354 feat(guard): #654 declare effects for every operation and spec endpoint
    • a702760 feat(guard): #659 route git pushes through a guarded writer
    • 999b838 feat(guard): #660 enforce the ADR 0046 forge write guard on the first-class CLI and MCP surfaces
    • b948530 feat(guard): #665 remove the default-branch commit override
    • 04f2520 feat(guard): #666 require forge proof before a removal destroys a ref
    • cb566d0 feat(guard): #784 #785 route the raw api passthrough through the write guard
    • 9f9ad88 feat(httpx): add the hardened HTTP client builder
    • 675f981 feat(install): one verifying install command
    • bccf0c2 feat(mcp): refuse owner_repo= forge writes to a populated repo outside the session's scope
    • 3667635 feat(serve): add pi (Oh My Pi) as a first-class MCP harness
    • 08a73e2 feat(testforge): #677 forge-test harness scaffolding (work in progress, not yet compiling)
    • 4c28163 feat(testforge): #677 test each forge at a baseline and latest version
    • b0606ed feat(testforge): #692 bring the forge-test VM standup into the repo

    Bug Fixes

    • 10f6646 fix(auth): strip userinfo from the URLs that whoami prints
    • 5d17aa8 fix(config)!: remove the legacy OAuth client-id fallback
    • fd7e0d6 fix(config): #715 run RequireSecureScheme in the env credential resolver
    • d870ef9 fix(config): key credentials by the forge host alone, per ADR 0025
    • 0dab4ac fix(config): refuse a token over non-loopback http on every config request
    • 7d33b59 fix(config): refuse a token over non-loopback http on every config request
    • de0de75 fix(config): require consent for the plaintext git helper, and URL-parse credential host keys
    • 571d05f fix(config): route the bootstrap HTTP client through internal/httpx
    • 871c75c fix(conformance): bump mcp SDK and proxy-addr past known CVEs
    • c18b0e6 fix(forge): provision removes stray VM devices and asserts the device set
    • d87ec34 fix(forge): reset via snapshot revert, drop the manual stop dance
    • 7de976a fix(forge): surface incus start and stop errors, stop swallowing them
    • 3981659 fix(gate): check only git-visible Go files for formatting
    • e06ed72 fix(gate): run the osv-scanner step on a copy of the files that git lists
    • c665828 fix(git): #710 guard tag create name and ref against a leading dash
    • 2460e6b fix(git): write a per-repo plaintext token only with recorded consent
    • 67998ab fix(gitea): #711 escape repo-flags path segments
    • ec55514 fix(gitea): escape every value joined into an API path or query
    • c3d5a96 fix(gosec): enforce G104, drop dead G704, record kept exclusions
    • 8890a34 fix(guard): #666 give the forge-reachable test worktree its own branch
    • 6a4bd2b fix(guard): #786 classify the diffpatch endpoint as a content write
    • 9494fce fix(http): strip the Authorization header on a non-same-origin redirect hop
    • f5c1cf0 fix(install.sh): read only primary fingerprints, and never run an unverified binary
    • aed5df0 fix(licenses): declare the vendored MADR templates, and fail on undeclared vendored licenses
    • 4a101f8 fix(mcp): bound the run_watch summary and stop the watch on cancel
    • 78b4336 fix(mcp): bump go-sdk to v1.8.0 so tool results carry resultType
    • f762fd5 fix(mcp): cap the inline artifact download at 10 MiB
    • 93edff6 fix(mcp): carry resultType on unknown-argument rejections
    • 9b15ef3 fix(mcp): lower the inline artifact download cap to 1 MiB
    • 597729a fix(mcp): remove serve KeepAlive that the current client drops
    • 5912825 fix(remote-add): route the credential write through the posture-aware helper
    • a752300 fix(scripts): cite the reason, not a tracker number, in shipped strings
    • 5e144e8 fix(test): stop a config test writing into the source tree
    • 7310b3d fix: reject leading-dash values passed to git in option position

    Refactors

    • 655929b refactor(forge): push the committed tree into the VM instead of mounting it
    • 69c965f refactor(gitea): build HTTP clients through internal/httpx
    • 4109bc7 refactor(guard): #654 use slices.Contains in effect membership checks
    • 4de3b7c refactor(setup): route the connectivity probe through internal/httpx

    Documentation

    • 2a93f4b docs(adr): 0052 keeps forge-test caches on VM-local disk
    • 9d22505 docs(adr): accept 0053, the gosec gate exclusions record
    • 647291f docs(adr): accept ADR 0049
    • 08d3f35 docs(adr): add ADR 0046 and 0047, accept 0039, and edit 0031, 0037, and 0043 in place
    • f1169f7 docs(adr): add proposed 0050 and 0051 for release-notes and attribution gates
    • 9029a95 docs(adr): add proposed ADR 0049 for the HTTP transport chokepoint
    • 1941c93 docs(adr): align ADR 0039 and WirePi output with official omp docs
    • 7065973 docs(adr): consolidate the decision records into their end-state form
    • 6a98932 docs(adr): forge tests run against throwaway Forgejo and Gitea servers
    • 25c5602 docs(adr): propose that the MCP surface reads no local files
    • cb2ae89 docs(adr): record that adr check enforces a stricter version of MADR 4.0.0 (0037)
    • 1c5a465 docs(adr): record the forge-test rules as 0052 and point 0014/0017/0022 at it
    • 2d42584 docs(adr): track the ADR 0039 phase-2 follow-ups as issues
    • bdbf046 docs(adr): write ADR 0039 with plain hyphens
    • 01f3e6f docs(ci): state that the CI checks on main are advisory
    • d11ad0e docs(mcp): use a plain hyphen in the madt_branches_remote description
    • 69c2eab docs(security): report vulnerabilities by email only
    • f4f7d02 docs: finish a green branch at once, never hold or batch
    • 0c07f78 docs: replace undefined acronyms and invented jargon with plain language

    Other

    • efbc3bb build(gate): time-box staticcheck while it lacks Go 1.27.2 support
    • b1f9ad6 revert(gate): restore ADR 0039 to proposed — acceptance is the decision-maker's call
    • 2fdf502 style: apply gopls quick fixes
    • 9651258 style: apply the gopls quick fixes and fix their stale comments
    • c33a0a7 style: restore the whoami dash and fix the failResult comment
    Downloads