Conversation
|
Speaking as Kun's firstmate: Verdict: Whole thread + tip vs main Tip vs main: Removes contract-class: restore — concrete existing per-machine Lavish address contract was broken by primary→secondmate inheritance; tip restores machine-local values. VISION.md (each rule)
Attestation: MISSING (no no-mistakes pipeline attestation in body). Blocker for author: raise/update via |
3d01ad2 to
fcf977c
Compare
fcf977c to
e81f998
Compare
|
… Lavish host copies
|
Speaking as Kun's firstmate: whole thread re-read. Prior stamp was waiting-author (attestation MISSING on HEAD Closes: body has no Contract-class: restore (own tip-vs-main; FM-LEARN-CLAIMS). VISION.md (each rule)
Outcome: waiting-ci. No auto-merge until tip CI green. Firstmate flag: no (CI unfinished). Security tip: none. |
Intent
Rebase the Lavish per-machine configuration fix onto current upstream main, run the focused secondmate harness tests and validation, and update #5873 so it is ready to merge after the maintainer approves fork workflows. Do not merge.
What Changed
lavish-axi-hostout of the defaultFM_INHERITABLE_CONFIGset inbin/fm-config-inherit-lib.sh. Config propagation and the bootstrap sweep no longer copy the primary's per-machine Lavish server address into secondmate homes, and they no longer overwrite or remove a secondmate's own value.fm-spawn.shstill exports each home's ownconfig/lavish-axi-hostinto worker launches, and its comment now says so.docs/configuration.mdand the operational-home-layout skill to say the file is per-home and not inherited. The docs also note that a home which already has a copy of the primary's address keeps it until an operator rewrites or removes that home'sconfig/lavish-axi-hostonce.tests/fm-secondmate-harness.test.sh. The tests now check that propagation leaves a secondmate's own Lavish address untouched and never copies the primary's address into a home that has none. They also check that the address survives the bootstrap sweep's push, re-converge and mirror-absence steps.🤖 Generated with Claude Code
Risk Assessment
✅ Low: The change removes one item from the inheritable config list, keeps every upstream entry, updates the docs and comments to match, and adds behavioral tests. Before this fix those tests would have failed, because the primary's lavish-axi-host was copied into and overwrote secondmate homes. The requested manual-cleanup note is present.
Testing
I ran the real fm-config-push.sh from a disposable lab primary home into a registered secondmate home. On the target commit, the secondmate's config/lavish-axi-host was never pushed and never mirror-deleted. It stayed absent when the secondmate had no value, and it kept the secondmate's own value when the primary changed or removed its address. crew-harness still propagated normally. The same run on base fa48367 pushed the primary's address, overwrote the secondmate's value and deleted it when the primary cleared its file, which reproduces the bug this change fixes. The reread-nudge send was refused because the secondmate fixture is not a lab home. The gate's lifecycle guard is what refused it, and it has no effect on the propagation results. The focused fm-secondmate-harness suite also ran (its log is attached), but that is a unit-level run rather than a live product scenario, so it is recorded as untested under the live contract. I removed the lab homes and the temporary base export; the worktree is clean.
Evidence: Focused secondmate harness test log
Source: Focused secondmate harness test log
Evidence: Live fm-config-push.sh transcript at target (Lavish address stays per-home)
Source: Live fm-config-push.sh transcript at target (Lavish address stays per-home)
Evidence: Live fm-config-push.sh transcript at base fa48367 (bug reproduced)
Source: Live fm-config-push.sh transcript at base fa48367 (bug reproduced)
A: lavish-axi-host: pushed -> SM = primary-host.example:4387 B: lavish-axi-host: pushed -> SM = primary-host-2.example:4387 (secondmate value overwritten) C: lavish-axi-host: pushed - mirrored primary absence -> SM = <absent>Pipeline
Updates from git push no-mistakes
✅ **intent** - passed
✅ No issues found.
✅ **Rebase** - passed
✅ No issues found.
🔧 **Review** - 1 issue found → auto-fixed ✅
bin/fm-config-inherit-lib.sh:80- Existing homes keep the primary's Lavish address. Since c443d8c (fix(bin): unify Lavish host and disconnect handling #5060, 2026-09-20),lavish-axi-hosthas been in FM_INHERITABLE_CONFIG, so the primary's address has been copied into local and remote secondmate homes (remote homes through fm-remote-inherit-push.sh). This change removes the item from the list. The absence mirror only reaches listed items, so no later sweep, spawn or config push will touch a copy that is already there. A remote secondmate on another machine that received the primary's address will keep sending its workers to the wrong machine's Lavish server until someone deletesconfig/lavish-axi-hostby hand. That is the failure this fix targets. Nothing records which copies were inherited and which were set by the user, so the code cannot remove old inherited copies safely. The smallest options are (a) an upgrade note in docs/configuration.md telling operators to check or delete the file in remote secondmate homes, or (b) new cleanup machinery that tracks where each copy came from. Option (b) extends the change, so the remedy needs the author's decision.🔧 Fix applied.
✅ Re-checked - no issues remain.
✅ **Test** - passed
✅ No issues found.
bash tests/fm-secondmate-harness.test.sh(focused secondmate harness suite, including the updated propagate-lib and B7 bootstrap-sweep Lavish assertions)LiveFM_HOME=<lab> bin/fm-config-push.shagainst a disposable fm-lab-home primary with a registered local secondmate home (state/sm1.meta), at target 2832a4e, in three steps: (A) the secondmate has no address, (B) the secondmate has its own address and the primary changes its value, (C) the primary removes its valueThe same live fm-config-push.sh run against agit archive fa48367export of the base commit, to reproduce the old inheritance behavior for contrast✅ **Document** - passed
✅ No issues found.
✅ **Lint** - passed
✅ No issues found.
✅ **Push** - passed
✅ No issues found.