{"items":[{"number":236,"title":"Regenerate derived files in the commit-build helper, refuse a CI-reddening commit","url":"https://github.com/fulcrumaxe/fulcrumaxe/pull/236","state":"MERGED","createdAt":"2026-09-19T19:13:00Z","mergedAt":"2026-09-19T19:30:58Z","closedAt":"2026-09-19T19:30:58Z","mergeMinutes":18,"additions":941,"deletions":31,"changedFiles":4,"commits":1,"labels":["code-review-passed"],"gates":["Code review"],"summary":"Every code-plane commit goes through scripts/lib/code-plane-pr.sh, but the derived-file checks (engine-manifest-guard.py, the commands/agents twin guard, ruff-ratchet.py) only ever ran in CI, after a PR was already open. That's cost several PRs a full fix-and-…","comments":1,"sentBack":false,"scopeDrift":false,"ci":{"state":"SUCCESS","total":9,"passed":8,"failed":0,"skipped":1,"distinct":9,"superseded":0,"supersededFailures":0,"resolved":true,"wallSeconds":358},"touched":["engine/manifest.json","scripts/ci/ruff-ratchet.py","scripts/lib/code-plane-pr.sh"]},{"number":235,"title":"State epic breakdown rules in the PM role card and Spec template","url":"https://github.com/fulcrumaxe/fulcrumaxe/pull/235","state":"MERGED","createdAt":"2026-09-19T18:16:37Z","mergedAt":"2026-09-19T18:30:38Z","closedAt":"2026-09-19T18:30:38Z","mergeMinutes":14,"additions":44,"deletions":1,"changedFiles":4,"commits":1,"labels":["code-review-passed"],"gates":["Code review"],"summary":"Adds an \"Epic Breakdown\" section to the project-manager role card and a matching frontmatter-guidance section to its spawn template, for the case where a topic is broken into an epic of several task files rather than written up as a single Spec. Three rules, s…","comments":1,"sentBack":false,"scopeDrift":false,"ci":{"state":"SUCCESS","total":9,"passed":8,"failed":0,"skipped":1,"distinct":9,"superseded":0,"supersededFailures":0,"resolved":true,"wallSeconds":358},"touched":[".claude/agents/project-manager.md","agents/project-manager.md","backend/spawn_templates/project-manager.tmpl"]},{"number":234,"title":"Rewrite epic task importer for the v1 schema","url":"https://github.com/fulcrumaxe/fulcrumaxe/pull/234","state":"MERGED","createdAt":"2026-09-19T18:12:03Z","mergedAt":"2026-09-19T18:45:32Z","closedAt":"2026-09-19T18:45:32Z","mergeMinutes":33,"additions":1281,"deletions":1017,"changedFiles":3,"commits":2,"labels":["code-review-passed"],"gates":["Code review"],"summary":"Rewrites the epic-task-file importer to speak the v1 task-file schema (schema_version: 1) alongside the legacy v0 format, and fixes several correctness gaps in the process. What changed: Frontmatter is now parsed exclusively through backend.task_file (the shar…","comments":1,"sentBack":false,"scopeDrift":false,"ci":{"state":"SUCCESS","total":9,"passed":8,"failed":0,"skipped":1,"distinct":9,"superseded":0,"supersededFailures":0,"resolved":true,"wallSeconds":361},"touched":["backend/tests/test_import_epic_tasks.py","scripts/import-epic-tasks.py","scripts/ruff-known-findings.txt"]},{"number":233,"title":"Task inventory CLI and its CI guard","url":"https://github.com/fulcrumaxe/fulcrumaxe/pull/233","state":"MERGED","createdAt":"2026-09-19T18:07:06Z","mergedAt":"2026-09-19T18:37:29Z","closedAt":"2026-09-19T18:37:29Z","mergeMinutes":30,"additions":879,"deletions":0,"changedFiles":4,"commits":1,"labels":["code-review-passed"],"gates":["Code review"],"summary":"Adds scripts/task-inventory.py, which aggregates schema v1 epic task files (epics/epic-<N>-<slug>/*.md, built on the schema v1 parser/validator merged in #228) into a single JSON inventory, plus scripts/ci/task-files-guard.sh, a thin CI wrapper that runs its -…","comments":1,"sentBack":false,"scopeDrift":false,"ci":{"state":"SUCCESS","total":12,"passed":11,"failed":0,"skipped":1,"distinct":9,"superseded":3,"supersededFailures":0,"resolved":true,"wallSeconds":306},"touched":["backend/tests/test_task_inventory.py","engine/manifest.json","scripts/ci/task-files-guard.sh"]},{"number":232,"title":"Remove stale backend-snapshot assertions from the bootstrap test suite","url":"https://github.com/fulcrumaxe/fulcrumaxe/pull/232","state":"MERGED","createdAt":"2026-09-19T18:06:53Z","mergedAt":"2026-09-19T18:27:32Z","closedAt":"2026-09-19T18:27:32Z","mergeMinutes":21,"additions":65,"deletions":93,"changedFiles":1,"commits":1,"labels":["code-review-passed"],"gates":["Code review"],"summary":"This suite has been on the merge-gate denylist because it still asserted against loop-bootstrap/backend-snapshot/, a mirror directory that was archived a while back once bootstrap started deriving installs from the live tree instead of a hand-maintained copy.…","comments":1,"sentBack":false,"scopeDrift":false,"ci":{"state":"SUCCESS","total":9,"passed":8,"failed":0,"skipped":1,"distinct":9,"superseded":0,"supersededFailures":0,"resolved":true,"wallSeconds":323},"touched":["tests/test_loop_bootstrap_extended.sh"]},{"number":231,"title":"push docs-writer's wiki commit to the code plane, not origin","url":"https://github.com/fulcrumaxe/fulcrumaxe/pull/231","state":"MERGED","createdAt":"2026-09-19T17:42:21Z","mergedAt":"2026-09-19T18:36:27Z","closedAt":"2026-09-19T18:36:27Z","mergeMinutes":54,"additions":169,"deletions":9,"changedFiles":5,"commits":2,"labels":["code-review-passed"],"gates":["Code review"],"summary":"The docs-writer's commit+push step builds its wiki update inside $DEST, a worktree that shares the parent checkout's remotes. $DEST's origin remote always points at the Discussion (private) plane by this project's convention — but the push line hardcoded git p…","comments":0,"sentBack":false,"scopeDrift":false,"ci":{"state":"SUCCESS","total":9,"passed":8,"failed":0,"skipped":1,"distinct":9,"superseded":0,"supersededFailures":0,"resolved":true,"wallSeconds":309},"touched":[".claude/agents/docs-writer.md","agents/docs-writer.md","backend/spawn_templates/docs-writer.tmpl"]},{"number":230,"title":"fix fixture gaps hiding the real spawn-template-body failures","url":"https://github.com/fulcrumaxe/fulcrumaxe/pull/230","state":"MERGED","createdAt":"2026-09-19T17:22:29Z","mergedAt":"2026-09-19T18:02:03Z","closedAt":"2026-09-19T18:02:03Z","mergeMinutes":40,"additions":116,"deletions":11,"changedFiles":3,"commits":2,"labels":["code-review-passed"],"gates":["Code review"],"summary":"This suite spawns real spawn-agent.sh processes against a scratch scripts/ directory it builds itself, and that scratch environment was missing two pieces the production script now depends on: Every --pr-scoped spawn sources scripts/lib/pr-plane.sh to resolve…","comments":2,"sentBack":true,"scopeDrift":false,"ci":{"state":"SUCCESS","total":9,"passed":8,"failed":0,"skipped":1,"distinct":9,"superseded":0,"supersededFailures":0,"resolved":true,"wallSeconds":356},"touched":["engine/manifest.json","scripts/run-pr-tests.sh","tests/test_spawn_agent_includes_template_body.sh"]},{"number":229,"title":"give acceptance-tester the false-failure warning code-reviewer already has","url":"https://github.com/fulcrumaxe/fulcrumaxe/pull/229","state":"MERGED","createdAt":"2026-09-19T17:22:10Z","mergedAt":"2026-09-19T18:00:41Z","closedAt":"2026-09-19T18:00:41Z","mergeMinutes":39,"additions":40,"deletions":21,"changedFiles":4,"commits":2,"labels":["code-review-passed"],"gates":["Code review"],"summary":"Two small loose ends in the same two files, both left over from an earlier review pass. acceptance-tester.md step 4b was missing a warning that code-reviewer.md step 3b already carries: inside a verify_tree_build-protected tree, a suite that copies one of its…","comments":3,"sentBack":true,"scopeDrift":true,"ci":{"state":"SUCCESS","total":9,"passed":8,"failed":0,"skipped":1,"distinct":9,"superseded":0,"supersededFailures":0,"resolved":true,"wallSeconds":369},"touched":[".claude/agents/acceptance-tester.md","agents/acceptance-tester.md","engine/manifest.json"]},{"number":228,"title":"Task-file schema v1 parser and validator","url":"https://github.com/fulcrumaxe/fulcrumaxe/pull/228","state":"MERGED","createdAt":"2026-09-19T17:14:02Z","mergedAt":"2026-09-19T17:45:03Z","closedAt":"2026-09-19T17:45:03Z","mergeMinutes":31,"additions":688,"deletions":26,"changedFiles":6,"commits":1,"labels":["code-review-passed"],"gates":["Code review"],"summary":"Adds a schema v1 for epic task files (epics/epic-<N>-<slug>/<TASK>.md) and a parser/validator for it in backend/task_file.py. The old format (no schema_version field) only had eight fields and no validation beyond \"does the importer find the keys it needs.\" v1…","comments":1,"sentBack":false,"scopeDrift":false,"ci":{"state":"SUCCESS","total":12,"passed":11,"failed":0,"skipped":1,"distinct":9,"superseded":3,"supersededFailures":0,"resolved":true,"wallSeconds":644},"touched":["backend/task_file.py","backend/tests/test_task_file.py","requirements.txt"]},{"number":227,"title":"widen backend import-smoke to cover scripts/lib/*.py","url":"https://github.com/fulcrumaxe/fulcrumaxe/pull/227","state":"MERGED","createdAt":"2026-09-19T17:12:42Z","mergedAt":"2026-09-19T17:23:44Z","closedAt":"2026-09-19T17:23:44Z","mergeMinutes":11,"additions":275,"deletions":16,"changedFiles":2,"commits":1,"labels":["code-review-passed"],"gates":["Code review"],"summary":"Widens scripts/ci/backend-import-smoke.py — the required backend (import-smoke) CI check — from backend/*.py only to also import every top-level scripts/lib/*.py module. That directory holds the trust-boundary modules (external_intake_gate.py, pr_intake_gate.p…","comments":1,"sentBack":false,"scopeDrift":false,"ci":{"state":"SUCCESS","total":9,"passed":8,"failed":0,"skipped":1,"distinct":9,"superseded":0,"supersededFailures":0,"resolved":true,"wallSeconds":268},"touched":["scripts/ci/backend-import-smoke.py","tests/test_backend_import_smoke.sh"]},{"number":226,"title":"Fix run_analyst's corpus paths to resolve against the main checkout","url":"https://github.com/fulcrumaxe/fulcrumaxe/pull/226","state":"MERGED","createdAt":"2026-09-19T17:09:09Z","mergedAt":"2026-09-19T17:48:27Z","closedAt":"2026-09-19T17:48:27Z","mergeMinutes":39,"additions":126,"deletions":11,"changedFiles":3,"commits":2,"labels":["code-review-passed"],"gates":["Code review"],"summary":"Spawned agents run in worktrees, and the run-analyst's corpus paths (agent-feed.jsonl, loop-runs/, cost-tracker.json, role-efficiency.json, loop-metrics.jsonl, blackboard/budget/, spawn-queue.json, worktrees.json, hook-events/, and the run-reports/ output dir)…","comments":2,"sentBack":false,"scopeDrift":false,"ci":{"state":"SUCCESS","total":9,"passed":8,"failed":0,"skipped":1,"distinct":9,"superseded":0,"supersededFailures":0,"resolved":true,"wallSeconds":357},"touched":["backend/run_analyst.py","backend/tests/test_run_analyst.py","scripts/ruff-known-findings.txt"]},{"number":225,"title":"Stop pr-tree's log line from leaking into spawn-agent.sh's dry-run worktree_path","url":"https://github.com/fulcrumaxe/fulcrumaxe/pull/225","state":"MERGED","createdAt":"2026-09-19T17:04:06Z","mergedAt":"2026-09-19T17:47:25Z","closedAt":"2026-09-19T17:47:25Z","mergeMinutes":43,"additions":242,"deletions":4,"changedFiles":3,"commits":3,"labels":["code-review-passed"],"gates":["Code review"],"summary":"The --dry-run-env-dump --pr N --isolation worktree path in scripts/spawn-agent.sh provisions a real pr-tree and captures the path pr-tree.sh reports as worktree_path. The capture used $(pr_tree_provision ... 2>&1), which merges pr-tree.sh's own stderr log line…","comments":2,"sentBack":false,"scopeDrift":false,"ci":{"state":"SUCCESS","total":9,"passed":8,"failed":0,"skipped":1,"distinct":9,"superseded":0,"supersededFailures":0,"resolved":true,"wallSeconds":385},"touched":["engine/manifest.json","scripts/spawn-agent.sh","tests/test_spawn_agent_dry_run_worktree_path.sh"]},{"number":224,"title":"Advisory staleness check for scripts/lib vs the code plane","url":"https://github.com/fulcrumaxe/fulcrumaxe/pull/224","state":"MERGED","createdAt":"2026-09-19T17:02:07Z","mergedAt":"2026-09-19T17:45:33Z","closedAt":"2026-09-19T17:45:33Z","mergeMinutes":43,"additions":383,"deletions":1,"changedFiles":4,"commits":3,"labels":["code-review-passed"],"gates":["Code review"],"summary":"Adds an advisory-only check that compares every file under scripts/lib/ in a checkout against the same path on this repo's main by content hash, and reports three states per file: identical, differs, or absent here. It never blocks anything — it exits 0 uncond…","comments":2,"sentBack":true,"scopeDrift":false,"ci":{"state":"SUCCESS","total":9,"passed":8,"failed":0,"skipped":1,"distinct":9,"superseded":0,"supersededFailures":0,"resolved":true,"wallSeconds":366},"touched":["engine/manifest.json","scripts/check-shared-lib-staleness.sh","scripts/start-the-day.sh"]},{"number":223,"title":"Add an exception allowlist to the bootstrap identifier rewrite","url":"https://github.com/fulcrumaxe/fulcrumaxe/pull/223","state":"MERGED","createdAt":"2026-09-17T23:30:00Z","mergedAt":"2026-09-19T16:58:38Z","closedAt":"2026-09-19T16:58:38Z","mergeMinutes":2489,"additions":251,"deletions":31,"changedFiles":4,"commits":1,"labels":["code-review-passed"],"gates":["Code review"],"summary":"loop-bootstrap/bootstrap.sh's identifier rewrite substitutes an adopter's --repo value for this project's own identity across every file it installs. That rewrite is a blanket pass now (it already drives off a three-slug list, landed separately), and scripts/…","comments":2,"sentBack":false,"scopeDrift":false,"ci":{"state":"SUCCESS","total":12,"passed":11,"failed":0,"skipped":1,"distinct":9,"superseded":3,"supersededFailures":0,"resolved":true,"wallSeconds":368},"touched":["loop-bootstrap/bootstrap.sh","loop-bootstrap/engine-identity-allowlist.txt","tests/test_loop_bootstrap.sh"]},{"number":222,"title":"stop the body sanitizer from reassembling the tokens it strips","url":"https://github.com/fulcrumaxe/fulcrumaxe/pull/222","state":"MERGED","createdAt":"2026-09-17T19:20:24Z","mergedAt":"2026-09-17T20:23:13Z","closedAt":"2026-09-17T20:23:13Z","mergeMinutes":63,"additions":426,"deletions":8,"changedFiles":2,"commits":3,"labels":["code-review-passed","security-review-passed"],"gates":["Code review","Security"],"summary":"sanitize_body() strips four control-token shapes (SPAWN_REQUEST, TERMINATE_REQUEST, STATUS:..., and HTML comments) from Discussion bodies before they're embedded in an executor prompt. It did this by deleting each regex match in a single pass with no rescan, w…","comments":6,"sentBack":true,"scopeDrift":false,"ci":{"state":"SUCCESS","total":12,"passed":11,"failed":0,"skipped":1,"distinct":9,"superseded":3,"supersededFailures":0,"resolved":true,"wallSeconds":362},"touched":["scripts/lib/route_discussion_wiring.py","tests/test_route_discussion.py"]},{"number":221,"title":"Record Muse subagent completions with measured tokens","url":"https://github.com/fulcrumaxe/fulcrumaxe/pull/221","state":"MERGED","createdAt":"2026-09-16T23:49:23Z","mergedAt":"2026-09-17T00:28:17Z","closedAt":"2026-09-17T00:28:17Z","mergeMinutes":39,"additions":497,"deletions":0,"changedFiles":5,"commits":2,"labels":["code-review-passed","security-review-passed"],"gates":["Code review","Security"],"summary":"Muse subagents were finishing without leaving a trace in the stats lane: starts had no completion rows and token counts were missing. The runtime does record real per-agent usage in each child's session log, so this change joins those logs to the parent sessio…","comments":3,"sentBack":false,"scopeDrift":false,"ci":{"state":"SUCCESS","total":9,"passed":8,"failed":0,"skipped":1,"distinct":9,"superseded":0,"supersededFailures":0,"resolved":true,"wallSeconds":370},"touched":["backend/codex_run_backfill.py","engine/manifest.json","scripts/backfill-codex-runs.sh"]},{"number":220,"title":"Fix How-the-loop-works, marketplace-from-URL, Muse loop docs (D#2603)","url":"https://github.com/fulcrumaxe/fulcrumaxe/pull/220","state":"MERGED","createdAt":"2026-09-16T22:52:12Z","mergedAt":"2026-09-16T23:23:25Z","closedAt":"2026-09-16T23:23:25Z","mergeMinutes":31,"additions":31,"deletions":22,"changedFiles":1,"commits":2,"labels":["code-review-passed","security-review-passed"],"gates":["Code review","Security"],"summary":"README loop docs that contradict themselves and the merge gate, fixed; marketplace install from the public URL; Muse /loop operation documented from verified behavior. One consistent firing story (cron triggers backend/trigger.py / TUI; cron ships disabled); /…","comments":0,"sentBack":false,"scopeDrift":false,"ci":{"state":"SUCCESS","total":9,"passed":8,"failed":0,"skipped":1,"distinct":9,"superseded":0,"supersededFailures":0,"resolved":true,"wallSeconds":355},"touched":["README.md"]},{"number":219,"title":"Muse plugin bundle + sandbox run notes (D#2602)","url":"https://github.com/fulcrumaxe/fulcrumaxe/pull/219","state":"MERGED","createdAt":"2026-09-16T22:25:41Z","mergedAt":"2026-09-16T22:32:45Z","closedAt":"2026-09-16T22:32:45Z","mergeMinutes":7,"additions":65,"deletions":0,"changedFiles":2,"commits":2,"labels":["code-review-passed","security-review-passed"],"gates":["Code review","Security"],"summary":"Native Muse plugin packaging the three project skills, plus README run instructions for sandboxed sessions. .muse-plugin/plugin.json (schemaVersion 1, skills capability only): start-the-day, coldstart, update. Install via marketplace (marketplace add + install…","comments":0,"sentBack":false,"scopeDrift":false,"ci":{"state":"SUCCESS","total":9,"passed":8,"failed":0,"skipped":1,"distinct":9,"superseded":0,"supersededFailures":0,"resolved":true,"wallSeconds":385},"touched":[".muse-plugin/plugin.json","README.md"]},{"number":218,"title":"Muse skills: start-the-day, coldstart, update (D#2601)","url":"https://github.com/fulcrumaxe/fulcrumaxe/pull/218","state":"MERGED","createdAt":"2026-09-16T21:57:16Z","mergedAt":"2026-09-16T22:17:20Z","closedAt":"2026-09-16T22:17:20Z","mergeMinutes":20,"additions":482,"deletions":9,"changedFiles":8,"commits":3,"labels":["code-review-passed","security-review-passed"],"gates":["Code review","Security"],"summary":"Project skills at .agents/skills/ so Muse sessions get start-the-day, coldstart, and update as invokable commands — the .claude/commands/ equivalents Muse never reads. Twin-drift parity: commands↔skills family added to the divergence guard. Adopters must trust…","comments":0,"sentBack":false,"scopeDrift":false,"ci":{"state":"SUCCESS","total":9,"passed":8,"failed":0,"skipped":1,"distinct":9,"superseded":0,"supersededFailures":0,"resolved":true,"wallSeconds":360},"touched":[".agents/skills/coldstart/SKILL.md",".agents/skills/start-the-day/SKILL.md",".agents/skills/update/SKILL.md"]},{"number":217,"title":"Adopter docs, Muse spawn renderer, lane mechanics (D#2601 Phase 3)","url":"https://github.com/fulcrumaxe/fulcrumaxe/pull/217","state":"MERGED","createdAt":"2026-09-16T20:45:48Z","mergedAt":"2026-09-16T21:33:39Z","closedAt":"2026-09-16T21:33:39Z","mergeMinutes":48,"additions":524,"deletions":0,"changedFiles":5,"commits":3,"labels":["code-review-passed","security-review-passed"],"gates":["Code review","Security"],"summary":"Muse-lane operation for adopters and spawns, additive alongside the Claude lane. README Muse section (prereqs, bootstrap-first, --muse ritual, not-yet-working list, private-repo boundary), cold-followed on a clean clone with no claude binary. scripts/lib/muse-…","comments":0,"sentBack":false,"scopeDrift":false,"ci":{"state":"SUCCESS","total":9,"passed":8,"failed":0,"skipped":1,"distinct":9,"superseded":0,"supersededFailures":0,"resolved":true,"wallSeconds":268},"touched":["AGENTS.md","README.md","engine/manifest.json"]}],"pageInfo":{"hasNextPage":true,"endCursor":"Y3Vyc29yOnYyOpK0MjAyNi0wOS0xNlQyMDo0NTo0OFrPAAAAAQ9SMEM="},"counts":{"merged":231,"closedUnmerged":4,"open":0},"repo":"fulcrumaxe/fulcrumaxe","fetchedAt":"2026-09-26T04:57:14.336Z"}