<!-- loopover:miner-release-due --> ## Summary A @loopover/miner release appears due. - Proposed version: `3.15.0` - Latest tag: `miner-v3.14.1` - npm latest: `3.14.1` - Package version in repo: `3.14.1` - Unreleased miner-related commits: `22` ## Unreleased Commits - `e58d910` build: delete both browser\-extension packages and their shared build/CI/npm\-script wiring \(\#8603\) - `a9d9c0e` feat\(selfhost\): PostHog AI observability across ORB and AMS \(\#8623\) - `ee390f5` fix\(miner\): resolve status\.ts's monorepo\-sibling paths at the compiled dist/lib depth \(\#8636\) - `1cc2146` fix\(miner\): delete the orphaned portfolio chat\-action duplicate \(\#8662\) - `713145f` fix\(miner\): include laptop\-state in doctor integrity and migrate store lists \(\#8749\) - `7b2104d` fix\(miner\): drop stale ProcessEnv casts on resolveReplaySnapshotDbPath \(\#8768\) - `d5ec15a` fix\(miner\): refuse a duplicate attempt when this miner already has an open PR for the exact issue \(\#8808\) \(\#8815\) - `33bacda` feat\(miner\): wire deny\-hook synthesis to a live consumer and give it an operator CLI \(\#8806\) \(\#8817\) - `e10abf2` feat\(miner\): run the target repo's own test/lint/build commands before opening a PR \(\#8819\) - `eab6ecf` fix\(miner\): reclaim orphaned worktree allocations on every acquire\(\) \(\#8918\) - `898cdcb` ams: reconcile README/DEPLOYMENT local\-storage inventory \-\- two real SQLite stores are undocumented \(\#8923\) - `1eeaae1` fix\(miner\): printHelp\(\) omits the working \`deny\-hooks\` subcommand \(\#8933\) - `4dfe15d` fix\(miner\): fall back to global config\.apiUrl in loopoverApiUrl \(\#8937\) - `32ee72e` fix\(miner\): reject a portfolio\-queue identifier containing the '::' composite\-id separator \(\#8925\) - `6aaea39` fix\(engine\): treat an Infinity WIP cap as uncapped, not collapsed to 0 \(\#8945\) - `266b07d` fix\(miner\): fail acquire\(\) on an attempt\_id/repo mismatch \(\#8964\) - `987f7ce` fix\(miner\): self\-review\-context never supplies recent\-merged\-PR history, contradicting its own "same fidelity" claim \(\#8969\) - `3369ebc` fix\(miner\): AmsPolicySpec parse warnings are computed but never surfaced to the operator \(\#8978\) - `62e6d25` fix\(miner\): governor reputation\-history read\-modify\-write is unguarded, unlike sibling scalar\-state writes \(\#8988\) - `49a27c2` fix\(miner\): governor\-chokepoint\-persisted's load\-evaluate\-save cycle isn't atomic \(\#8993\) - `7fd84ff` feat\(orb\): salvageability axis — hold fixable, well\-authored PRs instead of one\-shot\-closing \(\#8986\) - `8444812` fix\(miner\): compare\-and\-set the orphan reclaim so a stale probe cannot free a live re\-acquired slot \(\#8992\) ## Changed Files - `.claude/skills/contributing-to-loopover/reference.md` - `.claude/skills/contributing-to-loopover/SKILL.md` - `.claude/skills/contributor-pipeline-gardening/reference.md` - `.github/actions/deploy-ui-preview/action.yml` - `.github/workflows/ci.yml` - `.github/workflows/ui-deploy.yml` - `.gitignore` - `.loopover.yml.example` - `apps/loopover-extension/.gitignore` - `apps/loopover-extension/auth.js` - `apps/loopover-extension/background.js` - `apps/loopover-extension/content.js` - `apps/loopover-extension/manifest.json` - `apps/loopover-extension/options.html` - `apps/loopover-extension/options.js` - `apps/loopover-extension/package.json` - `apps/loopover-extension/styles.css` - `apps/loopover-miner-extension/.gitignore` - `apps/loopover-miner-extension/background.js` - `apps/loopover-miner-extension/content.js` - `apps/loopover-miner-extension/icons/icon-128.png` - `apps/loopover-miner-extension/icons/icon-16.png` - `apps/loopover-miner-extension/icons/icon-32.png` - `apps/loopover-miner-extension/icons/icon-48.png` - `apps/loopover-miner-extension/manifest.json` - `apps/loopover-miner-extension/opportunity-badge.js` - `apps/loopover-miner-extension/options.html` - `apps/loopover-miner-extension/options.js` - `apps/loopover-miner-extension/package.json` - `apps/loopover-miner-extension/README.md` - `apps/loopover-miner-extension/styles.css` - `apps/loopover-miner-extension/test/background.test.ts` - `apps/loopover-miner-extension/test/content.test.ts` - `apps/loopover-miner-extension/test/helpers.ts` - `apps/loopover-miner-extension/test/opportunity-badge.test.ts` - `apps/loopover-miner-extension/test/options.test.ts` - `apps/loopover-miner-extension/test/toolbar-badge.test.ts` - `apps/loopover-miner-extension/toolbar-badge.d.ts` - `apps/loopover-miner-extension/toolbar-badge.js` - `apps/loopover-miner-extension/vitest.config.ts` - `apps/loopover-miner-ui/README.md` - `apps/loopover-miner-ui/src/lib/chat-portfolio-queue-actions.test.tsx` - `apps/loopover-miner-ui/src/lib/ranked-candidates.ts` - `apps/loopover-miner-ui/src/routes/ranked-candidates.tsx` - `apps/loopover-miner-ui/vite-ranked-candidates-api.ts` - `apps/loopover-ui/content/docs/maintainer-install-trust.mdx` - `apps/loopover-ui/content/docs/self-hosting-operations.mdx` - `apps/loopover-ui/public/openapi.json` - `apps/loopover-ui/src/lib/ams-env-reference.ts` - `config/examples/loopover.full.yml` - `CONTRIBUTING.md` - `docs/decision-audit-rubric.md` - `package-lock.json` - `package.json` - `packages/loopover-engine/package.json` - `packages/loopover-engine/src/focus-manifest.ts` - `packages/loopover-engine/src/portfolio/queue.ts` - `packages/loopover-miner/bin/loopover-miner-mcp.ts` - `packages/loopover-miner/bin/loopover-miner.ts` - `packages/loopover-miner/DEPLOYMENT.md` - `packages/loopover-miner/docs/env-reference.md` - `packages/loopover-miner/expected-engine.version` - `packages/loopover-miner/lib/ams-policy.ts` - `packages/loopover-miner/lib/attempt-cli.ts` - `packages/loopover-miner/lib/attempt-runner.ts` - `packages/loopover-miner/lib/chat-action-registry.ts` - `packages/loopover-miner/lib/chat-discover-attempt-actions.ts` - `packages/loopover-miner/lib/chat-portfolio-actions.ts` - `packages/loopover-miner/lib/cli.ts` - `packages/loopover-miner/lib/coding-agent-construction.ts` - `packages/loopover-miner/lib/deny-hooks-cli.ts` - `packages/loopover-miner/lib/discover-cli.ts` - `packages/loopover-miner/lib/egress-allowlist.ts` - `packages/loopover-miner/lib/github-token-resolution.ts` - `packages/loopover-miner/lib/governor-chokepoint-persisted.ts` - `packages/loopover-miner/lib/governor-state.ts` - `packages/loopover-miner/lib/laptop-init.ts` - `packages/loopover-miner/lib/loop-cli.ts` - `packages/loopover-miner/lib/migrate-cli.ts` - `packages/loopover-miner/lib/portfolio-dashboard.ts` - `packages/loopover-miner/lib/portfolio-queue-manager.ts` - `packages/loopover-miner/lib/portfolio-queue.ts` - `packages/loopover-miner/lib/posthog.ts` - `packages/loopover-miner/lib/ranked-candidates.ts` - `packages/loopover-miner/lib/rejection-signal.ts` - `packages/loopover-miner/lib/self-review-context.ts` - `packages/loopover-miner/lib/status.ts` - `packages/loopover-miner/lib/target-repo-verification.ts` - `packages/loopover-miner/lib/worktree-allocator.ts` - `packages/loopover-miner/README.md` - `scripts/build-extension.ts` - `scripts/build-miner-extension.ts` - `scripts/check-docs-drift.ts` - `scripts/extension-zip-core.ts` - `scripts/mcp-release-core.ts` - `scripts/orb-release-core.ts` - `scripts/smoke-production.ts` - `scripts/smoke-ui-browser.ts` - `src/openapi/schemas.ts` - `src/queue/gate-checks.ts` - `src/queue/processors.ts` - `src/review/decision-record.ts` - `src/review/salvageability-wire.ts` - `src/review/salvageability.ts` - `src/rules/advisory.ts` - `src/selfhost/ai.ts` - `src/selfhost/posthog.ts` - `src/server.ts` - `src/signals/focus-manifest.ts` - `src/types.ts` - `test/fixtures/miner-concurrent-stores/chokepoint-child.mjs` - `test/fixtures/miner-concurrent-stores/increment-reputation-child.mjs` - `test/fixtures/miner-worktree-allocator/acquire-child.mjs` - `test/unit/backfill-decision-labels-core.test.ts` - `test/unit/build-extension-zip-script.test.ts` - `test/unit/ci-extension-packages.test.ts` - `test/unit/ci-ui-build-openapi.test.ts` - `test/unit/codecov-policy.test.ts` - `test/unit/decision-record.test.ts` - `test/unit/extension-auth.test.ts` - `test/unit/extension-background.test.ts` - `test/unit/extension-content.test.ts` - `test/unit/extension-options.test.ts` - `test/unit/focus-manifest.test.ts` - `test/unit/gate-check-policy.test.ts` - `test/unit/miner-ams-policy.test.ts` - `test/unit/miner-attempt-cli.test.ts` - `test/unit/miner-attempt-runner.test.ts` - `test/unit/miner-chat-portfolio-actions.test.ts` - `test/unit/miner-cli.test.ts` - `test/unit/miner-coding-agent-construction.test.ts` - `test/unit/miner-concurrent-store-races.test.ts` - `test/unit/miner-deny-hooks-cli.test.ts` - `test/unit/miner-egress-allowlist.test.ts` - `test/unit/miner-extension-content.test.ts` - `test/unit/miner-extension-icons.test.ts` - `test/unit/miner-extension-live-fetch.test.ts` - `test/unit/miner-github-token-resolution.test.ts` - `test/unit/miner-governor-chokepoint-persisted.test.ts` - `test/unit/miner-governor-state.test.ts` - `test/unit/miner-local-store-readme.test.ts` - `test/unit/miner-loop-cli.test.ts` - `test/unit/miner-migrate-cli.test.ts` - `test/unit/miner-portfolio-queue-manager.test.ts` - `test/unit/miner-posthog.test.ts` - `test/unit/miner-rejection-signal.test.ts` - `test/unit/miner-self-review-context.test.ts` - `test/unit/miner-status.test.ts` - `test/unit/miner-target-repo-verification.test.ts` - `test/unit/miner-toolbar-badge.test.ts` - `test/unit/miner-worktree-allocator-collisions.test.ts` - `test/unit/miner-worktree-allocator-lease-expiry.test.ts` - `test/unit/miner-worktree-allocator.test.ts` - `test/unit/portfolio-queue.test.ts` - `test/unit/queue-2.test.ts` - `test/unit/queue.test.ts` - `test/unit/salvageability.test.ts` - `test/unit/selfhost-ai.test.ts` - `test/unit/selfhost-posthog.test.ts` - `turbo.json` ## Release-Prep Checklist - [ ] Bump `packages/loopover-miner/package.json` to `3.15.0` - [ ] Run `npm run build --workspace @loopover/miner` - [ ] Run `npm run test:miner-pack` - [ ] Run `npm run actionlint` - [ ] Merge the release-please PR (it maintains this package's CHANGELOG.md natively) - [ ] Tag `miner-v3.15.0` - [ ] Watch npm trusted publishing and the GitHub Release job
Summary
A @loopover/miner release appears due.
3.15.0miner-v3.14.13.14.13.14.122Unreleased Commits
e58d910build: delete both browser-extension packages and their shared build/CI/npm-script wiring (build: delete both browser-extension packages and their shared build/CI/npm-script wiring #8603)a9d9c0efeat(selfhost): PostHog AI observability across ORB and AMS (feat(selfhost): PostHog AI observability across ORB and AMS #8623)ee390f5fix(miner): resolve status.ts's monorepo-sibling paths at the compiled dist/lib depth (fix(miner): resolve status.ts's monorepo-sibling paths at the compiled dist/lib depth #8636)1cc2146fix(miner): delete the orphaned portfolio chat-action duplicate (fix(miner): delete the orphaned portfolio chat-action duplicate #8662)713145ffix(miner): include laptop-state in doctor integrity and migrate store lists (fix(miner): include laptop-state in doctor integrity and migrate store lists #8749)7b2104dfix(miner): drop stale ProcessEnv casts on resolveReplaySnapshotDbPath (fix(miner): drop stale ProcessEnv casts on resolveReplaySnapshotDbPath #8768)d5ec15afix(miner): refuse a duplicate attempt when this miner already has an open PR for the exact issue (fix(miner): pre-attempt idempotency check against the miner's own open PR for the same issue — stop crash-retry double-opens #8808) (fix(miner): refuse a duplicate attempt when this miner already has an open PR for the exact issue #8815)33bacdafeat(miner): wire deny-hook synthesis to a live consumer and give it an operator CLI (fix(miner): deny-hook synthesis has zero live consumers — approved guardrail rules never reach a coding agent #8806) (feat(miner): wire deny-hook synthesis to a live consumer and give it an operator CLI #8817)e10abf2feat(miner): run the target repo's own test/lint/build commands before opening a PR (feat(miner): run the target repo's own test/lint/build commands before opening a PR #8819)eab6ecffix(miner): reclaim orphaned worktree allocations on every acquire() (fix(miner): reclaim orphaned worktree allocations on every acquire() #8918)898cdcbams: reconcile README/DEPLOYMENT local-storage inventory -- two real SQLite stores are undocumented (ams: reconcile README/DEPLOYMENT local-storage inventory -- two real SQLite stores are undocumented #8923)1eeaae1fix(miner): printHelp() omits the working `deny-hooks` subcommand (fix(miner): printHelp() omits the workingdeny-hookssubcommand #8933)4dfe15dfix(miner): fall back to global config.apiUrl in loopoverApiUrl (fix(miner): fall back to global config.apiUrl in loopoverApiUrl #8937)32ee72efix(miner): reject a portfolio-queue identifier containing the '::' composite-id separator (fix(miner): reject a portfolio-queue identifier containing the '::' composite-id separator (#8857) #8925)6aaea39fix(engine): treat an Infinity WIP cap as uncapped, not collapsed to 0 (fix(engine): treat an Infinity WIP cap as uncapped, not collapsed to 0 (#8861) #8945)266b07dfix(miner): fail acquire() on an attempt_id/repo mismatch (fix(miner): fail acquire() on an attempt_id/repo mismatch #8964)987f7cefix(miner): self-review-context never supplies recent-merged-PR history, contradicting its own "same fidelity" claim (fix(miner): self-review-context never supplies recent-merged-PR history, contradicting its own "same fidelity" claim #8969)3369ebcfix(miner): AmsPolicySpec parse warnings are computed but never surfaced to the operator (fix(miner): AmsPolicySpec parse warnings are computed but never surfaced to the operator #8978)62e6d25fix(miner): governor reputation-history read-modify-write is unguarded, unlike sibling scalar-state writes (fix(miner): governor reputation-history read-modify-write is unguarded, unlike sibling scalar-state writes #8988)49a27c2fix(miner): governor-chokepoint-persisted's load-evaluate-save cycle isn't atomic (fix(miner): governor-chokepoint-persisted's load-evaluate-save cycle isn't atomic #8993)7fd84fffeat(orb): salvageability axis — hold fixable, well-authored PRs instead of one-shot-closing (feat(orb): salvageability axis — hold fixable, well-authored PRs instead of one-shot-closing #8986)8444812fix(miner): compare-and-set the orphan reclaim so a stale probe cannot free a live re-acquired slot (fix(miner): compare-and-set the orphan reclaim so a stale probe cannot free a live re-acquired slot #8992)Changed Files
.claude/skills/contributing-to-loopover/reference.md.claude/skills/contributing-to-loopover/SKILL.md.claude/skills/contributor-pipeline-gardening/reference.md.github/actions/deploy-ui-preview/action.yml.github/workflows/ci.yml.github/workflows/ui-deploy.yml.gitignore.loopover.yml.exampleapps/loopover-extension/.gitignoreapps/loopover-extension/auth.jsapps/loopover-extension/background.jsapps/loopover-extension/content.jsapps/loopover-extension/manifest.jsonapps/loopover-extension/options.htmlapps/loopover-extension/options.jsapps/loopover-extension/package.jsonapps/loopover-extension/styles.cssapps/loopover-miner-extension/.gitignoreapps/loopover-miner-extension/background.jsapps/loopover-miner-extension/content.jsapps/loopover-miner-extension/icons/icon-128.pngapps/loopover-miner-extension/icons/icon-16.pngapps/loopover-miner-extension/icons/icon-32.pngapps/loopover-miner-extension/icons/icon-48.pngapps/loopover-miner-extension/manifest.jsonapps/loopover-miner-extension/opportunity-badge.jsapps/loopover-miner-extension/options.htmlapps/loopover-miner-extension/options.jsapps/loopover-miner-extension/package.jsonapps/loopover-miner-extension/README.mdapps/loopover-miner-extension/styles.cssapps/loopover-miner-extension/test/background.test.tsapps/loopover-miner-extension/test/content.test.tsapps/loopover-miner-extension/test/helpers.tsapps/loopover-miner-extension/test/opportunity-badge.test.tsapps/loopover-miner-extension/test/options.test.tsapps/loopover-miner-extension/test/toolbar-badge.test.tsapps/loopover-miner-extension/toolbar-badge.d.tsapps/loopover-miner-extension/toolbar-badge.jsapps/loopover-miner-extension/vitest.config.tsapps/loopover-miner-ui/README.mdapps/loopover-miner-ui/src/lib/chat-portfolio-queue-actions.test.tsxapps/loopover-miner-ui/src/lib/ranked-candidates.tsapps/loopover-miner-ui/src/routes/ranked-candidates.tsxapps/loopover-miner-ui/vite-ranked-candidates-api.tsapps/loopover-ui/content/docs/maintainer-install-trust.mdxapps/loopover-ui/content/docs/self-hosting-operations.mdxapps/loopover-ui/public/openapi.jsonapps/loopover-ui/src/lib/ams-env-reference.tsconfig/examples/loopover.full.ymlCONTRIBUTING.mddocs/decision-audit-rubric.mdpackage-lock.jsonpackage.jsonpackages/loopover-engine/package.jsonpackages/loopover-engine/src/focus-manifest.tspackages/loopover-engine/src/portfolio/queue.tspackages/loopover-miner/bin/loopover-miner-mcp.tspackages/loopover-miner/bin/loopover-miner.tspackages/loopover-miner/DEPLOYMENT.mdpackages/loopover-miner/docs/env-reference.mdpackages/loopover-miner/expected-engine.versionpackages/loopover-miner/lib/ams-policy.tspackages/loopover-miner/lib/attempt-cli.tspackages/loopover-miner/lib/attempt-runner.tspackages/loopover-miner/lib/chat-action-registry.tspackages/loopover-miner/lib/chat-discover-attempt-actions.tspackages/loopover-miner/lib/chat-portfolio-actions.tspackages/loopover-miner/lib/cli.tspackages/loopover-miner/lib/coding-agent-construction.tspackages/loopover-miner/lib/deny-hooks-cli.tspackages/loopover-miner/lib/discover-cli.tspackages/loopover-miner/lib/egress-allowlist.tspackages/loopover-miner/lib/github-token-resolution.tspackages/loopover-miner/lib/governor-chokepoint-persisted.tspackages/loopover-miner/lib/governor-state.tspackages/loopover-miner/lib/laptop-init.tspackages/loopover-miner/lib/loop-cli.tspackages/loopover-miner/lib/migrate-cli.tspackages/loopover-miner/lib/portfolio-dashboard.tspackages/loopover-miner/lib/portfolio-queue-manager.tspackages/loopover-miner/lib/portfolio-queue.tspackages/loopover-miner/lib/posthog.tspackages/loopover-miner/lib/ranked-candidates.tspackages/loopover-miner/lib/rejection-signal.tspackages/loopover-miner/lib/self-review-context.tspackages/loopover-miner/lib/status.tspackages/loopover-miner/lib/target-repo-verification.tspackages/loopover-miner/lib/worktree-allocator.tspackages/loopover-miner/README.mdscripts/build-extension.tsscripts/build-miner-extension.tsscripts/check-docs-drift.tsscripts/extension-zip-core.tsscripts/mcp-release-core.tsscripts/orb-release-core.tsscripts/smoke-production.tsscripts/smoke-ui-browser.tssrc/openapi/schemas.tssrc/queue/gate-checks.tssrc/queue/processors.tssrc/review/decision-record.tssrc/review/salvageability-wire.tssrc/review/salvageability.tssrc/rules/advisory.tssrc/selfhost/ai.tssrc/selfhost/posthog.tssrc/server.tssrc/signals/focus-manifest.tssrc/types.tstest/fixtures/miner-concurrent-stores/chokepoint-child.mjstest/fixtures/miner-concurrent-stores/increment-reputation-child.mjstest/fixtures/miner-worktree-allocator/acquire-child.mjstest/unit/backfill-decision-labels-core.test.tstest/unit/build-extension-zip-script.test.tstest/unit/ci-extension-packages.test.tstest/unit/ci-ui-build-openapi.test.tstest/unit/codecov-policy.test.tstest/unit/decision-record.test.tstest/unit/extension-auth.test.tstest/unit/extension-background.test.tstest/unit/extension-content.test.tstest/unit/extension-options.test.tstest/unit/focus-manifest.test.tstest/unit/gate-check-policy.test.tstest/unit/miner-ams-policy.test.tstest/unit/miner-attempt-cli.test.tstest/unit/miner-attempt-runner.test.tstest/unit/miner-chat-portfolio-actions.test.tstest/unit/miner-cli.test.tstest/unit/miner-coding-agent-construction.test.tstest/unit/miner-concurrent-store-races.test.tstest/unit/miner-deny-hooks-cli.test.tstest/unit/miner-egress-allowlist.test.tstest/unit/miner-extension-content.test.tstest/unit/miner-extension-icons.test.tstest/unit/miner-extension-live-fetch.test.tstest/unit/miner-github-token-resolution.test.tstest/unit/miner-governor-chokepoint-persisted.test.tstest/unit/miner-governor-state.test.tstest/unit/miner-local-store-readme.test.tstest/unit/miner-loop-cli.test.tstest/unit/miner-migrate-cli.test.tstest/unit/miner-portfolio-queue-manager.test.tstest/unit/miner-posthog.test.tstest/unit/miner-rejection-signal.test.tstest/unit/miner-self-review-context.test.tstest/unit/miner-status.test.tstest/unit/miner-target-repo-verification.test.tstest/unit/miner-toolbar-badge.test.tstest/unit/miner-worktree-allocator-collisions.test.tstest/unit/miner-worktree-allocator-lease-expiry.test.tstest/unit/miner-worktree-allocator.test.tstest/unit/portfolio-queue.test.tstest/unit/queue-2.test.tstest/unit/queue.test.tstest/unit/salvageability.test.tstest/unit/selfhost-ai.test.tstest/unit/selfhost-posthog.test.tsturbo.jsonRelease-Prep Checklist
packages/loopover-miner/package.jsonto3.15.0npm run build --workspace @loopover/minernpm run test:miner-packnpm run actionlintminer-v3.15.0