{"_id":"@brokkai/feature-bot-linux-arm64","_rev":"6-d532bc00af2b524d0f29645b4b41eb3d","name":"@brokkai/feature-bot-linux-arm64","dist-tags":{"next":"0.1.0-rc.1","latest":"0.4.2"},"versions":{"0.1.0-rc.1":{"name":"@brokkai/feature-bot-linux-arm64","version":"0.1.0-rc.1","license":"Apache-2.0","_id":"@brokkai/feature-bot-linux-arm64@0.1.0-rc.1","maintainers":[{"name":"bigslopdave","email":"david@brokk.ai"},{"name":"foundev","email":"tech@foundev.pro"}],"homepage":"https://github.com/BrokkAi/feature-bot#readme","bugs":{"url":"https://github.com/BrokkAi/feature-bot/issues"},"os":["linux"],"cpu":["arm64"],"dist":{"shasum":"6a69284695368e5f84e34d049451289fe63b95db","tarball":"https://registry.npmjs.org/@brokkai/feature-bot-linux-arm64/-/feature-bot-linux-arm64-0.1.0-rc.1.tgz","fileCount":7,"integrity":"sha512-jN4jFq2uRuY5DYLcobnlA+J0r7dDFjp0Jct40WfDrPWc0iBjJX6y94+68Ed4o+mZHnIjONjSn3puFTll3ytfqA==","signatures":[{"sig":"MEUCIQDK0JITAedsEJ/JRQVlqRK03Cmyi1V2IUvtj6u61tYeUAIgd3/vnrmP1XeWThyr8lFFkrF3Q3pKEv3KhV63//k257E=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5622762},"_from":"file:/private/tmp/feature-bot-release-0.1.0-rc.1/packages/npm/brokkai-feature-bot-linux-arm64-0.1.0-rc.1.tgz","_npmUser":{"name":"foundev","email":"tech@foundev.pro"},"_resolved":"/private/tmp/feature-bot-release-0.1.0-rc.1/packages/npm/brokkai-feature-bot-linux-arm64-0.1.0-rc.1.tgz","_integrity":"sha512-jN4jFq2uRuY5DYLcobnlA+J0r7dDFjp0Jct40WfDrPWc0iBjJX6y94+68Ed4o+mZHnIjONjSn3puFTll3ytfqA==","repository":{"url":"git+https://github.com/BrokkAi/feature-bot.git","type":"git"},"_npmVersion":"12.0.2","description":"Brokk Feature Bot native binary for linux/arm64","directories":{},"_nodeVersion":"24.18.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/feature-bot-linux-arm64_0.1.0-rc.1_1789055277941_0.4239291142559207","host":"s3://npm-registry-packages-npm-production"}},"0.1.0":{"name":"@brokkai/feature-bot-linux-arm64","version":"0.1.0","license":"Apache-2.0","_id":"@brokkai/feature-bot-linux-arm64@0.1.0","maintainers":[{"name":"jbellis","email":"jbellis@gmail.com"},{"name":"bigslopdave","email":"david@brokk.ai"},{"name":"foundev","email":"tech@foundev.pro"}],"homepage":"https://github.com/BrokkAi/feature-bot#readme","bugs":{"url":"https://github.com/BrokkAi/feature-bot/issues"},"os":["linux"],"cpu":["arm64"],"dist":{"shasum":"59062f756b683f632ead22a439b9c36ab3bdf3d2","tarball":"https://registry.npmjs.org/@brokkai/feature-bot-linux-arm64/-/feature-bot-linux-arm64-0.1.0.tgz","fileCount":7,"integrity":"sha512-N8OngpzdDwqYh1V0UyDjoQ1Bc6WbxpLRXTRvZ+/TS+CXmBwmZvD7cVhlVBabUUvbBigYPNf7iN6Ap5x8T3nyPw==","signatures":[{"sig":"MEUCIEWlenYpRXnkT7GbX5SdszH4iswwMKhxWNcVUg+20E7pAiEAzA0K7H7OzU5/jFy+EHhXYOSUW4q+FuP4z5f3v/xQ+Fs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCICJvmNaZkTuovPOoDh1s4+hq7+2Xu3mNO3+nwS8E5rXqAiAMf1+Ln1r9OHnArgbwhMKWSqj6+U52QQN16gRC+EUwvg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@brokkai%2ffeature-bot-linux-arm64@0.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":7458945},"_from":"file:/home/runner/work/feature-bot/feature-bot/dist/packages/npm/brokkai-feature-bot-linux-arm64-0.1.0.tgz","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:266c8f0f-6540-4f4f-b8e1-cf5b179dc409"}},"_resolved":"/home/runner/work/feature-bot/feature-bot/dist/packages/npm/brokkai-feature-bot-linux-arm64-0.1.0.tgz","_integrity":"sha512-N8OngpzdDwqYh1V0UyDjoQ1Bc6WbxpLRXTRvZ+/TS+CXmBwmZvD7cVhlVBabUUvbBigYPNf7iN6Ap5x8T3nyPw==","repository":{"url":"git+https://github.com/BrokkAi/feature-bot.git","type":"git"},"_npmVersion":"11.19.0","description":"Brokk Feature Bot native binary for linux/arm64","directories":{},"_nodeVersion":"24.20.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/feature-bot-linux-arm64_0.1.0_1789374810013_0.4525056086342967","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@brokkai/feature-bot-linux-arm64","version":"0.1.1","license":"Apache-2.0","_id":"@brokkai/feature-bot-linux-arm64@0.1.1","maintainers":[{"name":"jbellis","email":"jbellis@gmail.com"},{"name":"bigslopdave","email":"david@brokk.ai"},{"name":"foundev","email":"tech@foundev.pro"}],"homepage":"https://github.com/BrokkAi/feature-bot#readme","bugs":{"url":"https://github.com/BrokkAi/feature-bot/issues"},"os":["linux"],"cpu":["arm64"],"dist":{"shasum":"7a335b35ed408c76de88632001e04efa4bed2718","tarball":"https://registry.npmjs.org/@brokkai/feature-bot-linux-arm64/-/feature-bot-linux-arm64-0.1.1.tgz","fileCount":7,"integrity":"sha512-SkGUsaINAKC9/PIZmbdptdf2WaqQ3PpxyVRnhDY0cnqa2MRmvnQr51gDasG7OL2P0NdY9bwTh58b0RdbOMEaZw==","signatures":[{"sig":"MEQCIBMW/UPx+tS6lOLozR9BexZH707T1Nd8YtDnTpQc4/h+AiAW9ZB8hOGgcViP71/XIa2PjUORnG3nESy83RwcQotE4Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIAESy7ZlXBheS7aX61cYYAGktip2xjuC5jiqTiRUurdFAiB9Pl04esc8MrltpY2tjyOP0OB7vs02NaG7Idy4KqhvMQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@brokkai%2ffeature-bot-linux-arm64@0.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":7458945},"_from":"file:/home/runner/work/feature-bot/feature-bot/dist/packages/npm/brokkai-feature-bot-linux-arm64-0.1.1.tgz","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:266c8f0f-6540-4f4f-b8e1-cf5b179dc409"}},"_resolved":"/home/runner/work/feature-bot/feature-bot/dist/packages/npm/brokkai-feature-bot-linux-arm64-0.1.1.tgz","_integrity":"sha512-SkGUsaINAKC9/PIZmbdptdf2WaqQ3PpxyVRnhDY0cnqa2MRmvnQr51gDasG7OL2P0NdY9bwTh58b0RdbOMEaZw==","repository":{"url":"git+https://github.com/BrokkAi/feature-bot.git","type":"git"},"_npmVersion":"11.19.0","description":"Brokk Feature Bot native binary for linux/arm64","directories":{},"_nodeVersion":"24.20.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/feature-bot-linux-arm64_0.1.1_1789376747965_0.09442392805430933","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@brokkai/feature-bot-linux-arm64","version":"0.1.2","license":"Apache-2.0","_id":"@brokkai/feature-bot-linux-arm64@0.1.2","maintainers":[{"name":"jbellis","email":"jbellis@gmail.com"},{"name":"bigslopdave","email":"david@brokk.ai"},{"name":"foundev","email":"tech@foundev.pro"}],"homepage":"https://github.com/BrokkAi/feature-bot#readme","bugs":{"url":"https://github.com/BrokkAi/feature-bot/issues"},"os":["linux"],"cpu":["arm64"],"dist":{"shasum":"c823fe6d3db61eca0815b57b47613b544ec815bf","tarball":"https://registry.npmjs.org/@brokkai/feature-bot-linux-arm64/-/feature-bot-linux-arm64-0.1.2.tgz","fileCount":7,"integrity":"sha512-qvlc63gtWX3dHUEc/YUtiaNEY9zBocEN1WquX0aFkp5izjcTsYcA6kUN0C+Kw28xT5LLOBAfsMIzON1gkVSJCQ==","signatures":[{"sig":"MEYCIQDNZWDGII/l/rA9puH1cR9A9rjC0XxC/U3sZtNU7Zo52gIhANX1BMybH7OxC27K0tiEwUG2q8M/QFnEYHxXI9VsOwph","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCpGuKnYOIIy09FagqHfoHEd/FsuluzuVPXtn10tpLFHwIgdl9FiU91nw0lCNx71Uce8RTOuv+nDjgsFGUV8BZUWZs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@brokkai%2ffeature-bot-linux-arm64@0.1.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":7462532},"_from":"file:/home/runner/work/feature-bot/feature-bot/dist/preflight/de2db2e07ef6c15c2a05c5db623b7fe22ef40c1a/v0.1.2/packages/npm/brokkai-feature-bot-linux-arm64-0.1.2.tgz","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:266c8f0f-6540-4f4f-b8e1-cf5b179dc409"}},"_resolved":"/home/runner/work/feature-bot/feature-bot/dist/preflight/de2db2e07ef6c15c2a05c5db623b7fe22ef40c1a/v0.1.2/packages/npm/brokkai-feature-bot-linux-arm64-0.1.2.tgz","_integrity":"sha512-qvlc63gtWX3dHUEc/YUtiaNEY9zBocEN1WquX0aFkp5izjcTsYcA6kUN0C+Kw28xT5LLOBAfsMIzON1gkVSJCQ==","repository":{"url":"git+https://github.com/BrokkAi/feature-bot.git","type":"git"},"_npmVersion":"11.19.0","description":"Brokk Feature Bot native binary for linux/arm64","directories":{},"_nodeVersion":"24.20.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/feature-bot-linux-arm64_0.1.2_1789475547777_0.5587099483194289","host":"s3://npm-registry-packages-npm-production"}},"0.4.2":{"os":["linux"],"_id":"@brokkai/feature-bot-linux-arm64@0.4.2","cpu":["arm64"],"bugs":{"url":"https://github.com/BrokkAi/brokk-town/issues"},"dist":{"shasum":"03e95a34e873368f4ef5aa3f276b947d3c68b0f5","tarball":"https://registry.npmjs.org/@brokkai/feature-bot-linux-arm64/-/feature-bot-linux-arm64-0.4.2.tgz","fileCount":7,"integrity":"sha512-rmPlDV3YWFOT+asrMVZy5395GLS7If2OkMsGvKwAeLl3DL2Eq4xOwiL47ZFjzXzxDr9DFZGsT3YnUiyfgZUzWA==","signatures":[{"sig":"MEYCIQDWL18e6cXO4yF3WbjlNwibvXAlB7snal/xmLzxja6zkwIhAOHiy+WHuO7KiuyC/t/PQCS147niZ3JP8KIJLOY1R1Fk","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCT5Rvev1w8OeC9J+bGbf92v/zta0ECCGIBBev1zReIKQIhAKMNgMS0+J8ELd4J4BFg1r/sv85T7E8WXvMpOr1iTtR4"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@brokkai%2ffeature-bot-linux-arm64@0.4.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":7733202},"name":"@brokkai/feature-bot-linux-arm64","_from":"file:/home/runner/work/brokk-town/brokk-town/bots/feature-bot/dist/release/packages/npm/brokkai-feature-bot-linux-arm64-0.4.2.tgz","license":"Apache-2.0","version":"0.4.2","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:a5b4954d-aeee-480e-8204-1020c153476b"}},"homepage":"https://github.com/BrokkAi/brokk-town#readme","_resolved":"/home/runner/work/brokk-town/brokk-town/bots/feature-bot/dist/release/packages/npm/brokkai-feature-bot-linux-arm64-0.4.2.tgz","_integrity":"sha512-rmPlDV3YWFOT+asrMVZy5395GLS7If2OkMsGvKwAeLl3DL2Eq4xOwiL47ZFjzXzxDr9DFZGsT3YnUiyfgZUzWA==","repository":{"url":"git+https://github.com/BrokkAi/brokk-town.git","type":"git"},"_npmVersion":"11.19.0","description":"Brokk Feature Bot native binary for linux/arm64","directories":{},"maintainers":[{"name":"jbellis","email":"jbellis@gmail.com"},{"name":"bigslopdave","email":"david@brokk.ai"},{"name":"foundev","email":"tech@foundev.pro"}],"_nodeVersion":"24.21.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/feature-bot-linux-arm64_0.4.2_1790416815707_0.9450960200358347"}}},"time":{"created":"2026-09-10T15:47:57.766Z","modified":"2026-09-26T10:00:16.273Z","0.1.0-rc.1":"2026-09-10T15:47:58.165Z","0.1.0":"2026-09-14T08:33:30.170Z","0.1.1":"2026-09-14T09:05:48.133Z","0.1.2":"2026-09-15T12:32:27.930Z","0.4.2":"2026-09-26T10:00:15.883Z"},"bugs":{"url":"https://github.com/BrokkAi/brokk-town/issues"},"license":"Apache-2.0","homepage":"https://github.com/BrokkAi/brokk-town#readme","repository":{"url":"git+https://github.com/BrokkAi/brokk-town.git","type":"git"},"description":"Brokk Feature Bot native binary for linux/arm64","maintainers":[{"name":"jbellis","email":"jbellis@gmail.com"},{"name":"bigslopdave","email":"david@brokk.ai"},{"name":"foundev","email":"tech@foundev.pro"}],"readme":"# Brokk Feature Bot\n\nThis standalone project now lives in [`BrokkAi/brokk-town/bots/feature-bot`](https://github.com/BrokkAi/brokk-town/tree/master/bots/feature-bot). Build and test from this directory; see [RELEASING.md](RELEASING.md) for its independent suffix-tag releases.\n\n<img src=\"https://raw.githubusercontent.com/BrokkAi/feature-bot/master/docs/feature-reader.png\" alt=\"Studious feature bot with glasses and an open book\" width=\"200\">\n\nResearch valuable new features in a repository and file concrete GitHub proposals.\n`bfb` is modeled on [bug-bot](https://github.com/BrokkAi/bug-bot) (`bbb`), with a\nfeature-specific research prompt, proposal schema, and independent state. It follows\nthe same Go CLI, no-config discovery, managed workspace, and shared\n[ACP runner](https://github.com/BrokkAi/acp-go) pattern as\n[issue-bot](https://github.com/BrokkAi/issue-bot) (`bib`) and\n[release-bot](https://github.com/BrokkAi/release-bot) (`brb`).\n\n**The LLM decides whether a finding duplicates an existing issue.** It compares\nuser goals, capabilities, scope, and discussion across open and closed issues.\nThere are no title similarity thresholds or feature fingerprint rules. Proposals\nmust fit the repository's purpose, demonstrate a capability gap, explain user\nvalue, and include bounded scope and testable acceptance criteria. Bug fixes,\nrefactors-only, speculative wishlists, and previously rejected features are excluded.\n\n## Install and run\n\nThe initial prerelease is `v0.1.0-rc.1`, available under npm's `next` channel\nonce its publication completes. Use `npm install -g @brokkai/feature-bot@next`\nfor prereleases. The stable installation commands below become available when a\nstable release is published. To build a source checkout, run `make build`.\n\nInstall with npm (Node.js 18+; no Go toolchain required):\n\n```sh\nnpm install -g @brokkai/feature-bot\nbfb /path/to/your-repo\n```\n\nFor a single invocation, use `npx --yes @brokkai/feature-bot`. Keep npm optional\ndependencies enabled: they supply the native Linux/macOS x64 or arm64 binary.\n\nOr install a native binary with its SHA-256 checksum verified:\n\n```sh\ncurl -fsSL https://raw.githubusercontent.com/BrokkAi/feature-bot/master/install.sh | sh\n```\n\nThe installer puts `bfb` in `~/.local/bin`; add that directory to `PATH`.\nSet `INSTALL_DIR` to change the destination. To pin a version, download the\nscript and run `sh install.sh v0.1.0`.\n\nWith Go 1.27.1 or newer:\n\n```sh\ngo install github.com/BrokkAi/feature-bot/cmd/bfb@latest\n```\n\nGo installs `bfb` in `GOBIN`, or `$(go env GOPATH)/bin` by default.\nFrom a source checkout:\n\n```sh\nmake build\n./bin/bfb /path/to/your-repo\n./bin/bfb /path/to/your-repo --plain\n./bin/bfb once /path/to/your-repo --dry-run\n./bin/bfb once /path/to/your-repo --focus \"onboarding and reporting workflows\"\n./bin/bfb /path/to/your-repo --max-issues 2 --label enhancement\n./bin/bfb /path/to/your-repo --model YOUR_MODEL_ID --effort low\n./bin/bfb /path/to/your-repo --model RESEARCH_MODEL_ID --review-model REVIEW_MODEL_ID --review-effort high\n./bin/bfb status /path/to/your-repo\n./bin/bfb report /path/to/your-repo --branch master --status dry_run > proposals.md\n./bin/bfb publish /path/to/your-repo --branch master --list\n./bin/bfb publish /path/to/your-repo --proposal SELECTOR\n./bin/bfb prune /path/to/your-repo --branch master --older-than 720h\n./bin/bfb version\n./bin/bfb retry /path/to/your-repo --once\n```\n\nSource builds require Go 1.27.1. To install the local source as `bfb`, run\n`go install ./cmd/bfb` and put your Go bin directory on `PATH`.\nRunning `bfb` from inside any target repository discovers its remote and default\nbranch. A Git URL also works. Flags can precede or follow the repository argument.\n\n`bfb version` prints the embedded release tag. Local builds report `dev`; binaries installed with `go install ...@version` report the module version.\n\nRuntime requirements: Git, authenticated `gh` with repository/issue read and\nissue creation access, and an authenticated ACP agent. By default it uses an\ninstalled `codex-acp`, falling back to `npx --yes @agentclientprotocol/codex-acp`.\nExplicit `--agent` commands are used as supplied; repeat `--agent-arg` for arguments.\n\nStarting `bfb` authorizes unattended local investigation, test execution, and\ncreation of issues for the selected repository. `--dry-run` performs discovery\nand review, prints the proposed issue bodies, and saves them without filing.\n\n## Terminal dashboard\n\nInteractive runs show a live dashboard with a studious spectacles-and-book motif.\nIt fits the current terminal\nor tmux pane, adjusts when the pane is resized, and keeps the repository and\ncurrent task visible. Each pane still runs one repository.\n\n```sh\nbfb /path/to/repo           # live dashboard in an interactive terminal\nbfb /path/to/repo --plain   # scrolling console output and agent transcript\nbfb /path/to/repo --json    # structured logs for tools and log collectors\n```\n\nThe overview shows the repository, branch and commit, scan stage, active tool,\nuptime, attempt budget, and next check or retry countdown. Larger panes also\nshow the discovery and review model and reasoning effort, and the investigation\nfocus.\n\n**Saved** counts cover findings in the configured repository/branch state,\nincluding the current scan: found, filed, duplicate, pending, dry run, and skipped\n(invalid, uncertain, or stale). **Run** counters start at zero each time the\nprocess starts: completed scans, attempts, agent starts, tools, and error log\nevents. A discovered finding is counted as filed only after publication is\nconfirmed. Findings restored after restarting are included in saved totals.\n\n- `1`, `2`, `3` or `Tab`: switch between overview, proposals, and activity.\n- `↑` / `↓` or `k` / `j`: browse findings or scroll activity.\n- `Enter`: inspect the selected proposal, issue URL, scope, acceptance criteria, and review.\n- `Esc`: return from finding details. `Page Up` / `Page Down` scroll details.\n- `g` / `G`: jump to the start/end; `G` resumes following live activity.\n- `q` or `Ctrl+C`: stop the bot and its active agent, then restore the terminal.\n\nThe finding browser shows the latest 200 findings, while totals include all saved\nfindings. The activity view keeps recent output; full agent transcripts remain\nunder the state directory. On exit, a short summary and new finding URLs stay in\nthe terminal. `once` exits after its scan, and dry runs also print proposed finding\ndetails on exit.\n\nPiped input, redirected stderr, and `TERM=dumb` use scrolling output automatically.\n`--plain` and `--json` disable the dashboard and are mutually exclusive.\n`NO_COLOR` disables dashboard colors. `status`, `report`, `publish`, `version`, and help keep their\nexisting output and never open the dashboard.\n\n## How it works\n\n1. Fetch the target branch into a managed clone and make an isolated detached\n   worktree for the scan. The original checkout and uncommitted work are preserved.\n2. Download all open and closed issues and their comments with pagination. Give\n   the investigator the complete snapshot and recent scan summaries so it can\n   avoid known proposals and explore new areas on subsequent scans.\n3. Have the agent study project purpose, current workflows, source, docs, and tests.\n   Each candidate must include a specific user problem, current workflow or workaround,\n   proposed behavior, user value, scope and non-goals, testable acceptance criteria,\n   existing source paths, and evidence of both a gap and implementation feasibility.\n   The researcher must distinguish observations from assumptions and may return zero findings.\n4. Start separate LLM review sessions to verify the evidence and compare each\n   candidate against the issue history. Large histories are supplied in batches;\n   every issue and comment is included, and each response must identify all issue\n   numbers it reviewed. Coverage errors report the expected count and missing,\n   repeated, and unexpected numbers (up to 20 per category). A rejected coverage\n   receipt gets one corrective attempt with the required number set and validation\n   error. Successful batches are saved and reused after restart when their content,\n   candidate, and source revision still match; changed batches are reviewed again.\n   Exhausted corrections leave the candidate pending and block publication.\n   A duplicate verdict links the existing report in local\n   state. Uncertain and invalid findings are saved without filing.\n5. Refresh issues before publication. New or edited reports go back to the LLM\n   for comparison. Recheck the source commit and tracked files. An optional\n   operator verifier can provide an additional gate.\n6. Create issues sequentially, including scope, acceptance criteria, evidence, and the review\n   explanation. Each newly created issue is available to the next candidate's\n   LLM review, including candidates from the same scan.\n\nClosed issues count as known proposals, including implemented, duplicate, rejected,\nor wontfix features. A reconsideration belongs to that existing issue. The bot does\nnot reopen or comment on it. The reviewer independently checks that a feature is\nnot already supported and rejects bug fixes or refactors without a new capability.\n\nThe default is at most **three issues per scan**, a **two-hour attempt budget**,\nand another scan **30 minutes after completion**, even if the commit is unchanged.\nRecent summaries guide exploration; this is not a claim of exhaustive coverage.\n`once` runs or resumes one scan and exits. When an agent completes its research\nbut the final `FEATURE_RESULT` or `FEATURE_REVIEW` line is truncated, fenced, or\nfollowed by prose, the daemon asks the agent once to restate that receipt from\nits own answer before treating the attempt as failed; the restated receipt is\nvalidated exactly like a first-pass one. Failed scans retain their candidates,\nworkspace, and diagnostics; retries wait at least 15 minutes and run on the next\npoll, with three attempts before requiring `retry`. Agent setup errors stop the\ndaemon without consuming an attempt. An advanced branch invalidates pending\nfindings so the next eligible attempt scans the new commit.\n\n## Duplicate handling and interrupted requests\n\nSemantic duplicate detection is an LLM judgment, so it is not a guarantee.\nIncomplete history, malformed review responses, and uncertain comparisons stop\npublication. Same-title reports still reach the LLM: identical wording can hide\ndifferent capabilities, and different wording can describe the same feature.\n\nEvery planned issue gets a random request ID, saved **before** sending its create\nrequest and embedded as a hidden comment in the issue body. This ID identifies\none publication attempt; it is not derived from feature content or used to classify\nduplicates. After a crash or lost response, `bfb` looks for that ID and records\nthe existing issue. If its outcome is unknown and the ID is not visible, it\nrefuses to send another create request. Run `once` to try reconciliation again.\nIf it never appears, inspect GitHub and the saved state before repairing the\npending entry; `retry` intentionally cannot blindly resend an ambiguous request.\n\nConfirmed HTTP rejections, such as validation or permission failures, keep the\ncandidate pending. Correct the request or access problem, then run `once` to\nresume, or `retry --once` if the attempt budget is exhausted. Timeouts, server\nerrors, and incomplete responses still require marker reconciliation. Older\nversions saved every create error as ambiguous; those existing `posting` entries\nstill require inspection when no marker appears.\n\nA per-repository local lock coordinates instances across branches and config\npaths using the same state home. Different machines/accounts and simultaneous\nhuman reports cannot be locked atomically with GitHub issue creation. Run one\nactive `bfb` per repository to avoid that race.\n\n## Brokk Town worker service\n\n`bfb worker --socket PATH` serves one-shot feature research operations to Brokk\nTown over a private Unix-domain socket. The socket is mode `0600`; the endpoint is\nprivate to the local service, and the process exits after Town requests shutdown.\n\nWorker protocol v1 uses standard-library HTTP with JSON messages:\n\n- `GET /v1/initialize` returns the protocol range, bot identity, release version,\n  and capabilities. Town requires `feature-research` as well as common `run` and\n  `progress` capabilities. Workers supporting optional discovery controls also\n  advertise `feature-research-controls`.\n- `POST /v1/runs` accepts one strict JSON task and responds with contiguous\n  newline-delimited JSON events: `progress`, optional typed `result`,\n  and `error`, `canceled`, or `complete`.\n- `POST /v1/shutdown` asks the service to stop after the current stream.\n\nA run request may include the optional `feature_research` object alongside its\nrepository and agent settings, for example:\n\n```json\n{\n  \"protocol\": 1,\n  \"remote\": \"https://github.com/OWNER/REPO.git\",\n  \"branch\": \"main\",\n  \"directory\": \"/srv/bfb/checkout\",\n  \"state_directory\": \"/srv/bfb/state\",\n  \"repo\": \"OWNER/REPO\",\n  \"host\": \"github.com\",\n  \"agent\": {\"command\": [\"codex-acp\"]},\n  \"feature_research\": {\"focus\": \"onboarding\", \"max_issues\": 1}\n}\n```\n\n`focus` is a string and defaults to empty (unrestricted research). `max_issues`\nis an integer from 1 through 20 and defaults to 3 when omitted; explicit zero\nis invalid. Either field may be omitted, and each request starts with fresh\ndefaults. Unknown fields and incorrect types are rejected. A fresh discovery\nprompt receives these settings and its receipt may contain zero findings, but\ncannot exceed the maximum.\n\nThese options follow CLI `--focus` and `--max-issues` semantics: they control\ndiscovery. Resuming an already-discovered scan preserves its saved candidates;\nnew options do not redirect research, regenerate or truncate that saved work.\nReconciliation, independent review and publication gates continue to apply.\nClients must detect the capability and include the optional fields to use them.\n\nVersion and capability negotiation happen before work starts. Town does not read\nthis bot's private state files; issue and review outcomes are explicit protocol\nresults when applicable, while GitHub remains the durable source for receipts.\nThe schemas are independent of the Unix HTTP transport, allowing an authenticated\nTLS transport to be added later without changing worker semantics.\n\n## Optional configuration\n\n`bfb --config feature-bot.json` loads a strict JSON object. No file is loaded or\ngenerated implicitly. Paths are resolved relative to the configuration file.\nSee [feature-bot.example.json](feature-bot.example.json).\n\n```json\n{\n  \"remote\": \"https://github.com/OWNER/REPO.git\",\n  \"branch\": \"main\",\n  \"directory\": \"var/checkout\",\n  \"state_directory\": \"var/state\",\n  \"poll\": \"30m\",\n  \"timeout\": \"2h\",\n  \"retry_delay\": \"15m\",\n  \"attempts\": 3,\n  \"max_issues\": 3,\n  \"focus\": \"\",\n  \"labels\": [],\n  \"dry_run\": false,\n  \"agent\": {\"command\": [\"codex-acp\"]}\n}\n```\n\nLabels are optional and added only to new issues; they never filter the history.\nUse labels that already exist in the target repository. `github.host` supports\nEnterprise, and `github.repo` (`OWNER/REPO`) identifies a local mirror's GitHub\nrepository. `agent` also supports `environment`, `auth_method`, `mode`, `model`,\nand `effort`, with selection handled by the shared ACP runner.\n\nResearch uses `agent.model` and `agent.effort` (`--model`, `--effort`) for\ndiscovery and discovery receipt recovery. Independent review uses\n`review_model` and `review_effort` (`--review-model`, `--review-effort`) for\nevery review batch, coverage correction and review receipt recovery, including\npending candidates resumed from a saved scan. Each omitted review setting\ninherits its research setting; CLI flags override JSON, and blank values are\nrejected. Review runs with the same agent command, environment, authentication,\nmode, workspace, timeout and publication gates. The ACP adapter defines which\nmodel IDs and effort values exist: a review model or effort it does not offer\nstops with a setup error naming the review setting before any review prompt,\nkeeps discovered candidates pending, creates no issue and never falls back to\nthe research settings. Saved review progress records the effective review model\nand effort; changing either, or resuming progress saved before this identity\nwas recorded, reviews pending candidates again from validation through every\nissue batch without repeating discovery. A review setup failure has already\nreplaced saved review progress with the failed selection, so reverting the\nsetting afterwards also restarts validation. Logs mark `stage=discovery` or\n`stage=review` with the effective model and effort.\n\n`verify` accepts an argument array, such as `[\"/opt/checks/verify-feature\"]`, executed\nin the scan worktree with `FEATURE_COMMIT` and JSON `FEATURE_FINDING` in its environment.\nKeep operator verifiers outside the writable worktree. A nonzero exit blocks filing.\n\n## State and execution\n\nState defaults to `$XDG_STATE_HOME/feature-bot` or `~/.local/state/feature-bot`, keyed by\nremote and branch. JSON state is replaced atomically with fsync; private session\ntranscripts live under the state directory. `status` prints saved JSON without\nstarting an agent. `--json` selects structured progress logs.\n\n### Saved proposal reports\n\n`report` writes Markdown to stdout for every saved completed and active candidate,\nincluding findings beyond the dashboard's 200-entry limit. It includes repository,\nbranch, saved status, available issue or duplicate URL, proposal fields, and\nindependent review. Redirect stdout to save or share it:\n\n```sh\nbfb report --config feature-bot.json > proposals.md\nbfb report --config feature-bot.json --status dry_run > dry-run-proposals.md\nbfb report /path/to/repo --branch master > proposals.md\n```\n\nOmit `--status` to include all candidates. Supported filters are `pending`,\n`posting`, `submitted`, `duplicate`, `uncertain`, `invalid`, `dry_run`, and `stale`.\nMissing state or a filter with no matches produces an explicit no-findings report.\n\nReporting only reads saved state: it starts no scan or agent and does not require\n`gh` or an ACP executable. Explicit configuration permits fully local reading;\nwith repository discovery, pass `--branch` to avoid a default-branch network\nlookup. Use the same configuration and branch as the original run.\nCandidates discovered by this release record the commit at which their cited\nfiles were validated, shown as `Researched at commit`; candidates saved by older\nreleases have no commit and are never attributed to another scan's commit.\nInternal workspace paths, transcripts, and publication markers are not included\nas metadata. Proposal and review prose is preserved as Markdown;\nreview that content before sharing it.\n\n### Publish a saved dry-run proposal\n\nAfter inspecting dry-run proposals, list their selectors and publish exactly one:\n\n```sh\nbfb publish --config feature-bot.json --list\nbfb publish --config feature-bot.json --proposal 3fa2b1c0d9e8\n```\n\n`--list` reads saved state only, like `report`: it starts no agent, fetch or\nGitHub request. Each row shows a stable 12-character selector, eligibility, the\nrecorded source commit and the title. Selectors are derived from the saved\ncandidate and do not change across restarts; they do not reveal publication markers.\n\n`--proposal` processes only the selected proposal and never starts discovery.\nIt fetches the branch and refuses unless the branch is still at the proposal's\nrecorded commit, then prepares an isolated worktree at that commit, checks\nthe cited source files, and runs a fresh independent review against all open\nand closed issues and discussions. The dry run's review progress is discarded\non selection. The configured verifier, the tracked-content check, the\npre-publication history refresh and the saved posting intent all apply as in a\nscan. A `dry_run` setting in the configuration is ignored by `publish`, and\n`--dry-run` is rejected. Other saved proposals are unchanged.\n\n- Success records the issue URL and `submitted` status. Repeating the command\n  prints the saved URL without reviewing or creating anything.\n- A duplicate, uncertain or invalid verdict prevents creation, saves that status\n  and the review explanation, and exits non-zero.\n- An incomplete review, verifier failure, changed tracked content, missing cited\n  file or confirmed create rejection keeps the proposal `dry_run` and saves the\n  selection with its failure. Run the same command to retry in the same\n  worktree; review batches already completed for this selection are reused.\n  Selecting a different proposal abandons an unfinished selection that has not\n  sent a create request. If a saved outcome was not yet retired when the\n  process stopped, the command reports it and never reviews or creates again.\n- A branch that advanced before or during publication refuses it. The proposal\n  is not adapted to the newer revision and no replacement discovery starts;\n  research again with `bfb once --dry-run`.\n- A lost create response keeps the `posting` state and the proposal's request\n  ID. Running the command again reconciles the hidden marker and never sends\n  another create request; another proposal cannot be selected until then. This\n  reconciliation also runs while a scan is active. An existing issue that\n  already carries the marker, such as a hand-copied dry-run body, is never\n  claimed: the proposal is saved as a `duplicate` of it and nothing is created.\n- Proposals saved by older releases have no recorded commit. They remain\n  readable in reports but are refused; research them again with a new dry run.\n\nPublishing (other than reconciling an unknown outcome) is refused while a scan\nis active (`once` or the daemon has unfinished work), and it takes the same\nrepository locks as a scan. Each selection owns one isolated worktree. When the\nselection is resolved or replaced, that worktree is recorded for `prune`, which\nremoves it only if it is clean at the recorded commit.\n\n### Reclaim completed scan workspaces\n\nScan worktrees and research files are retained for inspection. Preview old\nsuccessfully completed workspaces, then explicitly apply removal:\n\n```sh\nbfb prune --config feature-bot.json --older-than 720h\nbfb prune --config feature-bot.json --older-than 720h --apply\n```\n\nA successful scan records its workspace, scanned commit and completion time,\nincluding zero-finding and dry-run scans. The positive duration is required;\nonly scans completed strictly before the cutoff qualify. Preview lists eligible\nworkspaces, explains skipped records and changes neither worktrees nor saved\nstate. Apply uses Git worktree removal, **including untracked and ignored\nresearch artifacts**. Saved proposals, reviews, issue URLs, history and\ntranscripts are preserved.\n\nPruning takes the same repository, state and checkout locks as research and\nrefuses to run while research holds them. It checks workspace containment, Git\nownership, detached HEAD, the recorded commit, tracked or staged changes and\nGit locks. Active scans (including exhausted retries and unresolved\npublication), failed or discarded scans, and workspaces without completion\nrecords are never removed. Symlinked paths, foreign, modified or locked\nworktrees are skipped. Interrupted cleanup can be rerun: a missing directory\nhas only its matching Git registration removed, and a record is retired once\nboth are gone. A directory an interrupted removal left without its `.git` file\nis deleted, and its registration removed, only when the private index matches\nthe recorded commit and no remaining tracked file was modified. Otherwise it is\nskipped; inspect it, keep what you need, then delete the directory and rerun\nprune, which removes the registration once its index holds no staged changes\n(or run `git -C CHECKOUT worktree remove --force DIRECTORY` yourself). A failed\nremoval, or a skip caused by a Git or filesystem error rather than a policy,\nkeeps its record and makes the command exit non-zero after the remaining\nworkspaces are processed.\n\nPruning requires Git 2.36 or newer. Inherited `GIT_DIR`, `GIT_WORK_TREE`,\n`GIT_INDEX_FILE` and similar repository overrides are ignored. With explicit\nconfiguration, pruning needs local Git and performs no fetch,\nGitHub request or agent execution; `gh` and an ACP executable are not required.\nRepository discovery may look up the default branch; pass `--branch` to avoid\nthat lookup. Use the same configuration and branch as the original scan.\nWorkspaces from releases before completion records, and transcripts, remain\nexternally managed; pruning never runs `git gc`.\n\n### Agent boundaries\n\nAgent instructions prohibit feature implementation, fixes,\ncommits, pushes, and direct GitHub writes; tracked source changes or a changed\nHEAD invalidate the scan. Evidence is independently reviewed by the LLM, not\nproof that tests are correct. As in the sibling bots, ACP permission requests\nare automatically approved and agent commands run with the account's OS rights.\nThis is not a sandbox; use an appropriate account/container for the repository.\n\n## Development and packaging\n\n```sh\nmake check build\n./bin/bfb --help\npython3 -m unittest discover -s scripts -p '*_test.py'\nnode --test --test-isolation=none npm/bfb.test.cjs\n```\n\nTests use local Git fixtures and simulated ACP/GitHub outcomes; they do not run\na paid model or create real issues. They cover semantic closed duplicates,\nsame-title distinct features, rejected proposals, uncertain value or feasibility,\nfeature receipt completeness, concurrent reports, partial histories, source changes,\ndry runs, retries, ambiguous POSTs, receipt coverage, configuration, locks, progress snapshots, dashboard resizing, and terminal cleanup.\n\nThe inherited release workflow packages Linux/macOS amd64/arm64 archives with\nchecksums. The npm launcher and packaging workflow target `@brokkai/feature-bot`\nand install `bfb`. See [RELEASING.md](RELEASING.md) for publication and verification.\n\nAPI references: [GitHub issues](https://docs.github.com/en/rest/issues/issues),\n[issue comments](https://docs.github.com/en/rest/issues/comments).\n## Automatic releases\n\nPush a new `v*` version tag to run the complete **Publish packages** pipeline:\nLinux/macOS checks, native GitHub assets, then all five npm packages from the\nsame tag and commit. No manual package dispatch is needed. The package job runs\nonly after native publication succeeds and validates package contents and local\ninstalls before uploading. It does not wait for npm's public index to update.\n\nFor recovery, rerun failed jobs or manually dispatch `publish-packages.yml` from\nthe exact existing tag with `publish=true`. The default manual `publish=false`\nvalidates without uploading. Existing published bytes must match on retry.\nSee [RELEASING.md](RELEASING.md) for details.\n\n## Contributing\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md) and our\n[Code of Conduct](CODE_OF_CONDUCT.md). Report vulnerabilities privately using\n[SECURITY.md](SECURITY.md).\n\n## License\n\nLicensed under [Apache-2.0](LICENSE). See [NOTICE](NOTICE) for project\nattribution and [licenses/README.md](licenses/README.md) for dependency terms,\nthird-party notices, and the license review process.\n","readmeFilename":"README.md"}