[{"data":1,"prerenderedAt":2882},["ShallowReactive",2],{"docs-navigation":3,"docs\u002Fdocs\u002Freference\u002Freleases":194,"docs\u002Fdocs\u002Freference\u002Freleases-surround":2877},[4],{"title":5,"path":6,"stem":7,"children":8},"Docs","\u002Fdocs","docs",[9,13,35,129,149,154],{"title":10,"path":6,"stem":11,"icon":12},"Overview","docs\u002Findex","i-lucide-house",{"title":14,"icon":15,"path":16,"stem":17,"children":18,"page":34},"Quickstart","i-lucide-rocket","\u002Fdocs\u002Fquickstart","docs\u002F1.quickstart",[19,24,29],{"title":20,"path":21,"stem":22,"icon":23},"Local","\u002Fdocs\u002Fquickstart\u002Flocal","docs\u002F1.quickstart\u002F1.local","i-lucide-laptop",{"title":25,"path":26,"stem":27,"icon":28},"Self-hosted","\u002Fdocs\u002Fquickstart\u002Fself-hosted","docs\u002F1.quickstart\u002F2.self-hosted","i-lucide-server",{"title":30,"path":31,"stem":32,"icon":33},"Cloud","\u002Fdocs\u002Fquickstart\u002Fcloud","docs\u002F1.quickstart\u002F3.cloud","i-lucide-cloud",false,{"title":36,"path":37,"stem":38,"children":39,"icon":41},"Harnesses","\u002Fdocs\u002Fharnesses","docs\u002F2.harnesses\u002Findex",[40,42,47,51,55,59,63,67,71,76,80,84,89,93,97,101,105,109,113,117,121,125],{"title":36,"path":37,"stem":38,"icon":41},"i-lucide-plug",{"title":43,"path":44,"stem":45,"icon":46},"Claude Code","\u002Fdocs\u002Fharnesses\u002Fclaude-code","docs\u002F2.harnesses\u002F1.claude-code","i-lucide-terminal",{"title":48,"path":49,"stem":50,"icon":46},"Devin","\u002Fdocs\u002Fharnesses\u002Fdevin","docs\u002F2.harnesses\u002F10.devin",{"title":52,"path":53,"stem":54,"icon":46},"Kiro","\u002Fdocs\u002Fharnesses\u002Fkiro","docs\u002F2.harnesses\u002F11.kiro",{"title":56,"path":57,"stem":58,"icon":46},"Cline","\u002Fdocs\u002Fharnesses\u002Fcline","docs\u002F2.harnesses\u002F12.cline",{"title":60,"path":61,"stem":62,"icon":46},"Amp","\u002Fdocs\u002Fharnesses\u002Famp","docs\u002F2.harnesses\u002F13.amp",{"title":64,"path":65,"stem":66,"icon":46},"VS Code","\u002Fdocs\u002Fharnesses\u002Fvscode","docs\u002F2.harnesses\u002F14.vscode",{"title":68,"path":69,"stem":70,"icon":46},"Gemini CLI","\u002Fdocs\u002Fharnesses\u002Fgemini-cli","docs\u002F2.harnesses\u002F15.gemini-cli",{"title":72,"path":73,"stem":74,"icon":75},"OpenClaw","\u002Fdocs\u002Fharnesses\u002Fopenclaw","docs\u002F2.harnesses\u002F16.openclaw","i-lucide-puzzle",{"title":77,"path":78,"stem":79,"icon":75},"Hermes Agent","\u002Fdocs\u002Fharnesses\u002Fhermes","docs\u002F2.harnesses\u002F17.hermes",{"title":81,"path":82,"stem":83,"icon":75},"NanoClaw","\u002Fdocs\u002Fharnesses\u002Fnanoclaw","docs\u002F2.harnesses\u002F18.nanoclaw",{"title":85,"path":86,"stem":87,"icon":88},"skills.sh (`npx skills`)","\u002Fdocs\u002Fharnesses\u002Fskills-sh","docs\u002F2.harnesses\u002F19.skills-sh","i-lucide-store",{"title":90,"path":91,"stem":92,"icon":46},"Codex CLI","\u002Fdocs\u002Fharnesses\u002Fcodex","docs\u002F2.harnesses\u002F2.codex",{"title":94,"path":95,"stem":96,"icon":88},"Claude Code plugin marketplace","\u002Fdocs\u002Fharnesses\u002Fclaude-code-marketplace","docs\u002F2.harnesses\u002F20.claude-code-marketplace",{"title":98,"path":99,"stem":100,"icon":88},"Codex plugin marketplace","\u002Fdocs\u002Fharnesses\u002Fcodex-marketplace","docs\u002F2.harnesses\u002F21.codex-marketplace",{"title":102,"path":103,"stem":104,"icon":46},"Cursor","\u002Fdocs\u002Fharnesses\u002Fcursor","docs\u002F2.harnesses\u002F3.cursor",{"title":106,"path":107,"stem":108,"icon":46},"OpenCode V1","\u002Fdocs\u002Fharnesses\u002Fopencode-v1","docs\u002F2.harnesses\u002F4.opencode-v1",{"title":110,"path":111,"stem":112,"icon":46},"OpenCode 2","\u002Fdocs\u002Fharnesses\u002Fopencode-v2","docs\u002F2.harnesses\u002F5.opencode-v2",{"title":114,"path":115,"stem":116,"icon":46},"Oh My Pi (omp)","\u002Fdocs\u002Fharnesses\u002Fomp","docs\u002F2.harnesses\u002F6.omp",{"title":118,"path":119,"stem":120,"icon":46},"Pi","\u002Fdocs\u002Fharnesses\u002Fpi","docs\u002F2.harnesses\u002F7.pi",{"title":122,"path":123,"stem":124,"icon":46},"Copilot CLI","\u002Fdocs\u002Fharnesses\u002Fcopilot","docs\u002F2.harnesses\u002F8.copilot",{"title":126,"path":127,"stem":128,"icon":46},"Antigravity","\u002Fdocs\u002Fharnesses\u002Fantigravity","docs\u002F2.harnesses\u002F9.antigravity",{"title":130,"icon":131,"path":132,"stem":133,"children":134,"page":34},"Concepts","i-lucide-lightbulb","\u002Fdocs\u002Fconcepts","docs\u002F3.concepts",[135,140,145],{"title":136,"path":137,"stem":138,"icon":139},"Reports","\u002Fdocs\u002Fconcepts\u002Freports","docs\u002F3.concepts\u002F1.reports","i-lucide-file-text",{"title":141,"path":142,"stem":143,"icon":144},"Triage","\u002Fdocs\u002Fconcepts\u002Ftriage","docs\u002F3.concepts\u002F2.triage","i-lucide-list-checks",{"title":146,"path":147,"stem":148,"icon":41},"Model and harness independence","\u002Fdocs\u002Fconcepts\u002Fmodel-and-harness-independence","docs\u002F3.concepts\u002F3.model-and-harness-independence",{"title":150,"path":151,"stem":152,"icon":153},"Security","\u002Fdocs\u002Fsecurity","docs\u002F4.security","i-lucide-shield-check",{"title":155,"path":156,"stem":157,"children":158,"icon":160},"Reference","\u002Fdocs\u002Freference","docs\u002F5.reference\u002Findex",[159,161,166,171,174,179,184,189],{"title":155,"path":156,"stem":157,"icon":160},"i-lucide-book-open",{"title":162,"path":163,"stem":164,"icon":165},"API","\u002Fdocs\u002Freference\u002Fapi","docs\u002F5.reference\u002F1.api","i-lucide-braces",{"title":167,"path":168,"stem":169,"icon":170},"Operations","\u002Fdocs\u002Freference\u002Foperate","docs\u002F5.reference\u002F2.operate","i-lucide-settings",{"title":150,"path":172,"stem":173,"icon":153},"\u002Fdocs\u002Freference\u002Fsecurity","docs\u002F5.reference\u002F3.security",{"title":175,"path":176,"stem":177,"icon":178},"Session logs","\u002Fdocs\u002Freference\u002Fsessions","docs\u002F5.reference\u002F4.sessions","i-lucide-history",{"title":180,"path":181,"stem":182,"icon":183},"Releases","\u002Fdocs\u002Freference\u002Freleases","docs\u002F5.reference\u002F5.releases","i-lucide-tags",{"title":185,"path":186,"stem":187,"icon":188},"Client installation","\u002Fdocs\u002Freference\u002Fagent-install","docs\u002F5.reference\u002F6.agent-install","i-lucide-download",{"title":190,"path":191,"stem":192,"icon":193},"Stack installation","\u002Fdocs\u002Freference\u002Fagent-install-stack","docs\u002F5.reference\u002F7.agent-install-stack","i-lucide-container",{"id":195,"title":180,"body":196,"description":2870,"extension":2871,"meta":2872,"navigation":2873,"path":181,"seo":2874,"stem":182,"verified":2875,"__hash__":2876},"docs\u002Fdocs\u002F5.reference\u002F5.releases.md",{"type":197,"value":198,"toc":2847},"minimark",[199,204,246,257,319,323,361,375,379,386,490,528,532,726,730,801,818,822,825,961,977,981,987,1166,1177,1181,1188,1238,1267,1273,1277,1293,1300,1311,1315,1328,1331,1393,1397,1403,1563,1578,1580,1638,1642,1648,1708,1710,1768,1772,1802,2180,2183,2195,2197,2274,2278,2303,2422,2426,2429,2519,2523,2607,2611,2627,2631,2634,2826,2829,2833,2836,2840,2843],[200,201,203],"h2",{"id":202},"versioning-and-publication","Versioning and publication",[205,206,207,208,212,213,216,217,222,223,226,227,230,231,234,235,237,238,241,242,245],"p",{},"Source releases are annotated, immutable ",[209,210,211],"code",{},"vMAJOR.MINOR.PATCH"," tags, with\n",[209,214,215],{},"-rc.N"," pre-releases before a stable one (",[218,219,221],"a",{"href":220},"#tags","Tags","): patch for\ncompatible fixes, docs and dependency updates; minor for compatible features;\nmajor for breaking API or operational contracts. Every delivered change belongs\nto a release. The two skills carry their own ",[209,224,225],{},"version"," in their ",[209,228,229],{},"SKILL.md",";\nbump one only when its command contract changes. The ",[209,232,233],{},"agentfeedback"," skill's\n",[209,236,229],{}," is generated: its version is in ",[209,239,240],{},"internal\u002Fskillgen\u002Fsource\u002Fskill.json",",\nand ",[209,243,244],{},"just skills"," renders it.",[205,247,248,249,252,253,256],{},"Maintainers decide when to cut a release, by hand, when they judge ",[209,250,251],{},"main","\nready; landed changes never trigger one. An agent pushes a ",[209,254,255],{},"v*"," tag, creates a\nGitHub release or pushes an image (the steps below, recovery included) only\nwhen a maintainer asks for that version.",[205,258,259,260,263,264,270,271,274,275,278,279,282,283,286,287,290,291,294,295,298,299,302,303,306,307,310,311,314,315,318],{},"Maintainers need Git, the tools ",[209,261,262],{},"just ci-full"," needs (",[218,265,269],{"href":266,"rel":267},"https:\u002F\u002Fgithub.com\u002FAgentFeedback\u002Fagentfeedback\u002Fblob\u002Fc7573e1b301aa1495f290c417ce2fb390caee544\u002Fdocs\u002Fdevelop.md",[268],"nofollow","develop.md","),\nGoReleaser 2.19.0 exactly (the ",[209,272,273],{},"v2.19.0"," archive from\ngithub.com\u002Fgoreleaser\u002Fgoreleaser\u002Freleases, or ",[209,276,277],{},"brew install goreleaser"," while\n2.19.0 is Homebrew's version; ",[209,280,281],{},"just release"," refuses any other version,\nbecause the archives are only reproducible with the same one; an earlier\nrelease is reproducible with the version ",[209,284,285],{},"scripts\u002Frelease.sh"," pins at its\ntag), Docker with buildx logged in to ",[209,288,289],{},"ghcr.io"," (push access to the\n",[209,292,293],{},"agentfeedback\u002Fagentfeedback"," package), able to build and run ",[209,296,297],{},"linux\u002Famd64","\nand ",[209,300,301],{},"linux\u002Farm64"," images (on a machine of the other architecture, QEMU\nemulation: ",[209,304,305],{},"docker run --privileged --rm tonistiigi\u002Fbinfmt --install all",";\n",[209,308,309],{},"docker buildx ls"," lists the platforms) and allowed to run a privileged\ncontainer (the playbook gate runs systemd in one), ",[209,312,313],{},"curl",", and an\nauthenticated GitHub CLI (",[209,316,317],{},"gh",") with write access to the repository and its\ntags. There is no hosted CI: every\ncheck runs on the releasing machine.",[320,321,221],"h3",{"id":322},"tags",[324,325,326,344],"ul",{},[327,328,329,332,333,336,337,340,341,343],"li",{},[209,330,331],{},"vX.Y.Z",": a stable release, marked ",[209,334,335],{},"latest"," on GitHub, image tags\n",[209,338,339],{},"X.Y.Z",", the full commit SHA and ",[209,342,335],{},".",[327,345,346,349,350,352,353,356,357,360],{},[209,347,348],{},"vX.Y.Z-rc.N",": a pre-release, published as a public GitHub release flagged\npre-release and never ",[209,351,335],{},", image tags ",[209,354,355],{},"X.Y.Z-rc.N"," and the full commit\nSHA.\nIt exists to verify the release assets, the installer and the install\nplaybooks before the stable tag: ",[209,358,359],{},"just playbooks vX.Y.Z-rc.N"," runs both\nplaybooks against the published pre-release, downloaded as an agent\ndownloads it. No other suffix is accepted.",[205,362,363,364,367,368,371,372,374],{},"In both forms the tag's major version must match the module path's\nmajor-version suffix in ",[209,365,366],{},"go.mod"," (",[209,369,370],{},"\u002Fv4"," today): the Go tool never resolves a\ntag of another major for the module path, so ",[209,373,281],{}," refuses it. A new\nmajor changes the module path and every import path first, then tags.",[320,376,378],{"id":377},"assets","Assets",[205,380,381,382,385],{},"Every release carries exactly these assets, and ",[209,383,384],{},"install.sh"," and the install\nplaybooks rely on the names:",[387,388,389,402],"table",{},[390,391,392],"thead",{},[393,394,395,399],"tr",{},[396,397,398],"th",{},"Asset",[396,400,401],{},"Content",[403,404,405,445,458,478],"tbody",{},[393,406,407,413],{},[408,409,410],"td",{},[209,411,412],{},"agentfeedback_\u003Cversion>_\u003Cos>_\u003Carch>.tar.gz",[408,414,415,418,419,422,423,426,427,418,430,422,433,436,437,426,439,426,442],{},[209,416,417],{},"os"," ",[209,420,421],{},"linux"," or ",[209,424,425],{},"darwin",", ",[209,428,429],{},"arch",[209,431,432],{},"amd64",[209,434,435],{},"arm64",": the binary ",[209,438,233],{},[209,440,441],{},"LICENSE",[209,443,444],{},"README.md",[393,446,447,452],{},[408,448,449],{},[209,450,451],{},"agentfeedback_\u003Cversion>_windows_\u003Carch>.zip",[408,453,454,455],{},"the same with ",[209,456,457],{},"agentfeedback.exe",[393,459,460,465],{},[408,461,462],{},[209,463,464],{},"SHA256SUMS",[408,466,467,468,470,471,474,475,477],{},"SHA-256 of the six archives and ",[209,469,384],{},", in ",[209,472,473],{},"sha256sum"," format; the client playbook checks ",[209,476,384],{}," against it before running it. It proves the assets belong together, not who published them: the release is not signed",[393,479,480,484],{},[408,481,482],{},[209,483,384],{},[408,485,486,489],{},[209,487,488],{},"skills\u002Fagentfeedback\u002Fscripts\u002Finstall.sh"," from the tagged commit",[205,491,492,495,496,499,500,503,504,507,508,511,512,514,515,518,519,523,524,527],{},[209,493,494],{},"\u003Cversion>"," is the tag without the ",[209,497,498],{},"v",". The binaries are static\n(",[209,501,502],{},"CGO_ENABLED=0","), built with ",[209,505,506],{},"-trimpath"," and the toolchain named on the\n",[209,509,510],{},"toolchain"," line of ",[209,513,366],{},", and stamped with the version and commit that\n",[209,516,517],{},"agentfeedback version"," prints. The exact build line is in\n",[218,520,522],{"href":521},"\u002Fdocs\u002Freference\u002Foperate#build-from-source","operate.md","; ",[209,525,526],{},".goreleaser.yaml"," holds the same\nflags.",[320,529,531],{"id":530},"cutting-a-release","Cutting a release",[533,534,535,551,560,567],"ol",{},[327,536,537,538,540,541,543,544,547,548,550],{},"Update the stable version link in ",[209,539,444],{}," (stable releases only) and\nadd notes to this file. Set ",[209,542,225],{}," in ",[209,545,546],{},"flake.nix"," to the tag without\nits ",[209,549,498],{}," prefix; the release preflight rejects a mismatch. Nix source\narchives do not contain Git tags, so they need this explicit version.\nPromoting an RC to stable requires a new commit updating this value;\nthe RC and stable tags cannot share a commit and report distinct versions.",[327,552,553,554,557,558,343],{},"Run ",[209,555,556],{},"just ci",", commit, push ",[209,559,251],{},[327,561,562,563,566],{},"Write the release notes to a file outside the checkout or under the\ngitignored ",[209,564,565],{},".private\u002F",". Start with a short summary, then describe the\nuser-visible changes, compatibility and upgrade steps. Do not repeat the\nrelease title in the body. Use absolute links to documents at the release\ntag so older notes keep pointing to the matching documentation.",[327,568,569,570,615,618,619,621,622,625,626,629,630,343,633,635,636,638,639,642,643,645,646,649,650,652,653,655,656,659,660,662,663,666,667,669,670,672,673,675,676,679,680,682,683,686,687,426,690,694,695,698,699,702,703,705,706,708,709,711,712,714,715,717,718,720,721,723,724,343],{},"Run the preflight, then publish:",[571,572,577],"pre",{"className":573,"code":574,"language":575,"meta":576,"style":576},"language-bash shiki shiki-themes github-light github-light github-dark","just release-check vX.Y.Z 'Release name' \u002Fpath\u002Fto\u002Fnotes.md\njust release vX.Y.Z 'Release name' \u002Fpath\u002Fto\u002Fnotes.md\n","bash","",[209,578,579,601],{"__ignoreMap":576},[580,581,584,588,592,595,598],"span",{"class":582,"line":583},"line",1,[580,585,587],{"class":586},"snPdu","just",[580,589,591],{"class":590},"sIIMD"," release-check",[580,593,594],{"class":590}," vX.Y.Z",[580,596,597],{"class":590}," 'Release name'",[580,599,600],{"class":590}," \u002Fpath\u002Fto\u002Fnotes.md\n",[580,602,604,606,609,611,613],{"class":582,"line":603},2,[580,605,587],{"class":586},[580,607,608],{"class":590}," release",[580,610,594],{"class":590},[580,612,597],{"class":590},[580,614,600],{"class":590},[616,617],"br",{},"Pass only the descriptive title, without ",[209,620,331],{},": the command adds the\ntag once, producing ",[209,623,624],{},"vX.Y.Z — Release name",". A version-prefixed title is\nrejected. GoReleaser's changelog processing must stay enabled: setting\n",[209,627,628],{},"changelog.disable: true"," discards even the supplied ",[209,631,632],{},"--release-notes",[616,634],{},"Both check the tag form, the GoReleaser version, that ",[209,637,384],{},"\nexists, that ",[209,640,641],{},"origin"," is this repository, a clean ",[209,644,251],{}," equal to\n",[209,647,648],{},"origin\u002Fmain",", that the tag exists neither locally nor on ",[209,651,641],{},", that\n",[209,654,317],{}," can push, ",[209,657,658],{},"goreleaser check",", and ",[209,661,262],{}," (the release gate:\ne2e, fuzz, contract and the live harness on top of the merge gate). The preflight then builds\na snapshot of all six targets into ",[209,664,665],{},"dist\u002Frelease\u002F",", checks that its\n",[209,668,464],{}," lists exactly the six archives and ",[209,671,384],{}," and that\nevery line matches (the ",[209,674,384],{}," line against the committed file),\nbuilds the two snapshot images and smoke-tests them (each platform's binary\nprints the snapshot version, and the image started with no arguments\nanswers ",[209,677,678],{},"\u002Fready","), and stops. ",[209,681,281],{}," instead builds the release against a local tag\n(",[209,684,685],{},"goreleaser release --skip=publish","), checks it and runs both install\nplaybooks against it in a clean container (",[209,688,689],{},"just playbooks \u003Ctag> dist\u002Frelease",[218,691,269],{"href":692,"rel":693},"https:\u002F\u002Fgithub.com\u002FAgentFeedback\u002Fagentfeedback\u002Fblob\u002Fc7573e1b301aa1495f290c417ce2fb390caee544\u002Fdocs\u002Fdevelop.md#verification-before-you-are-done",[268],",\nwith every ",[209,696,697],{},"AF_PLAYBOOK_*"," answer unset: no exposure, the default\nharness; run ",[209,700,701],{},"AF_PLAYBOOK_ADDRESS=0.0.0.0 just playbooks \u003Ctag> tree","\nbeforehand to cover the exposure branch), then builds and smoke-tests the\nsnapshot images as the preflight does, because GoReleaser builds the\npublished images only while publishing;\nonly then does it push the annotated tag with an absence lease, so a\nbuild or playbook defect leaves nothing public and the local tag is\nremoved. GoReleaser then rebuilds, pushes the\nimage (one multi-platform index under every tag above) and uploads the\nrelease, which stays a draft until every asset is up. The script\nverifies it as a downloader sees it: not a draft, flagged pre-release\nexactly when the tag is one, ",[209,704,335],{}," exactly when it is stable, the\ntitle and notes matching the supplied prose, exactly the assets above,\n",[209,707,464],{}," byte-identical to the local build's,\n",[209,710,384],{}," identical to the committed one, and every downloaded archive\nand ",[209,713,384],{}," matching its ",[209,716,464],{}," line; then the image as a puller sees it: every tag names\nthe same index, which holds ",[209,719,297],{}," and ",[209,722,301],{},", and each\nplatform's binary prints the version. Last, it prints the release URL. Deploy the SHA or the version tag,\nnever ",[209,725,335],{},[320,727,729],{"id":728},"verifying-a-release","Verifying a release",[571,731,733],{"className":573,"code":732,"language":575,"meta":576,"style":576},"gh release download vX.Y.Z --repo AgentFeedback\u002Fagentfeedback --pattern 'agentfeedback_*' --pattern SHA256SUMS --pattern install.sh\nsha256sum -c SHA256SUMS          # Linux\nshasum -a 256 -c SHA256SUMS      # macOS\n",[209,734,735,769,782],{"__ignoreMap":576},[580,736,737,739,741,744,746,750,753,756,759,761,764,766],{"class":582,"line":583},[580,738,317],{"class":586},[580,740,608],{"class":590},[580,742,743],{"class":590}," download",[580,745,594],{"class":590},[580,747,749],{"class":748},"sBjJW"," --repo",[580,751,752],{"class":590}," AgentFeedback\u002Fagentfeedback",[580,754,755],{"class":748}," --pattern",[580,757,758],{"class":590}," 'agentfeedback_*'",[580,760,755],{"class":748},[580,762,763],{"class":590}," SHA256SUMS",[580,765,755],{"class":748},[580,767,768],{"class":590}," install.sh\n",[580,770,771,773,776,778],{"class":582,"line":603},[580,772,473],{"class":586},[580,774,775],{"class":748}," -c",[580,777,763],{"class":590},[580,779,781],{"class":780},"sCsY4","          # Linux\n",[580,783,785,788,791,794,796,798],{"class":582,"line":784},3,[580,786,787],{"class":586},"shasum",[580,789,790],{"class":748}," -a",[580,792,793],{"class":748}," 256",[580,795,775],{"class":748},[580,797,763],{"class":590},[580,799,800],{"class":780},"      # macOS\n",[205,802,803,804,806,807,810,811,367,814,817],{},"Without ",[209,805,317],{},", download from\n",[209,808,809],{},"https:\u002F\u002Fgithub.com\u002FAgentFeedback\u002Fagentfeedback\u002Freleases\u002Fdownload\u002FvX.Y.Z\u002F\u003Casset>",".\nTo check one asset only, feed its line to the same command:\n",[209,812,813],{},"grep ' install\\.sh$' SHA256SUMS | sha256sum -c",[209,815,816],{},"shasum -a 256 -c"," on\nmacOS). Releases before 4.0.0 carry no assets; only the source tag exists.",[320,819,821],{"id":820},"reproducing-a-release","Reproducing a release",[205,823,824],{},"Two builds of the same tag produce identical binaries and identical\narchives. Check it after a release, from a clean checkout of the tag:",[571,826,828],{"className":573,"code":827,"language":575,"meta":576,"style":576},"git checkout vX.Y.Z\nexport GOTOOLCHAIN=$(awk '$1 == \"toolchain\" { print $2 }' go.mod) GORELEASER_CURRENT_TAG=vX.Y.Z RELEASE_TITLE=check\ngoreleaser release --skip=publish --clean && cp dist\u002Frelease\u002FSHA256SUMS \u002Ftmp\u002FSHA256SUMS.first\ngoreleaser release --skip=publish --clean && diff \u002Ftmp\u002FSHA256SUMS.first dist\u002Frelease\u002FSHA256SUMS\ngh release download vX.Y.Z --repo AgentFeedback\u002Fagentfeedback --pattern SHA256SUMS --output - | diff - dist\u002Frelease\u002FSHA256SUMS\n",[209,829,830,841,879,904,926],{"__ignoreMap":576},[580,831,832,835,838],{"class":582,"line":583},[580,833,834],{"class":586},"git",[580,836,837],{"class":590}," checkout",[580,839,840],{"class":590}," vX.Y.Z\n",[580,842,843,847,851,854,857,860,863,866,869,871,874,876],{"class":582,"line":603},[580,844,846],{"class":845},"s8jYJ","export",[580,848,850],{"class":849},"sxrX7"," GOTOOLCHAIN",[580,852,853],{"class":845},"=",[580,855,856],{"class":849},"$(",[580,858,859],{"class":586},"awk",[580,861,862],{"class":590}," '$1 == \"toolchain\" { print $2 }'",[580,864,865],{"class":590}," go.mod",[580,867,868],{"class":849},") GORELEASER_CURRENT_TAG",[580,870,853],{"class":845},[580,872,873],{"class":849},"vX.Y.Z RELEASE_TITLE",[580,875,853],{"class":845},[580,877,878],{"class":849},"check\n",[580,880,881,884,886,889,892,895,898,901],{"class":582,"line":784},[580,882,883],{"class":586},"goreleaser",[580,885,608],{"class":590},[580,887,888],{"class":748}," --skip=publish",[580,890,891],{"class":748}," --clean",[580,893,894],{"class":849}," && ",[580,896,897],{"class":586},"cp",[580,899,900],{"class":590}," dist\u002Frelease\u002FSHA256SUMS",[580,902,903],{"class":590}," \u002Ftmp\u002FSHA256SUMS.first\n",[580,905,907,909,911,913,915,917,920,923],{"class":582,"line":906},4,[580,908,883],{"class":586},[580,910,608],{"class":590},[580,912,888],{"class":748},[580,914,891],{"class":748},[580,916,894],{"class":849},[580,918,919],{"class":586},"diff",[580,921,922],{"class":590}," \u002Ftmp\u002FSHA256SUMS.first",[580,924,925],{"class":590}," dist\u002Frelease\u002FSHA256SUMS\n",[580,927,929,931,933,935,937,939,941,943,945,948,951,954,957,959],{"class":582,"line":928},5,[580,930,317],{"class":586},[580,932,608],{"class":590},[580,934,743],{"class":590},[580,936,594],{"class":590},[580,938,749],{"class":748},[580,940,752],{"class":590},[580,942,755],{"class":748},[580,944,763],{"class":590},[580,946,947],{"class":748}," --output",[580,949,950],{"class":590}," -",[580,952,953],{"class":845}," |",[580,955,956],{"class":586}," diff",[580,958,950],{"class":590},[580,960,925],{"class":590},[205,962,963,964,966,967,969,970,973,974,343],{},"No output from either ",[209,965,919],{}," means both local builds match each other and\nthe published archives. The build line in\n",[218,968,522],{"href":521}," gives the same binary as the one\nin the archive: compare ",[209,971,972],{},"sha256sum agentfeedback"," with\n",[209,975,976],{},"tar -xOzf agentfeedback_X.Y.Z_linux_amd64.tar.gz agentfeedback | sha256sum",[320,978,980],{"id":979},"recovery","Recovery",[205,982,983,984,986],{},"When ",[209,985,281],{}," stops, it says whether the tag is already public. Before\nthe tag push nothing is public and the script has removed its local tag: fix\nthe cause and run it again. After the push, inspect the remote tag, the\nGitHub release and the image tags on GHCR before doing anything, and never\nforce-move or delete the published tag:",[324,988,989,1063,1081],{},[327,990,991,995,996,999,1000],{},[992,993,994],"strong",{},"No release, or a draft"," (GoReleaser failed before publishing, the\nimage push included; it runs before the release is created): on a\nclean checkout of the tagged commit, rerun GoReleaser with the same title.\nIt finds the draft by its name, ",[209,997,998],{},"vX.Y.Z — \u003Ctitle>",", keeps its notes and\nreplaces any asset already uploaded with its byte-identical rebuild, and\npushes the image tags again. Use the name template from the tagged\nconfiguration when recovering an older release:",[571,1001,1003],{"className":573,"code":1002,"language":575,"meta":576,"style":576},"export GOTOOLCHAIN=$(awk '$1 == \"toolchain\" { print $2 }' go.mod) GORELEASER_CURRENT_TAG=vX.Y.Z RELEASE_TITLE='Release name'\nGITHUB_TOKEN=$(gh auth token) goreleaser release --clean --release-notes \u002Fpath\u002Fto\u002Fnotes.md\n",[209,1004,1005,1032],{"__ignoreMap":576},[580,1006,1007,1009,1011,1013,1015,1017,1019,1021,1023,1025,1027,1029],{"class":582,"line":583},[580,1008,846],{"class":845},[580,1010,850],{"class":849},[580,1012,853],{"class":845},[580,1014,856],{"class":849},[580,1016,859],{"class":586},[580,1018,862],{"class":590},[580,1020,865],{"class":590},[580,1022,868],{"class":849},[580,1024,853],{"class":845},[580,1026,873],{"class":849},[580,1028,853],{"class":845},[580,1030,1031],{"class":590},"'Release name'\n",[580,1033,1034,1037,1039,1041,1043,1046,1049,1052,1054,1056,1058,1061],{"class":582,"line":603},[580,1035,1036],{"class":849},"GITHUB_TOKEN",[580,1038,853],{"class":845},[580,1040,856],{"class":849},[580,1042,317],{"class":586},[580,1044,1045],{"class":590}," auth",[580,1047,1048],{"class":590}," token",[580,1050,1051],{"class":849},") ",[580,1053,883],{"class":586},[580,1055,608],{"class":590},[580,1057,891],{"class":748},[580,1059,1060],{"class":748}," --release-notes",[580,1062,600],{"class":590},[327,1064,1065,1068,1069,1072,1073,1076,1077,1080],{},[992,1066,1067],{},"A published release"," (a later check failed): do not run GoReleaser\nagain; it would try to create a second release. Run the checks of\n",[218,1070,729],{"href":1071},"#verifying-a-release",", confirm the state with\n",[209,1074,1075],{},"gh release view vX.Y.Z --json isDraft,isPrerelease,assets"," and the image\nwith ",[209,1078,1079],{},"docker buildx imagetools inspect ghcr.io\u002Fagentfeedback\u002Fagentfeedback:X.Y.Z",",\nand fix the release on GitHub by hand if a check failed.",[327,1082,1083,1086,1087,1147,1149,1150,1153,1154,720,1156,1158,1159,1162,1163,1165],{},[992,1084,1085],{},"A published release whose image check failed",": GoReleaser pushed the\nimage before it created the release, so the image exists. A tag that is\nmissing or names another index is repointed at the version's index, which\nholds the release's binaries:",[571,1088,1090],{"className":573,"code":1089,"language":575,"meta":576,"style":576},"docker buildx imagetools create -t ghcr.io\u002Fagentfeedback\u002Fagentfeedback:\u003Csha> ghcr.io\u002Fagentfeedback\u002Fagentfeedback:X.Y.Z\ndocker buildx imagetools create -t ghcr.io\u002Fagentfeedback\u002Fagentfeedback:latest ghcr.io\u002Fagentfeedback\u002Fagentfeedback:X.Y.Z   # stable only\n",[209,1091,1092,1126],{"__ignoreMap":576},[580,1093,1094,1097,1100,1103,1106,1109,1112,1115,1118,1120,1123],{"class":582,"line":583},[580,1095,1096],{"class":586},"docker",[580,1098,1099],{"class":590}," buildx",[580,1101,1102],{"class":590}," imagetools",[580,1104,1105],{"class":590}," create",[580,1107,1108],{"class":748}," -t",[580,1110,1111],{"class":590}," ghcr.io\u002Fagentfeedback\u002Fagentfeedback:",[580,1113,1114],{"class":845},"\u003C",[580,1116,1117],{"class":590},"sh",[580,1119,218],{"class":849},[580,1121,1122],{"class":845},">",[580,1124,1125],{"class":590}," ghcr.io\u002Fagentfeedback\u002Fagentfeedback:X.Y.Z\n",[580,1127,1128,1130,1132,1134,1136,1138,1141,1144],{"class":582,"line":603},[580,1129,1096],{"class":586},[580,1131,1099],{"class":590},[580,1133,1102],{"class":590},[580,1135,1105],{"class":590},[580,1137,1108],{"class":748},[580,1139,1140],{"class":590}," ghcr.io\u002Fagentfeedback\u002Fagentfeedback:latest",[580,1142,1143],{"class":590}," ghcr.io\u002Fagentfeedback\u002Fagentfeedback:X.Y.Z",[580,1145,1146],{"class":780},"   # stable only\n",[616,1148],{},"Then repeat the checks: ",[209,1151,1152],{},"imagetools inspect"," on each tag shows one digest\nwith ",[209,1155,297],{},[209,1157,301],{},", and\n",[209,1160,1161],{},"docker run --rm --pull always --platform linux\u002F\u003Carch> ghcr.io\u002Fagentfeedback\u002Fagentfeedback:X.Y.Z version","\nprints ",[209,1164,339],{}," on both. A version index that lacks a platform or whose\nbinary fails is a defect of the release: cut a new version.",[205,1167,1168,1169,1172,1173,1176],{},"The notes file from step 3 is uncommitted, so it does not exist on another\nmachine: recovering there means rebuilding it from this file's section for\nthat version. Rewrite relative document links as absolute URLs under\n",[209,1170,1171],{},"https:\u002F\u002Fgithub.com\u002FAgentFeedback\u002Fagentfeedback\u002Fblob\u002FvX.Y.Z\u002Fdocs\u002F","\n(including links to sections of this file). Corrections to source need a new\nversion; corrections to release prose need no new tag. For prose-only repairs,\nuse ",[209,1174,1175],{},"gh release edit \u003Ctag> --repo AgentFeedback\u002Fagentfeedback --title '\u003Ctag> — \u003Ctitle>' --notes-file \u002Fpath\u002Fto\u002Fnotes.md",";\nleave tags, assets, pre-release status and the latest release unchanged.",[200,1178,1180],{"id":1179},"v440-session-capture-and-cloud-onboarding","v4.4.0 — Session capture and Cloud onboarding",[205,1182,1183,1184,1187],{},"Compatible with every 4.x client and server; the HTTP API stays ",[209,1185,1186],{},"1.0",".\nThe client can upload scrubbed session transcripts when the configured\nserver's organisation enables processing, and offers hosted authentication\nand a machine-settings editor. Local mode remains local; upgrading does not\ngrant capture permission.",[324,1189,1190,1199,1213,1226,1232],{},[327,1191,1192,418,1195,1198],{},[992,1193,1194],{},"Session capture:",[209,1196,1197],{},"sessions push"," sends complete session revisions\nthrough resumable uploads for Claude Code, Codex, OpenCode V1 and 2, and\nhook-indexed Cursor transcripts. Existing turn-end hooks and eligible CLI\ncommands can launch a bounded upload child after the quiet interval; no\nresident daemon or scheduler is installed. Organisation policy,\ncollection restrictions and repository upload permission are checked\nbefore sending. Transcripts are scrubbed, never spooled.",[327,1200,1201,1204,1205,1208,1209,1212],{},[992,1202,1203],{},"Onboarding and settings:"," capability-advertised servers support email\ndevice login, agent self-enrolment and enrolment tokens, alongside key\npaste. ",[209,1206,1207],{},"login"," explicitly reauthenticates a configured client.\n",[209,1210,1211],{},"agentfeedback config"," edits machine settings without overriding\norganisation policy or repository restrictions.",[327,1214,1215,1218,1219,720,1222,1225],{},[992,1216,1217],{},"Harnesses:"," OpenCode has explicit ",[209,1220,1221],{},"opencode-v1",[209,1223,1224],{},"opencode-v2","\nintegrations; the install alias selects the detected major version and\nreplaces the other variant's wiring. Cursor capture uses hook-provided\ntranscript paths, not undocumented databases. Devin, Amp and Cline gain\nfailure nudges; omp and pi distinguish aborted tools from failures.",[327,1227,1228,1231],{},[992,1229,1230],{},"Reliability:"," the UI shows local session status in both modes;\nsuccessful stdio MCP friction submissions mark the session as filed.\nInstallation honors the configured Copilot home and rejects relative\nClaude Code and Codex homes. Doctor accepts the Cloud initialization\ndestination and treats unversioned Git builds as unknown.",[327,1233,1234,1237],{},[992,1235,1236],{},"Source builds:"," a pinned Nix flake builds the client from source.\nDecoder and export\u002Fimport conformance checks cover more of the existing\nAPI contract.",[205,1239,1240,1243,1244,1247,1248,1251,1252,1254,1255,720,1258,1261,1262,1266],{},[992,1241,1242],{},"Upgrade:"," install the new binary and run ",[209,1245,1246],{},"agentfeedback init"," or\n",[209,1249,1250],{},"agentfeedback install \u003Charness>"," to refresh harness wiring. OpenCode V1\nreferences and state keep working; an OpenCode 2 database migration exposes\nsessions under ",[209,1253,1224],{}," without carrying over V1 session marks.\nHosted authentication and capture require the server to advertise the\ncorresponding capabilities; self-hosted OSS continues to support key paste.\nFull transcripts can contain sensitive content despite scrubbing: review\nthe ",[218,1256,1257],{"href":176},"session contract",[218,1259,1260],{"href":172},"security boundaries","\nbefore enabling organisation processing. See ",[218,1263,1265],{"href":1264},"operate#authenticate-a-client","authentication and machine\nsettings"," for setup.",[205,1268,1269,1272],{},[992,1270,1271],{},"Verification scope:"," release acceptance uses isolated mock hosted\nendpoints for the client capture path, plus the repository release gates.\nLive Cloud rollout, extraction and candidate generation are not verified\nby this release.",[200,1274,1276],{"id":1275},"v430-external-friction-remediation-cli","v4.3.0 — External friction remediation CLI",[205,1278,1183,1279,1281,1282,1285,1286,1289,1290,343],{},[209,1280,1186],{},".\nThe canonical client now exposes ",[209,1283,1284],{},"agentfeedback issues",": list and rank\nretained issues, inspect details and source reports, copy an evidence-linked\nprompt, correct targets and evidence, merge or split issues, and record\nenvironment-scoped outcomes. The existing server selection and API key\napply; read operations require ",[209,1287,1288],{},"read",", mutations require ",[209,1291,1292],{},"process",[205,1294,1295,1296,1299],{},"These operations require a capable hosted server. Local mode and the\nself-hosted OSS server do not gain an aggregation backend. The client\ndiscovers each operation independently from the server's OpenAPI document;\nan unavailable operation is an error, not an empty result. ",[209,1297,1298],{},"issues recheck","\nis independently gated and remains unavailable until the server provides\nupstream release discovery. No command executes a prompt, installs an\nupstream update, or treats a new release as proof of resolution.",[205,1301,1302,1303,1306,1307,1310],{},"Install the new binary to use the commands. See the\n",[218,1304,1305],{"href":168},"client command reference"," for flags and JSON input.\nPrompts print alone on stdout by default; ",[209,1308,1309],{},"--json"," preserves the server's\nresponse for automation.",[200,1312,1314],{"id":1313},"v421-go-1273-and-current-dependencies","v4.2.1 — Go 1.27.3 and current dependencies",[205,1316,1183,1317,1319,1320,1323,1324,1327],{},[209,1318,1186],{}," and\nnothing changes in behaviour. The binaries are built with Go 1.27.3 and the\ncurrent stable releases of their modules (among them ",[209,1321,1322],{},"modernc.org\u002Fsqlite","\nv1.61.0 and ",[209,1325,1326],{},"prometheus\u002Fclient_golang"," v1.25.0), and the image's runtime\nbase is refreshed. Releases are now cut with GoReleaser 2.19.0. Nothing to\ndo on upgrade beyond installing the new binary.",[205,1329,1330],{},"Verify the release as a downloader:",[571,1332,1334],{"className":573,"code":1333,"language":575,"meta":576,"style":576},"gh release download v4.2.1 --repo AgentFeedback\u002Fagentfeedback --pattern 'agentfeedback_*' --pattern SHA256SUMS --pattern install.sh\nsha256sum -c SHA256SUMS                                      # shasum -a 256 -c on macOS\ndocker run --rm ghcr.io\u002Fagentfeedback\u002Fagentfeedback:4.2.1 version   # prints 4.2.1\n",[209,1335,1336,1363,1374],{"__ignoreMap":576},[580,1337,1338,1340,1342,1344,1347,1349,1351,1353,1355,1357,1359,1361],{"class":582,"line":583},[580,1339,317],{"class":586},[580,1341,608],{"class":590},[580,1343,743],{"class":590},[580,1345,1346],{"class":590}," v4.2.1",[580,1348,749],{"class":748},[580,1350,752],{"class":590},[580,1352,755],{"class":748},[580,1354,758],{"class":590},[580,1356,755],{"class":748},[580,1358,763],{"class":590},[580,1360,755],{"class":748},[580,1362,768],{"class":590},[580,1364,1365,1367,1369,1371],{"class":582,"line":603},[580,1366,473],{"class":586},[580,1368,775],{"class":748},[580,1370,763],{"class":590},[580,1372,1373],{"class":780},"                                      # shasum -a 256 -c on macOS\n",[580,1375,1376,1378,1381,1384,1387,1390],{"class":582,"line":784},[580,1377,1096],{"class":586},[580,1379,1380],{"class":590}," run",[580,1382,1383],{"class":748}," --rm",[580,1385,1386],{"class":590}," ghcr.io\u002Fagentfeedback\u002Fagentfeedback:4.2.1",[580,1388,1389],{"class":590}," version",[580,1391,1392],{"class":780},"   # prints 4.2.1\n",[200,1394,1396],{"id":1395},"v420-the-skill-sets-itself-up-triage-ships-with-the-binary","v4.2.0 — The skill sets itself up; triage ships with the binary",[205,1398,1399,1400,1402],{},"Compatible with 4.0.0 and 4.1.0 clients and servers; the HTTP API stays\n",[209,1401,1186],{}," and the server is unchanged. Everything here is in the client, the\ninstaller and the skills.",[324,1404,1405,1438,1465,1478,1497,1528,1552],{},[327,1406,1407,1413,1414,1417,1418,1421,1422,1425,1426,1429,1430,1433,1434,1437],{},[992,1408,1409,1410,1412],{},"The ",[209,1411,233],{}," skill sets itself up."," A skill installed on its own\n(the ",[209,1415,1416],{},"skills"," CLI, a plugin marketplace, a hub) now carries a Setup\nsection: with no binary, or the harness not wired, the agent asks the\nhuman, runs the bundled checksum-verifying ",[209,1419,1420],{},"scripts\u002Finstall.sh",", then\n",[209,1423,1424],{},"agentfeedback init --yes --harnesses \u003Charness> --json",". ",[209,1427,1428],{},"init"," and\n",[209,1431,1432],{},"install"," leave a skill they did not write as it is and report it\n",[209,1435,1436],{},"external",", wiring the rule and the hooks around it; a Claude Code or\nCodex plugin that provides the skill means no second copy. An install\ninterrupted between a file write and the manifest update is adopted on\nthe next run instead of refused.",[327,1439,1440,418,1443,1445,1446,1449,1450,1453,1454,1456,1457,1460,1461,1464],{},[992,1441,1442],{},"The triage skill ships in the binary.",[209,1444,1428],{}," installs\n",[209,1447,1448],{},"agentfeedback-triage"," by default (",[209,1451,1452],{},"--no-triage"," skips it), ",[209,1455,1432],{},"\nkeeps it (",[209,1458,1459],{},"--with-triage=false"," removes it), and its version is always\nthe binary's; the ",[209,1462,1463],{},"npx skills"," route remains for machines without the\nbinary. Its playbooks no longer describe a hosted version.",[327,1466,1467,418,1470,1473,1474,1477],{},[992,1468,1469],{},"A shorter session start.",[209,1471,1472],{},"agentfeedback prime",", which the\nsession-start hooks of Claude Code, Codex and Cursor run, prints about\n900 bytes (the triggers, the one command and where the rest is) instead\nof the whole guide; ",[209,1475,1476],{},"prime --full"," prints the whole guide.",[327,1479,1480,418,1483,1429,1486,1489,1490,1493,1494,1496],{},[992,1481,1482],{},"Switching to a server names the local reports.",[209,1484,1485],{},"init --server",[209,1487,1488],{},"doctor --init"," count the reports in the local database and print the\n",[209,1491,1492],{},"migrate --local --to \u003CURL> --to-key-from-stdin"," command; ",[209,1495,1428],{}," offers\nthe copy on a terminal. Nothing leaves the machine without that yes.",[327,1498,1499,1505,1506,1509,1510,1513,1514,1517,1518,720,1521,1524,1525,343],{},[992,1500,1501,1504],{},[209,1502,1503],{},"agentfeedback mcp"," serves a server too."," With a server configured it\nrelays the server's tools and adds this machine's session tools, and\n",[209,1507,1508],{},"install --mcp"," writes a stdio entry for a server as well\n(",[209,1511,1512],{},"mcp --server \u003CURL>","), so the API key stays out of harness files. The\nstdio ",[209,1515,1516],{},"submit_feedback"," tool takes ",[209,1519,1520],{},"context_from",[209,1522,1523],{},"ordinal",", like\n",[209,1526,1527],{},"submit --context-from",[327,1529,1530,1533,1534,426,1537,422,1540,1543,1544,1547,1548,1551],{},[992,1531,1532],{},"Local mode is sturdier."," A database path containing ",[209,1535,1536],{},"?",[209,1538,1539],{},"#",[209,1541,1542],{},"%","\nopens the file it names. ",[209,1545,1546],{},"submit"," keeps a report in the spool when the\nlocal database is busy or was written by a newer binary, and delivers it\nlater. Spool entries bound to the local database keep 30 days. The\nlegacy ",[209,1549,1550],{},"flush --hook"," does nothing in local mode.",[327,1553,1554,1555,1558,1559,1562],{},"The docs state once what still differs between local mode and a server\n(",[218,1556,522],{"href":1557},"\u002Fdocs\u002Freference\u002Foperate#local-mode-or-a-server-what-differs","). The\nskills' versions stay ",[209,1560,1561],{},"5.0",": their command contract is unchanged.",[205,1564,1565,1567,1568,1570,1571,1573,1574,1577],{},[992,1566,1242],{}," install the new binary, then run ",[209,1569,1246],{}," (or\n",[209,1572,1250],{},") once: it installs the triage skill,\nwires the short ",[209,1575,1576],{},"prime",", rewrites a URL MCP entry as the stdio entry, and\nadopts or leaves alone a skill another tool installed.",[205,1579,1330],{},[571,1581,1583],{"className":573,"code":1582,"language":575,"meta":576,"style":576},"gh release download v4.2.0 --repo AgentFeedback\u002Fagentfeedback --pattern 'agentfeedback_*' --pattern SHA256SUMS --pattern install.sh\nsha256sum -c SHA256SUMS                                      # shasum -a 256 -c on macOS\ndocker run --rm ghcr.io\u002Fagentfeedback\u002Fagentfeedback:4.2.0 version   # prints 4.2.0\n",[209,1584,1585,1612,1622],{"__ignoreMap":576},[580,1586,1587,1589,1591,1593,1596,1598,1600,1602,1604,1606,1608,1610],{"class":582,"line":583},[580,1588,317],{"class":586},[580,1590,608],{"class":590},[580,1592,743],{"class":590},[580,1594,1595],{"class":590}," v4.2.0",[580,1597,749],{"class":748},[580,1599,752],{"class":590},[580,1601,755],{"class":748},[580,1603,758],{"class":590},[580,1605,755],{"class":748},[580,1607,763],{"class":590},[580,1609,755],{"class":748},[580,1611,768],{"class":590},[580,1613,1614,1616,1618,1620],{"class":582,"line":603},[580,1615,473],{"class":586},[580,1617,775],{"class":748},[580,1619,763],{"class":590},[580,1621,1373],{"class":780},[580,1623,1624,1626,1628,1630,1633,1635],{"class":582,"line":784},[580,1625,1096],{"class":586},[580,1627,1380],{"class":590},[580,1629,1383],{"class":748},[580,1631,1632],{"class":590}," ghcr.io\u002Fagentfeedback\u002Fagentfeedback:4.2.0",[580,1634,1389],{"class":590},[580,1636,1637],{"class":780},"   # prints 4.2.0\n",[200,1639,1641],{"id":1640},"v410-bounded-warnings","v4.1.0 — Bounded warnings",[205,1643,1644,1645,1647],{},"Compatible with 4.0.0 clients and servers; the HTTP API stays ",[209,1646,1186],{},". One\ncontract addition: the warnings of a decode are bounded.",[324,1649,1650,1703],{},[327,1651,1652,1655,1656,1659,1660,720,1662,1665,1666,1669,1670,1676,1677,1680,1681,1684,1685,426,1688,1691,1692,1694,1695,1698,1699,1702],{},[992,1653,1654],{},"Warnings are bounded."," A response lists at most ",[209,1657,1658],{},"limits.warnings_max","\nwarnings (100, the closing entry included) whose ",[209,1661,209],{},[209,1663,1664],{},"pointer","\ntogether stay within ",[209,1667,1668],{},"limits.warnings_bytes"," (65536); both limits are in\n",[218,1671,1673],{"href":1672},"\u002Fdocs\u002Freference\u002Fapi#meta",[209,1674,1675],{},"\u002Fapi\u002Fv1\u002Fmeta",". A list that fits is returned as before; one\nthat does not is cut to the first entries in pointer order and closed by\none ",[209,1678,1679],{},"warnings_truncated"," entry at the record pointer ",[209,1682,1683],{},"\"\""," whose message\ncounts the withheld ones. Pointers are never shortened. Import bounds its\nresponse the same way in line order. Every surface inherits the bound:\n",[209,1686,1687],{},"POST \u002Fapi\u002Fv1\u002Fsubmissions",[209,1689,1690],{},"POST \u002Fapi\u002Fv1\u002Fimport",", the MCP ",[209,1693,1516],{},"\ntool and the CLI's local decode. The code joins the closed list in\n",[209,1696,1697],{},"conformance\u002Fwarnings.json","; the conformance kit gains\n",[209,1700,1701],{},"decode\u002Finteractions\u002Fwarnings-truncated","; the Python reference mirrors the\nrule.",[327,1704,1409,1705,1707],{},[209,1706,233],{}," skill's \"Warnings are advice\" paragraph says a long\nlist is cut; its version does not change (the command contract is the\nsame).",[205,1709,1330],{},[571,1711,1713],{"className":573,"code":1712,"language":575,"meta":576,"style":576},"gh release download v4.1.0 --repo AgentFeedback\u002Fagentfeedback --pattern 'agentfeedback_*' --pattern SHA256SUMS --pattern install.sh\nsha256sum -c SHA256SUMS                                      # shasum -a 256 -c on macOS\ndocker run --rm ghcr.io\u002Fagentfeedback\u002Fagentfeedback:4.1.0 version   # prints 4.1.0\n",[209,1714,1715,1742,1752],{"__ignoreMap":576},[580,1716,1717,1719,1721,1723,1726,1728,1730,1732,1734,1736,1738,1740],{"class":582,"line":583},[580,1718,317],{"class":586},[580,1720,608],{"class":590},[580,1722,743],{"class":590},[580,1724,1725],{"class":590}," v4.1.0",[580,1727,749],{"class":748},[580,1729,752],{"class":590},[580,1731,755],{"class":748},[580,1733,758],{"class":590},[580,1735,755],{"class":748},[580,1737,763],{"class":590},[580,1739,755],{"class":748},[580,1741,768],{"class":590},[580,1743,1744,1746,1748,1750],{"class":582,"line":603},[580,1745,473],{"class":586},[580,1747,775],{"class":748},[580,1749,763],{"class":590},[580,1751,1373],{"class":780},[580,1753,1754,1756,1758,1760,1763,1765],{"class":582,"line":784},[580,1755,1096],{"class":586},[580,1757,1380],{"class":590},[580,1759,1383],{"class":748},[580,1761,1762],{"class":590}," ghcr.io\u002Fagentfeedback\u002Fagentfeedback:4.1.0",[580,1764,1389],{"class":590},[580,1766,1767],{"class":780},"   # prints 4.1.0\n",[200,1769,1771],{"id":1770},"v400-local-first-one-binary-the-v1-contract-skills-50","v4.0.0 — Local first: one binary, the v1 contract, skills 5.0",[205,1773,1774,1775,1778,1779,1781,1782,1785,1786,1789,1790,1793,1794,1797,1798,1801],{},"Release 4.0.0 is the first one with release assets and an image published\nby the release pipeline (",[218,1776,378],{"href":1777},"#assets","); every earlier tag is source\nonly. It is a new major: the HTTP API is the v1 contract, version ",[209,1780,1186],{}," (3.x\nserved ",[209,1783,1784],{},"1.1","), and the v3 API is gone; the Go module path is\n",[209,1787,1788],{},"github.com\u002Fagentfeedback\u002Fagentfeedback\u002Fv4","; both skills are 5.0; a v4\nbinary refuses a v3 database (",[218,1791,522],{"href":1792},"\u002Fdocs\u002Freference\u002Foperate#upgrading-and-downgrading",":\nkeep the old database with the image that wrote it and start empty; a v3\nexport is not format 2 and does not import); a spool left under\n",[209,1795,1796],{},"~\u002F.cache\u002Fagentfeedback"," by 3.x is reported by ",[209,1799,1800],{},"doctor"," and never sent.",[324,1803,1804,1837,1943,1975,2030,2079,2111,2144,2161],{},[327,1805,1806,418,1809,1811,1812,1815,1816,1819,1820,1823,1824,1827,1828,1429,1830,1833,1834,343],{},[992,1807,1808],{},"Local mode is the default.",[209,1810,1246],{}," sets a machine up in\none pass: reports go to a SQLite database in the data directory\n(",[209,1813,1814],{},"${XDG_DATA_HOME:-~\u002F.local\u002Fshare}\u002Fagentfeedback",") with no server and no\nkey; ",[209,1817,1818],{},"init --server cloud|URL"," points it at a server instead. Every client\ncommand works on the local database; ",[209,1821,1822],{},"--server URL"," targets a server\nonce. Envelope files dropped into the data directory's ",[209,1825,1826],{},"inbox\u002F"," are\nsubmitted at the start of every local-mode command but ",[209,1829,1800],{},[209,1831,1832],{},"hook",", or by ",[209,1835,1836],{},"ingest",[327,1838,1839,418,1842,1844,1845,426,1848,426,1851,1854,1855,426,1858,426,1861,426,1864,1867,1868,426,1871,426,1874,426,1877,426,1879,426,1882,426,1885,426,1888,426,1891,426,1894,426,1896,1898,1899,426,1902,1854,1905,426,1908,426,1911,306,1913,1915,1916,1854,1918,1921,1922,1925,1926,1929,1930,720,1933,426,1936,1939,1940,1942],{},[992,1840,1841],{},"One binary, every command.",[209,1843,1546],{}," (friction, review, any kind;\n",[209,1846,1847],{},"--stdin",[209,1849,1850],{},"--dry-run",[209,1852,1853],{},"--scrub","), ",[209,1856,1857],{},"list",[209,1859,1860],{},"get",[209,1862,1863],{},"stats",[209,1865,1866],{},"done",",\n",[209,1869,1870],{},"undo",[209,1872,1873],{},"redact",[209,1875,1876],{},"rekind",[209,1878,846],{},[209,1880,1881],{},"import",[209,1883,1884],{},"backup",[209,1886,1887],{},"migrate --to cloud|URL --to-key-from-stdin",[209,1889,1890],{},"digest",[209,1892,1893],{},"flush",[209,1895,1836],{},[209,1897,1800],{},"\n(",[209,1900,1901],{},"--e2e",[209,1903,1904],{},"--init",[209,1906,1907],{},"schema",[209,1909,1910],{},"skill render",[209,1912,225],{},[209,1914,1832],{}," (per-session failure counters and a bounded nudge, replacing\n",[209,1917,1550],{},[209,1919,1920],{},"sessions list|digest|mark|status"," over the coding-agent\nsession logs on the machine (Claude Code, Codex, Copilot CLI, Gemini CLI\nand OpenCode readers; read on demand, never sent),\n",[209,1923,1924],{},"ui"," (a read-only loopback page over the queue), ",[209,1927,1928],{},"mcp"," (the tools over\nstdio on the local database), ",[209,1931,1932],{},"serve",[209,1934,1935],{},"serve --init",[209,1937,1938],{},"server install --systemd|--launchd|--compose",". The bash client of 3.x is retired;\n",[209,1941,384],{}," installs the binary.",[327,1944,1945,418,1948,426,1950,426,1953,1867,1956,426,1959,720,1961,1963,1964,1967,1968,1970,1971,1974],{},[992,1946,1947],{},"Harness installer.",[209,1949,1432],{},[209,1951,1952],{},"uninstall",[209,1954,1955],{},"install --check",[209,1957,1958],{},"install --project",[209,1960,1508],{},[209,1962,1576],{}," wire the skill, a rule in\nthe global instruction file, session-start and failure hooks or an MCP\nentry into fourteen harnesses: Claude Code and OpenCode live-checked on\n2026-10-07; omp, Codex, Cursor, pi, Copilot, Antigravity, Devin, Kiro,\nCline, Amp, VS Code and Gemini CLI written from their documentation and\nlisted as such by ",[209,1965,1966],{},"install --list"," until a live check is recorded.\n",[209,1969,1800],{}," reports version skew between the hook binaries and the one on\n",[209,1972,1973],{},"PATH",". Client data is created 0700\u002F0600 (not on Windows); the spool\nlives in the data directory and is bound to its destination.",[327,1976,1977,1980,1981,1984,1985,1898,1988,1991,1992,426,1994,1429,1997,2000,2001,523,2004,2007,2008,2011,2012,426,2015,1867,2018,426,2021,426,2024,426,2027,343],{},[992,1978,1979],{},"The v1 contract."," Envelope and kind schemas under ",[209,1982,1983],{},"schemas\u002F",", the\nOpenAPI document and the conformance kit under ",[209,1986,1987],{},"conformance\u002F",[218,1989,1990],{"href":163},"api.md","); context carries ",[209,1993,641],{},[209,1995,1996],{},"detector",[209,1998,1999],{},"session_harness",", friction carries ",[209,2002,2003],{},"evidence[]",[209,2005,2006],{},"client.min_version"," is\nthe constant ",[209,2009,2010],{},"4.0.0-rc.0",", so 4.0 release candidates are admitted. Importable packages: ",[209,2013,2014],{},"pkg\u002Fschema",[209,2016,2017],{},"pkg\u002Fcanonjson",[209,2019,2020],{},"pkg\u002Fenvelope",[209,2022,2023],{},"pkg\u002Fclient",[209,2025,2026],{},"pkg\u002Fcollect",[209,2028,2029],{},"pkg\u002Fscrub",[327,2031,2032,2035,2036,2038,2039,2042,2043,2046,2047,523,2050,2053,2054,2057,2058,2060,2061,2064,2065,2068,2069,2072,2073,2075,2076,343],{},[992,2033,2034],{},"Server."," The v1 API on a SQLite store with numbered migrations and\npinned query plans; export and import in format 2 (the HTTP import keeps\nuids and assigns new ids; the local ",[209,2037,1881],{}," command restores ids); remote\nMCP on ",[209,2040,2041],{},"\u002Fmcp"," (Streamable HTTP, the six tools, instructions), the served\nskill on ",[209,2044,2045],{},"\u002Fskill"," and the discovery document on\n",[209,2048,2049],{},"\u002F.well-known\u002Fagentfeedback.json",[209,2051,2052],{},"API_KEY_FILE","; opt-in ",[209,2055,2056],{},"INGEST_SCRUB",".\nA bare ",[209,2059,1932],{}," listens on ",[209,2062,2063],{},"127.0.0.1:8090"," and, with ",[209,2066,2067],{},"DATABASE_PATH","\nunset, uses the data-directory database rather than\n",[209,2070,2071],{},"\u002Fdata\u002Fagentfeedback.db","; the image keeps ",[209,2074,2071],{}," and\nlistens on ",[209,2077,2078],{},"0.0.0.0:8080",[327,2080,2081,418,2084,2086,2087,367,2090,1854,2092,2094,2095,2098,2099,2102,2103,2106,2107,2110],{},[992,2082,2083],{},"Skills.",[209,2085,233],{}," 5.0 is generated from\n",[209,2088,2089],{},"internal\u002Fskillgen\u002Fsource",[209,2091,244],{},[209,2093,1448],{}," 5.0 is\na fix-it session that clusters by root cause, verifies read-only,\ninterviews, acts and marks, starts from the session logs on an empty\nqueue, and has an MCP-only route; ",[209,2096,2097],{},"agentfeedback-docs"," carries the\nreference docs, schemas and OpenAPI document. An Agent Plugins bundle\nships under ",[209,2100,2101],{},"plugins\u002Fagentfeedback",", with marketplace manifests at\n",[209,2104,2105],{},".claude-plugin\u002Fmarketplace.json"," (Claude Code) and\n",[209,2108,2109],{},".agents\u002Fplugins\u002Fmarketplace.json"," (Codex).",[327,2112,2113,2116,2117,720,2119,2121,2122,2125,2126,720,2128,426,2130,2133,2134,2137,2138,523,2140,2143],{},[992,2114,2115],{},"Distribution."," The six archives, ",[209,2118,464],{},[209,2120,384],{}," on the\nGitHub release; ",[209,2123,2124],{},"ghcr.io\u002Fagentfeedback\u002Fagentfeedback"," (distroless,\n",[209,2127,297],{},[209,2129,301],{},[209,2131,2132],{},"CMD [\"serve\"]",") tagged ",[209,2135,2136],{},"4.0.0",", the\ncommit SHA and ",[209,2139,335],{},[209,2141,2142],{},"go install github.com\u002Fagentfeedback\u002Fagentfeedback\u002Fv4\u002Fcmd\u002Fagentfeedback@v4.0.0",".\nHomebrew, npm, PyPI, RubyGems and the rest follow as separate releases of\ntheir own channels.",[327,2145,2146,2149,2150,1429,2153,2156,2157,2160],{},[992,2147,2148],{},"One domain."," The project's site is agentfeedback.dev; ",[209,2151,2152],{},"--to cloud",[209,2154,2155],{},"init --server cloud"," resolve to ",[209,2158,2159],{},"https:\u002F\u002Fapi.agentfeedback.dev","\n(public beta). The 3.0.0 binaries named a domain that is retired.",[327,2162,2163,418,2166,2168,2169,2172,2173,426,2176,2179],{},[992,2164,2165],{},"Gates.",[209,2167,556],{}," runs every gate in a toolchain container and ends\nwith a live Claude Code check; ",[209,2170,2171],{},"just playbooks \u003Ctag>"," runs both install\nplaybooks (",[209,2174,2175],{},"AGENT-INSTALL.md",[209,2177,2178],{},"AGENT-INSTALL-STACK.md",") in a clean\ncontainer; GitHub Actions is gone, there is no hosted CI.",[205,2181,2182],{},"Manual checks for this release, recorded by the maintainer:",[324,2184,2185,2188],{},[327,2186,2187],{},"The paste check (both README prompts in two harnesses over the local\npath, and one live MCP desktop client over stdio) was waived by the\nmaintainer on 2026-10-19 and not run for 4.0.0.",[327,2189,2190,2191,2194],{},"The remote MCP header check (an MCP entry carrying the key lists the\ntools; a wrong key yields ",[209,2192,2193],{},"unauthorized"," with no OAuth discovery) was not\nrun for this tag: every harness's header support, Claude Code, OpenCode\nand omp included, is written from documentation and unverified until a\nlive check is recorded here.",[205,2196,1330],{},[571,2198,2200],{"className":573,"code":2199,"language":575,"meta":576,"style":576},"gh release download v4.0.0 --repo AgentFeedback\u002Fagentfeedback --pattern 'agentfeedback_*' --pattern SHA256SUMS --pattern install.sh\nsha256sum -c SHA256SUMS                                      # shasum -a 256 -c on macOS\ntar -xOzf agentfeedback_4.0.0_linux_amd64.tar.gz agentfeedback | sha256sum\ndocker run --rm ghcr.io\u002Fagentfeedback\u002Fagentfeedback:4.0.0 version   # prints 4.0.0\n",[209,2201,2202,2229,2239,2258],{"__ignoreMap":576},[580,2203,2204,2206,2208,2210,2213,2215,2217,2219,2221,2223,2225,2227],{"class":582,"line":583},[580,2205,317],{"class":586},[580,2207,608],{"class":590},[580,2209,743],{"class":590},[580,2211,2212],{"class":590}," v4.0.0",[580,2214,749],{"class":748},[580,2216,752],{"class":590},[580,2218,755],{"class":748},[580,2220,758],{"class":590},[580,2222,755],{"class":748},[580,2224,763],{"class":590},[580,2226,755],{"class":748},[580,2228,768],{"class":590},[580,2230,2231,2233,2235,2237],{"class":582,"line":603},[580,2232,473],{"class":586},[580,2234,775],{"class":748},[580,2236,763],{"class":590},[580,2238,1373],{"class":780},[580,2240,2241,2244,2247,2250,2253,2255],{"class":582,"line":784},[580,2242,2243],{"class":586},"tar",[580,2245,2246],{"class":748}," -xOzf",[580,2248,2249],{"class":590}," agentfeedback_4.0.0_linux_amd64.tar.gz",[580,2251,2252],{"class":590}," agentfeedback",[580,2254,953],{"class":845},[580,2256,2257],{"class":586}," sha256sum\n",[580,2259,2260,2262,2264,2266,2269,2271],{"class":582,"line":906},[580,2261,1096],{"class":586},[580,2263,1380],{"class":590},[580,2265,1383],{"class":748},[580,2267,2268],{"class":590}," ghcr.io\u002Fagentfeedback\u002Fagentfeedback:4.0.0",[580,2270,1389],{"class":590},[580,2272,2273],{"class":780},"   # prints 4.0.0\n",[200,2275,2277],{"id":2276},"v300-agentfeedback-new-home-new-names-fresh-start","v3.0.0 — AgentFeedback: new home, new names, fresh start",[205,2279,2280,2281,2286,2287,2292,2293,2296,2297,2299,2300,2302],{},"The project moved to ",[218,2282,2285],{"href":2283,"rel":2284},"https:\u002F\u002Fgithub.com\u002FAgentFeedback\u002Fagentfeedback",[268],"github.com\u002FAgentFeedback\u002Fagentfeedback","\nand is the open-source, self-hostable AgentFeedback\n(",[218,2288,2291],{"href":2289,"rel":2290},"https:\u002F\u002Fagentfeedback.dev",[268],"agentfeedback.dev","); a hosted version with the\nsame API is in public beta (it was announced here for ",[209,2294,2295],{},"agentfeedback.io",",\na domain retired on 2026-10-18: the project has one domain, and ",[209,2298,2152],{},"\nresolves to ",[209,2301,2159],{}," from release 4.0.0). Every name\nchanges and v3 is a fresh start: no migration from or compatibility with\n2.x deployments and skill installs. The HTTP API (1.1), payloads and hash forms are unchanged.",[324,2304,2305,2341,2382,2409,2419],{},[327,2306,2307,418,2310,2313,2314,2316,2317,2313,2320,2322,2323,2326,2327,2330,2331,2333,2334,2337,2338,2340],{},[992,2308,2309],{},"Skills",[209,2311,2312],{},"agent-feedback"," → ",[209,2315,233],{}," 4.0 and\n",[209,2318,2319],{},"agent-feedback-triage",[209,2321,1448],{}," 3.0: new directory and\ninvocation names (",[209,2324,2325],{},"\u002Fagentfeedback-triage","). Client environment variables\nkeep their names (",[209,2328,2329],{},"AGENT_FEEDBACK_*","); the spool moves to ",[209,2332,1796],{}," and triage digests to\n",[209,2335,2336],{},"${TMPDIR:-\u002Ftmp}\u002Fagentfeedback-triage\u002F",". The skills work against a\nself-hosted service or the hosted one (",[209,2339,2159],{},"\nfrom release 4.0.0; this release's binaries name the retired domain).",[327,2342,2343,2346,2347,2350,2351,367,2353,426,2356,2359,2360,2362,2363,2365,2366,2368,2369,1898,2372,426,2375,1867,2378,2381],{},[992,2344,2345],{},"Service",": Go module ",[209,2348,2349],{},"github.com\u002Fagentfeedback\u002Fagentfeedback","; binary\n",[209,2352,233],{},[209,2354,2355],{},"cmd\u002Fagentfeedback",[209,2357,2358],{},"\u002Fopt\u002Fagentfeedback",", runs as user\n",[209,2361,233],{},"); image ",[209,2364,2124],{},"; default\ndatabase ",[209,2367,2071],{},"; metrics renamed ",[209,2370,2371],{},"agentfeedback_*",[209,2373,2374],{},"agentfeedback_submissions_unprocessed",[209,2376,2377],{},"agentfeedback_db_bytes",[209,2379,2380],{},"agentfeedback_sqlite_busy_total",").",[327,2383,2384,2387,2388,2391,2392,2394,2395,2398,2399,2402,2403,1429,2406,343],{},[992,2385,2386],{},"Deploy",": stack directory ",[209,2389,2390],{},"infra\u002Fagentfeedback",", compose service\n",[209,2393,233],{},", volume ",[209,2396,2397],{},"agentfeedback-data",", server directory\n",[209,2400,2401],{},"~\u002Fagentfeedback",", variables ",[209,2404,2405],{},"AGENTFEEDBACK_IMAGE",[209,2407,2408],{},"AGENTFEEDBACK_BIND_ADDRESS",[327,2410,2411,2414,2415,2418],{},[992,2412,2413],{},"Removed",": the 1.x PostgreSQL export script and migration and uninstall\ndocs, and the ",[209,2416,2417],{},"docs\u002Fagent-usage.md"," redirect.",[327,2420,2421],{},"CI lowercases the image name (the org name has capitals).",[200,2423,2425],{"id":2424},"v221-documentation-sweep","v2.2.1 — Documentation sweep",[205,2427,2428],{},"Docs and skill documentation only; the service and scripts behave as in\nv2.2.0.",[324,2430,2431,2466,2488,2497,2509],{},[327,2432,2433,2439,2440,2443,2444,2447,2448,426,2451,426,2454,2457,2458,2461,2462,2465],{},[992,2434,2435,2436,2438],{},"Skill ",[209,2437,2319],{}," 2.1",": the optional clustering contract\nmoved to ",[209,2441,2442],{},"reference\u002Fclustering.md",", read only when clustering is used, and\nrepeated rules were collapsed: SKILL.md is a third shorter per invocation.\nInstall the whole directory, including ",[209,2445,2446],{},"reference\u002F",". Resolutions now start\nwith their verdict (",[209,2449,2450],{},"FIXED",[209,2452,2453],{},"INVALID",[209,2455,2456],{},"DUPLICATE-OF-\u003Cid>","). Fixed: the\nclose-out commands' path to the sibling skill, digest exit codes, the\nmeaning of ",[209,2459,2460],{},"unchanged"," versus ",[209,2463,2464],{},"updated",", and cluster.py's statuses, reasons\nand exit codes.",[327,2467,2468,2472,2473,2476,2477,2480,2481,2484,2485,343],{},[992,2469,2435,2470],{},[209,2471,2312],{}," (contract unchanged): corrected the ",[209,2474,2475],{},"machine","\noverride, ",[209,2478,2479],{},"--sweep"," age\u002Flock\u002Foutcome behaviour, backlog-warning scope, TSV\ncolumn 5, ",[209,2482,2483],{},"slots"," usage, 1xx\u002F3xx outcomes, export digest tools, and added\n",[209,2486,2487],{},"AGENT_FEEDBACK_TRIAGE_ROOTS",[327,2489,2490,2492,2493,2496],{},[218,2491,1990],{"href":163}," states its version (1.1), the non-JSON responses and the\n",[209,2494,2495],{},"include=payload"," row shape.",[327,2498,2499,2501,2502,720,2505,2508],{},[218,2500,522],{"href":168},": the retention purge runs as root, backups create\ntheir directory, ",[209,2503,2504],{},"openssl",[209,2506,2507],{},"DEPLOY_DIR"," are documented, and uninstall\ncovers the triage variables.",[327,2510,2511,2514,2515,2518],{},[209,2512,2513],{},"CLAUDE.md"," routes to ",[218,2516,269],{"href":266,"rel":2517},[268],", the single home for\ncommands, rules and gates; the README quickstart checks out the latest tag\nand keeps an existing key.",[200,2520,2522],{"id":2521},"v220-triage-skill-renamed-batched-measured-clustering","v2.2.0 — Triage skill renamed; batched, measured clustering",[324,2524,2525,2549,2560,2570,2575,2591,2594,2604],{},[327,2526,2527,2536,2537,2540,2541,2544,2545,2548],{},[992,2528,2435,2529,2532,2533,2535],{},[209,2530,2531],{},"feedback-triage"," is now ",[209,2534,2319],{}," 2.0."," The\ninvocation name and the install directory change: update installers,\nlinks and prompts that name ",[209,2538,2539],{},"skills\u002Ffeedback-triage",", and remove the old\ncopy (",[218,2542,522],{"href":2543},"\u002Fdocs\u002Freference\u002Foperate#uninstall"," lists both names). Digests move to\n",[209,2546,2547],{},"${TMPDIR:-\u002Ftmp}\u002Fagent-feedback-triage\u002F",". No service\u002FAPI or storage changes.",[327,2550,2551,2552,2555,2556,2559],{},"The triage skill is direct invocation only: ",[209,2553,2554],{},"disable-model-invocation: true","\n(Claude Code) and a description that forbids loading it from phrasing\nabout the queue. Invoke it as ",[209,2557,2558],{},"\u002Fagent-feedback-triage"," or by name.",[327,2561,2562,2563,2566,2567,343],{},"Docs: install guidance for the triage skill, the rule to re-measure after\nany ",[209,2564,2565],{},"cluster.py"," prompt, threshold or batching change, and the eval\nscript's disclosure boundary in ",[218,2568,2569],{"href":172},"security.md",[327,2571,2572,2574],{},[209,2573,2565],{}," batches comparisons: up to 8 reports per request, every pair\nasked once over a shared state, so 24 reports need 15 requests instead of\n276 (which exceeded the old cap and skipped advice). One request per pair\nremains the fallback for batch sizes below 4 and for chunks over the\nmodel's token budget; a pair too large alone is marked unassessed without\na request. One invalid answer in a batch marks only that pair.",[327,2576,2577,2586,2587,2590],{},[992,2578,2579,2582,2583],{},[209,2580,2581],{},"--max-pairs"," is replaced by ",[209,2584,2585],{},"--max-requests"," (default 200); the old\nflag is rejected because its unit changed. New ",[209,2588,2589],{},"--batch-size"," (default 8).",[327,2592,2593],{},"Probability sums tolerate the model's per-option two-decimal rounding.",[327,2595,2596,2597,2600,2601,343],{},"Calibration recorded in the skill: on 112 labelled pairs, no different\npair was grouped at the 0.8 threshold; consent, dry-run, key handling and\ncomplete-link grouping are unchanged. ",[209,2598,2599],{},"scripts\u002Feval-cluster.py"," repeats\nthe measurement and refuses to send any report whose exact remote was not\napproved with ",[209,2602,2603],{},"--allow-repo",[327,2605,2606],{},"Go module dependency updates (indirect only).",[200,2608,2610],{"id":2609},"v210-optional-advisory-triage-clustering","v2.1.0 — Optional advisory triage clustering",[324,2612,2613,2621,2624],{},[327,2614,2615,2620],{},[992,2616,2435,2617,2619],{},[209,2618,2531],{}," 1.1"," adds a Python 3.9+ helper that compares\nreport mechanisms through TypeSafe and suggests clusters. The manual\nworkflow remains the default; no service\u002FAPI or storage changes.",[327,2622,2623],{},"Disclosure requires explicit approval for each exact repository identity.\nPreview is local; unapproved or unidentified reports are never sent.\nNo credential is copied, no queue item is marked, and no report is removed.",[327,2625,2626],{},"Advice retains source IDs, the digest hash and individual probabilities.\nGroups require agreement for every member pair, not transitive matches.\nUncertain, unavailable and invalid answers fall back to manual triage;\nbounded requests preserve partial results without dropping reports.",[200,2628,2630],{"id":2629},"v200-sqlite-generic-events-triage-skill","v2.0.0 — SQLite, generic events, triage skill",[205,2632,2633],{},"Breaking operational contract, compatible API.",[324,2635,2636,2669,2709,2722,2744,2794,2807],{},[327,2637,2638,2641,2642,2644,2645,2648,2649,2652,2653,2656,2657,2660,2661,2664,2665,2668],{},[992,2639,2640],{},"Storage",": PostgreSQL replaced by SQLite (",[209,2643,1322],{},", pure Go).\nOne container, one named volume, no database service. Physical backups via\n",[209,2646,2647],{},"feedback backup",", logical via ",[209,2650,2651],{},"GET \u002Fapi\u002Fv1\u002Fexport","; restore and migration\nvia ",[209,2654,2655],{},"feedback import"," (all-or-nothing, header\u002Fcount\u002Fdigest verified, hashes\nrecomputed, ",[209,2658,2659],{},"--family"," filter, ids never reused). See\n",[218,2662,522],{"href":2663},"\u002Fdocs\u002Freference\u002Foperate#restore-and-migration","\nfor the 1.x migration procedure; ",[209,2666,2667],{},"scripts\u002Fexport-v1-postgres.sh"," produces\nthe import file from a 1.x deployment with ids, timestamps, processing state\nand hashes preserved.",[327,2670,2671,367,2674,2676,2677,720,2680,2683,2684,426,2687,2690,2691,426,2694,426,2697,426,2700,2703,2704,426,2706,2708],{},[992,2672,2673],{},"API 1.1",[218,2675,1990],{"href":163},"): additive. ",[209,2678,2679],{},"family",[209,2681,2682],{},"payload_hash"," on\nevery record, ",[209,2685,2686],{},"POST \u002Fapi\u002Fv1\u002Fevents",[209,2688,2689],{},"resolution"," when marking processed,\nkeyset pagination (",[209,2692,2693],{},"before_id",[209,2695,2696],{},"has_more",[209,2698,2699],{},"next_before_id",[209,2701,2702],{},"total","),\n",[209,2705,2495],{},[209,2707,2651],{},", six-digit timestamps. Every 1.0\nrequest and response field is unchanged.",[327,2710,2711,2713,2714,2717,2718,2721],{},[992,2712,2345],{},": stdlib ",[209,2715,2716],{},"net\u002Fhttp",", Prometheus with bounded labels plus backlog,\ndatabase size and busy counters. OpenTelemetry, chi, sqlc and the\nPostgreSQL-specific configuration are gone. ",[209,2719,2720],{},"GRACEFUL_SHUTDOWN_TIMEOUT","\ndefault is now 30s; the fixed 5s drain sleep is removed. Payloads are\nreturned byte-exact (large integers no longer round).",[327,2723,2724,2727,2728,2731,2732,2735,2736,2739,2740,2743],{},[992,2725,2726],{},"Deployment",": ",[209,2729,2730],{},"scripts\u002Fdeploy.sh \u003Csha>"," installs the compose file,\npreserves the host ",[209,2733,2734],{},".env",", pins the image there and runs ",[209,2737,2738],{},"docker compose pull && up",". Requires the GHCR package to be pullable by the host. The\n",[209,2741,2742],{},"crane"," streaming path is gone.",[327,2745,2746,2751,2752,523,2755,2758,2759,2762,2763,2766,2767,2769,2770,523,2773,306,2776,2779,2780,1429,2783,2786,2787,2790,2791,2793],{},[992,2747,2435,2748,2750],{},[209,2749,2312],{}," 3.0",": new ",[209,2753,2754],{},"submit-event.sh",[209,2756,2757],{},"process.sh list","\npages through the whole queue and takes ",[209,2760,2761],{},"--include-processed"," (the old\n",[209,2764,2765],{},"--all"," errors), ",[209,2768,1866],{}," takes ",[209,2771,2772],{},"--resolution",[209,2774,2775],{},"query.sh export",[209,2777,2778],{},"submit-review.sh --sweep"," scans ",[209,2781,2782],{},"REVIEW_LOG_DIR",[209,2784,2785],{},"AGENT_FEEDBACK_REVIEW_DIRS"," only (set the latter where hardcoded cache\npaths were relied on). Fixes: spool persistence is verified (an unwritable\nspool now fails loudly instead of reporting ",[209,2788,2789],{},"spooled","), review receipts are\nvalidated before a run is marked submitted, large prose no longer passes\nthrough argv, ",[209,2792,1850],{}," applies the server's validation, rejected spool\nfiles are kept 30 days as documented.",[327,2795,2796,2802,2803,2806],{},[992,2797,2798,2799,2801],{},"New skill ",[209,2800,2531],{}," 1.0",": end-to-end queue processing with one\nconsolidated interview. ",[209,2804,2805],{},"scripts\u002Fdigest.sh"," pulls and groups the open queue.",[327,2808,2809,2811,2812,1867,2814,426,2816,426,2818,2820,2821,2823,2824,343],{},[992,2810,5],{}," rewritten for agents first: README route table, ",[209,2813,1990],{},[209,2815,522],{},[209,2817,269],{},[209,2819,2569],{},". Template-era documents removed;\n",[209,2822,2417],{}," redirects to ",[209,2825,1990],{},[205,2827,2828],{},"Upgrade: follow the migration procedure; the 1.x PostgreSQL volume is not\nread by 2.x. Producers need skill 3.0 only for the new features; 2.1 clients\nkeep working against the 2.0.0 service.",[200,2830,2832],{"id":2831},"v101-public-documentation-and-release-workflow","v1.0.1 — Public documentation and release workflow",[205,2834,2835],{},"Compact README with dedicated guides, guarded release tooling, updated Go\nmodules, toolchain, container bases and CI actions. No API or migration\nchanges.",[200,2837,2839],{"id":2838},"v100","v1.0.0",[205,2841,2842],{},"Initial stable API and companion client release.",[2844,2845,2846],"style",{},"html pre.shiki code .snPdu, html code.shiki .snPdu{--shiki-light:#6F42C1;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sIIMD, html code.shiki .sIIMD{--shiki-light:#032F62;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sBjJW, html code.shiki .sBjJW{--shiki-light:#005CC5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sCsY4, html code.shiki .sCsY4{--shiki-light:#6A737D;--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .s8jYJ, html code.shiki .s8jYJ{--shiki-light:#D73A49;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sxrX7, html code.shiki .sxrX7{--shiki-light:#24292E;--shiki-default:#24292E;--shiki-dark:#E1E4E8}",{"title":576,"searchDepth":603,"depth":603,"links":2848},[2849,2857,2858,2859,2860,2861,2862,2863,2864,2865,2866,2867,2868,2869],{"id":202,"depth":603,"text":203,"children":2850},[2851,2852,2853,2854,2855,2856],{"id":322,"depth":784,"text":221},{"id":377,"depth":784,"text":378},{"id":530,"depth":784,"text":531},{"id":728,"depth":784,"text":729},{"id":820,"depth":784,"text":821},{"id":979,"depth":784,"text":980},{"id":1179,"depth":603,"text":1180},{"id":1275,"depth":603,"text":1276},{"id":1313,"depth":603,"text":1314},{"id":1395,"depth":603,"text":1396},{"id":1640,"depth":603,"text":1641},{"id":1770,"depth":603,"text":1771},{"id":2276,"depth":603,"text":2277},{"id":2424,"depth":603,"text":2425},{"id":2521,"depth":603,"text":2522},{"id":2609,"depth":603,"text":2610},{"id":2629,"depth":603,"text":2630},{"id":2831,"depth":603,"text":2832},{"id":2838,"depth":603,"text":2839},"Source releases are annotated, immutable `vMAJOR.MINOR.PATCH` tags, with `-rc.N` pre-releases before a stable one (Tags): patch for compatible fixes, docs and…","md",{},{"title":180,"icon":183},{"title":180,"description":2870},null,"mdX9u446l5E9HL9FhoAryVMA48w-xdHWiPXD0ZIYNR4",[2878,2880],{"title":175,"path":176,"stem":177,"description":2879,"icon":178,"children":-1},"`agentfeedback sessions` reads the session logs a coding-agent harness keeps on disk, on demand and read-only, so an agent can turn what went wrong in a past…",{"title":185,"path":186,"stem":187,"description":2881,"icon":188,"children":-1},"You are an AI agent asked to install the AgentFeedback client and set it up for the harness you run in.",1794388868447]