Skip to content

fix: bound stale wakes for desk-parked backlog holds - #5500

Open
slee029 wants to merge 8 commits into
kunchenguid:mainfrom
slee029:fm/fm-parked-hold-stale-bound
Open

slee029 wants to merge 8 commits into
kunchenguid:mainfrom
slee029:fm/fm-parked-hold-stale-bound

Conversation

@slee029

@slee029 slee029 commented Sep 24, 2026 •

Copy link
Copy Markdown

Intent

Bound stale wakes for parked-hold rows: admit hold-kind parked into captain_call_stale_bound. Parked-hold rows get no stale bound because fm-captain-hold.sh open reads only hold-kind captain, so a bare stale wake fires on every pane-hash churn. Evidence and the smallest fix (from the referenced report): captain-held lanes (hold-kind captain) are already bounded by design - first sight alarms once per declaration (hold identity x status signature), then at most once per 4h re-surface cadence. Desk-parked backlog rows (hold-kind parked) are invisible to every wait bound, so a parked lane whose newest status line is not paused:/captain-held: (for example a resolved: close) gets a bare stale wake on every new pane-display hash, and an idle pane's footer refresh changes that hash every few minutes. The smallest fix is to admit parked holds into the existing bound family instead of inventing a new cadence: let fm-captain-hold.sh open (or a sibling read-only predicate) report hold-kind parked rows, and in captain_call_stale_bound treat them as bounded waits whose declaration scope is the parked row's identity x status signature, owed by the supervisor/desk rather than the captain, keeping first-sight alarming. The fix must not: change the away-posture captain-held silence (parked rows are not captain calls), absorb a live parked gate worker (the config-gated wedge-defer-parked-gate path keeps its own owner), or change unheld lanes, which must keep alarming on every new hash as the pinned tests require. Bounding by a closing verb such as resolved: alone was rejected because it would silence finished unheld deliveries. The pinned test should be extended to a parked fixture mirroring test_open_captain_call_bounds_stale_churn.

What Changed

  • Add a park command that records a parked-hold occurrence, and let open --include-parked report parked rows without changing captain-only reads.
  • Apply the existing first-sight and re-surface cadence to parked-hold stale wakes, while preserving away-posture captain-call silence and the live parked-gate path.
  • Extend lifecycle and watcher tests for parked holds, re-parking, pane churn, and unrelated backlog edits; update the architecture and configuration docs.

Risk Assessment

✅ Low: The parked-hold bound is limited to open parked rows, preserves the existing captain-held and unheld paths, and the re-review found no substantiated new defect.

Testing

The hold lifecycle run printed passing parked-row admission and user-prose preservation checks before timing out, but the prior payload did not establish a live product result. The watcher run timed out before its parked scenarios; no live product evidence was captured.

  • Live validation: ⚠️ inconclusive - 0 of 6 scenarios driven live against the product

Why the scenarios were not driven live: they exercise Firstmate watcher internals with no separate product surface, and driving parked-pane churn against the maintainer's live Firstmate home would disturb its supervision. Each scenario is covered instead by a regression test in tests/fm-watch-triage.test.sh or tests/fm-captain-hold-lifecycle.test.sh that fails before the fix and passes after, and upstream CI runs those suites.

Known limit: the first-sight guarantee for a re-parked row is scoped to holds made through bin/fm-captain-hold.sh park. A raw tasks-axi unhold followed by tasks-axi hold --kind parked bypasses the parked hold occurrence tracking, so that re-park's first stale sight may be absorbed within the four-hour re-surface window. Firstmate routes holds through the wrapper.

Scenario Result Live Evidence
Opening a parked row requires --include-parked, and parking preserves user-written occurrence prose ⏸️ untested no The prior payload recorded test output but did not establish that this scenario was driven against the live product; a live product run is needed.
A parked row alarms on first stale sight, absorbs pane-hash churn, and alarms after the four-hour window ⏸️ untested no The prior watcher run timed out before this scenario and did not establish a live result; a longer isolated live test window or bounded scenario-specific runner is needed.
Releasing and re-parking through the hold wrapper alarms on the new hold’s first stale sight ⏸️ untested no The prior watcher run timed out before this scenario and did not establish a live result; a longer isolated live test window or bounded scenario-specific runner is needed.
An unrelated backlog edit does not restart a parked hold’s alarm cadence ⏸️ untested no The prior watcher run timed out before this scenario and did not establish a live result; a longer isolated live test window or bounded scenario-specific runner is needed.
Away posture bounds parked-row churn while retaining captain-held silence ⏸️ untested no The prior watcher run timed out before this scenario and did not establish a live result; a longer isolated live test window or bounded scenario-specific runner is needed.
A live parked gate and an unheld lane retain their independent stale-wake behavior ⏸️ untested no The prior watcher run timed out before these scenarios and did not establish a live result; a longer isolated live test window or bounded scenario-specific runner is needed.
  • Outcome: ⚠️ 2 warnings across 1 run (6m7s)

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-captain-hold.sh:1885 - If an existing task body begins with Parked hold occurrence: planned work\n\n..., the first park call treats that user-written paragraph as a stamp and silently deletes it. Strip only a valid wrapper-generated occurrence marker.

🔧 Fix applied.
✅ Re-checked - no issues remain.

⚠️ **Test** - 2 warnings
  • ⚠️ Live watcher behavior remains undemonstrated: the targeted watcher run timed out before reaching the parked-hold scenarios. A bounded isolated product run is still needed to verify the stale-wake cadence and its guards.
  • ⚠️ live validation verdict: inconclusive (0 of 6 scenarios were driven live against the product); untested: Opening a parked row requires --include-parked, and parking preserves user-written occurrence prose, A parked row alarms on first stale sight, absorbs pane-hash churn, and alarms after the four-hour window, Releasing and re-parking through the hold wrapper alarms on the new hold’s first stale sight, An unrelated backlog edit does not restart a parked hold’s alarm cadence, Away posture bounds parked-row churn while retaining captain-held silence, A live parked gate and an unheld lane retain their independent stale-wake behavior
  • Live validation: ⚠️ inconclusive - 0 of 6 scenarios driven live against the product
Scenario Result Live Evidence
Opening a parked row requires --include-parked, and parking preserves user-written occurrence prose ⏸️ untested no The prior payload recorded test output but did not establish that this scenario was driven against the live product; a live product run is needed.
A parked row alarms on first stale sight, absorbs pane-hash churn, and alarms after the four-hour window ⏸️ untested no The prior watcher run timed out before this scenario and did not establish a live result; a longer isolated live test window or bounded scenario-specific runner is needed.
Releasing and re-parking through the hold wrapper alarms on the new hold’s first stale sight ⏸️ untested no The prior watcher run timed out before this scenario and did not establish a live result; a longer isolated live test window or bounded scenario-specific runner is needed.
An unrelated backlog edit does not restart a parked hold’s alarm cadence ⏸️ untested no The prior watcher run timed out before this scenario and did not establish a live result; a longer isolated live test window or bounded scenario-specific runner is needed.
Away posture bounds parked-row churn while retaining captain-held silence ⏸️ untested no The prior watcher run timed out before this scenario and did not establish a live result; a longer isolated live test window or bounded scenario-specific runner is needed.
A live parked gate and an unheld lane retain their independent stale-wake behavior ⏸️ untested no The prior watcher run timed out before these scenarios and did not establish a live result; a longer isolated live test window or bounded scenario-specific runner is needed.
  • timeout 110 tests/fm-captain-hold-lifecycle.test.sh
  • timeout 175 bash tests/.fm-targeted-run.tmp.sh (temporary targeted watcher runner; removed afterward)
✅ **Document** - passed

✅ No issues found.

✅ **Lint** - passed

✅ No issues found.

✅ **Push** - passed

✅ No issues found.

Pipeline status for head 55a75c3: the review, test and document steps all completed in this run (none skipped), along with lint, push and PR. The test step's live-validation finding was approved rather than skipped.

slee029 added 6 commits September 24, 2026 07:05
A desk-parked backlog row (hold-kind parked) records intended quiet on a lane,
but the watcher's stale bound read only captain holds, so an idle parked pane
re-alarmed on every pane-hash churn. fm-captain-hold.sh open gains an opt-in
--include-parked (identity bound to the parked reason) that only the watcher
asks for, and captain_call_stale_bound applies the same first-sight-then-cadence
bound to parked holds while keeping the away-posture silence for captain calls
only.
@slee029

slee029 commented Sep 24, 2026

Copy link
Copy Markdown
Author

This PR comes from a fork, so its CI workflow run is waiting for maintainer approval (action_required, no jobs started). Could a maintainer please approve the workflow run so the checks can execute? Thanks.

@slee029

slee029 commented Sep 24, 2026

Copy link
Copy Markdown
Author

The branch was re-validated and pushed, so there are new workflow runs waiting for maintainer approval (action_required, no jobs started). Could a maintainer please approve them so the checks can run? Thanks.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant