Conversation
…ation in script header
…ate-20260919 feat: gate fresh CLAUDE.md pointer creation on Claude Code version >= 2.1.277
…tage 2) (#2) * feat(bin): complete stage 2 CLAUDE.md pointer removal * no-mistakes(review): Restore column-0 heredoc regression fixture with generic content * no-mistakes(review): Remove stale CLAUDE.md pointer claim from updatefirstmate skill --------- Co-authored-by: irene <irene@ireneui-MacBookPro.local>
Prior commits on this branch regressed past stage2, restoring the unconditional CLAUDE.md pointer-write logic stage2 removed. Reset to fork/main (stage2's merged head) and redo stage3 correctly: delete the now-dead fm_version_at_least/claude_supports_native_agents_md functions and their header-comment reference, and drop the now-vestigial with_mock_claude/with_no_claude test helpers (the script no longer reads claude --version at all). Co-authored-by: irene <irene@ireneui-MacBookPro.local>
…eering skills (#4) * feat: add lazy specialist tool routing Expose ECC, paperthin, and ultrawork as captain-approved specialist paths while keeping Firstmate intake and lifecycle authority. Load only the selected skill or mode and keep ECC hooks, MCP, and legacy sync opt-in. * docs(agents): recover firstmate-layout and task-steering skills These two skills existed only on an orphaned local branch, never pushed. firstmate-layout is re-extracted from AGENTS.md section 2's current (much larger) layout tree rather than reusing the stale 2026-09-14 snapshot. task-steering's underlying AGENTS.md paragraph was byte-identical to the 2026-09-14 extraction, so it is reused as-is. Both get a one-line trigger in section 13 and a documentation-audiences.json entry, matching how specialist-tools (recovered earlier on this branch) is registered. --------- Co-authored-by: irene <irene@ireneui-MacBookPro.local>
Co-authored-by: irene <irene@ireneui-MacBookPro.local>
…focused test failure
Author
|
Opened by mistake against the wrong repo (this fork's automation defaulted to the upstream remote instead of Ivory2024/firstmate). The actual PR is Ivory2024#9. Closing, no action needed here. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Intent
Firstmate's own primary checkout tracks origin (upstream kunchenguid/firstmate) as main's configured upstream. As of 2026-09-19, local main (which equals the captain's fork Ivory2024/firstmate after tonight's PR #1-5) is 3 commits behind origin/main: 2bcb88c (ci: standardize workflow timeouts into three tiers, #4910), 65a3bac (feat: park main under the away posture on Pi, #4889), 4812db8 (fix(bin): preserve Claude lock ownership after helper recycling, #4894). Catch the fork up on these 3 upstream commits. A prior attempt at this by branching from origin/main directly pulled in 39 files and hit a real merge conflict against the fork's own recent history (the specialist-tools/firstmate-layout/task-steering skill recovery and the crewmate-termination reap fix landed tonight) - that attempt was abandoned (closed PR #6) rather than force-resolved blind. Do this properly: understand what each of the 3 upstream commits actually changes, find and resolve the real conflicts against fork/main's own recent commits, and land a clean sync.
What Changed
maincommits covering CI timeout tiers, Pi away posture, and Claude lock ownership preservation.firstmate-layout,specialist-tools, andtask-steeringskills, adds.backpassrc.json, and consolidates project guidance inAGENTS.mdwithout generating newCLAUDE.mdpointers.Risk Assessment
✅ Low: The changed sync and fix-round code is bounded, preserves the required fork-specific behavior, and no source-verifiable defects remain.
Testing
Repository tests, fixtures, and live checks were recorded in the prior payload. The CI workflow and Pi supervision checks did not establish live product results. No linters or formatters were run directly.
bash tests/fm-session-lock-ancestry.test.sh;python3 tests/fm-turnend-foreign-owner-repro.pybash tests/fm-inactive-reconcile.test.shbash tests/fm-arm-pretool-check.test.sh;bash tests/fm-ensure-agents-md.test.sh;bash tests/fm-lint-workflows.test.shbash tests/fm-test-run.test.sh;bash tests/fm-remote-backlog-handoff.test.sh;bash tests/fm-pr-merge.test.sh;bash tests/fm-send-resolve-key.test.shEvidence: Sync ancestry and conflict evidence
Source: Sync ancestry and conflict evidence
target=c4c99e94a2f8a626d150cae7d25f3f0554c5cb71; sync_merge_in_target=yes; all three upstream commits are ancestors; target_diff_check=clean; conflict_markers=none.Pipeline
Updates from git push no-mistakes
✅ **intent** - passed
✅ No issues found.
⏭️ **Rebase** - skipped
Step was skipped.
🔧 **Review** - 3 issues found → auto-fixed (3) ✅
AGENTS.md:64- The intent requires resolving the real merge conflicts and landing a clean sync, butAGENTS.md:64retains>>>>>>> origin/mainand lines 60-63 contain an orphaned layout fragment. Remove the marker and reconstruct the intended layout block before landing.bin/fm-inactive-reconcile.sh:483- For an Orca-backed terminal child,reap_terminal_child_lockedreadswindowat line 483 and passes it tofm_backend_killat line 496. Orca metadata storeswindow=fm-$IDwhile the real terminal handle is stored separately interminal(bin/fm-spawn.sh:4236-4237,4293), andfm_backend_orca_killexpects that terminal handle (bin/backends/orca.sh:295). A done/failed Orca child therefore reaches this path without closing its terminal. Select the backend-specific terminal identity before closing, with the existing endpoint validation boundary.bin/fm-arm-command-policy.mjs:862- The change expands the blessed watcher setup to allow<root>/config/x-mode.envatbin/fm-arm-command-policy.mjs:862, even whenrootand activehomediffer.fm-arm-pretool-check.sh:170-176passes them separately, while the documented invariant says absolute x-mode paths outside the active home are not approved. A command sourcing the code-root config can now arm supervision under the wrong home. Remove the root alternative unless this broader authorization is deliberate and its contract is updated.🔧 Fix applied.
6 issues (3 errors, 3 warnings) still open:
bin/fm-inactive-reconcile.sh:483- For an Orca-backed terminal child,reap_terminal_child_lockedreadswindowat line 483 and passes it tofm_backend_killat line 496. Orca metadata storeswindow=fm-$IDwhile the real terminal handle is stored separately interminal(bin/fm-spawn.sh:4236-4237,4293), andfm_backend_orca_killexpects that terminal handle (bin/backends/orca.sh:295). A done/failed Orca child therefore reaches this path without closing its terminal. Select the backend-specific terminal identity before closing, with the existing endpoint validation boundary.bin/fm-arm-command-policy.mjs:862- The change expands the blessed watcher setup to allow<root>/config/x-mode.envatbin/fm-arm-command-policy.mjs:862, even whenrootand activehomediffer.fm-arm-pretool-check.sh:170-176passes them separately, while the documented invariant says absolute x-mode paths outside the active home are not approved. A command sourcing the code-root config can now arm supervision under the wrong home. Remove the root alternative unless this broader authorization is deliberate and its contract is updated.bin/fm-inactive-reconcile.sh:490- The prior reaping fix changed Orca selection toterminal, butreap_terminal_child_lockedstill kills tmux PIDs at this line before calling any endpoint validator. A stale or mismatchedwindowcan resolve to an unrelated pane, causing SIGTERM or endpoint closure for another task. The same unvalidated helper is reached from the sibling reconciliation paths atbin/fm-inactive-reconcile.sh:546,:556, and:563. Validate the metadata/task identity at the shared helper boundary before any runtime command, then use the validated target.bin/fm-inactive-reconcile.sh:536-pr_for_taskexpects its second argument to be the preferred status line, but this call passes the status-file path. For a completed child whose metadata has nopr=field and whose status containsdone: PR https://..., the fallback regex receives the path, returns empty, and the reported outcome loses the PR URL without an error. The sibling call atbin/fm-inactive-reconcile.sh:408passes the actual last line correctly; pass$lasthere as well..backpassrc.json:4- The change deletes the rootCLAUDE.md, while.backpassrc.jsonstill declares it as a required memory file. The repository's ownfm-ensure-agents-md.shdocumentsAGENTS.mdas the current knowledge file and does not recreate the deleted root pointer. A Backpass run using this committed configuration therefore consumes a nonexistent file or can reintroduce the removed compatibility artifact. RemoveCLAUDE.mdfrommemoryFiles.bin/fm-test-run.sh:1649- The new tracked.backpassrc.jsonis not classified bybin/fm-test-run.sh's changed-path mapping. Its default branch emits__unmapped__, andselect_changedthen aborts withno changed-test mapping for source path, so changed-test selection cannot process this change. Treat this repository configuration as a non-executable/config path in the existing mapping.🔧 Fix applied.
1 warning still open:
bin/fm-arm-command-policy.mjs:862- The change expands the blessed watcher setup to allow<root>/config/x-mode.envatbin/fm-arm-command-policy.mjs:862, even whenrootand activehomediffer.fm-arm-pretool-check.sh:170-176passes them separately, while the documented invariant says absolute x-mode paths outside the active home are not approved. A command sourcing the code-root config can now arm supervision under the wrong home. Remove the root alternative unless this broader authorization is deliberate and its contract is updated.🔧 Fix applied.
✅ Re-checked - no issues remain.
tests/fm-pi-watch-extension.test.sh:1- Pi watcher tests failed once under parallel resource contention, then passed when rerun alone. No reproducible product failure observed.bash tests/fm-session-lock-ancestry.test.sh;python3 tests/fm-turnend-foreign-owner-repro.pybash tests/fm-inactive-reconcile.test.shbash tests/fm-arm-pretool-check.test.sh;bash tests/fm-ensure-agents-md.test.sh;bash tests/fm-lint-workflows.test.shbash tests/fm-test-run.test.sh;bash tests/fm-remote-backlog-handoff.test.sh;bash tests/fm-pr-merge.test.sh;bash tests/fm-send-resolve-key.test.shbash tests/fm-ci-workflow.test.shbash tests/fm-branch-supervision.test.shbash tests/fm-pi-branch-extension.test.shbash tests/fm-pi-watch-extension.test.shbash tests/fm-pr-merge.test.shbash tests/fm-send-resolve-key.test.shbash tests/fm-session-lock-ancestry.test.shpython3 tests/fm-turnend-foreign-owner-repro.pybash tests/fm-arm-pretool-check.test.shbash tests/fm-ensure-agents-md.test.shbash tests/fm-inactive-reconcile.test.shbash tests/fm-lint-workflows.test.shbash tests/fm-remote-backlog-handoff.test.shbash tests/fm-test-run.test.shgit ancestry, diff-check, conflict-marker, and clean-worktree checks✅ **Document** - passed
✅ No issues found.
✅ **Lint** - passed
✅ No issues found.
✅ **Push** - passed
✅ No issues found.