Skip to content

fix: distinguish outdated tools from missing tools - #5688

Open
ironerumi wants to merge 8 commits into
kunchenguid:mainfrom
ironerumi:fm/upstream-5440-outdated-tools
Open

ironerumi wants to merge 8 commits into
kunchenguid:mainfrom
ironerumi:fm/upstream-5440-outdated-tools

Conversation

@ironerumi

@ironerumi ironerumi commented Sep 25, 2026 •

Copy link
Copy Markdown
Contributor

Intent

The developer asked for the change reported in upstream issue #5440. bin/fm-bootstrap.sh reports a tool that is installed but below its version floor, or present but missing a required capability, with the same "MISSING:" line it uses for a tool that is absent, so a supervisor reads an installed tool as missing and takes the first-install remediation again. The issue’s accepted design splits the two states: "MISSING:" stays for absent tools only, and a present-but-below-floor tool reports "OUTDATED: (installed: <version|unparseable>; requires <floor|capability>; upgrade: )", where the upgrade command is the tool’s own updater - treehouse update, no-mistakes update, gh-axi update, quota-axi update - and never a first-install-only step such as "setup hooks" or a curl installer. tasks-axi ships no self-updater, so it keeps its install command and the line names the missing feature probe capability. lavish-axi keeps PRESENTATION_UNAVAILABLE with its plain-text fallback. The change covers treehouse, no-mistakes, gh-axi, quota-axi and tasks-axi, and deliberately also updates the bootstrap-diagnostics handler, the AGENTS.md section 13 trigger list, the operator-facing tool diagnostics in docs/configuration.md (which restated the old contract), and tests/fm-bootstrap.test.sh so it covers absent, below-floor and at-floor for every floored tool. Non-goals, stated in the issue: no change to floor values or floor policy, no change to the absent path, and no automatic upgrades - consent stays detect, then ask, then act.

What Changed

  • Bootstrap now distinguishes absent tools (MISSING:) from installed but outdated or incompatible tools (OUTDATED:), including parsed versions, requirements, and tool-specific upgrade commands; tasks-axi diagnostics name missing capabilities while Lavish retains its plain-text fallback.
  • Reused tasks-axi compatibility probe results and reasons across session-start/bootstrap handoff paths to avoid duplicate capability probes.
  • Updated operator and skill documentation and expanded bootstrap behavior coverage for absent, below-floor, and at-floor tool states.

Risk Assessment

✅ Low: The change cleanly separates absent, outdated, and presentation-unavailable diagnostics with bounded scope, shared probe reuse, aligned documentation, and behavior-focused coverage.

Testing

The focused live product checks and isolated bootstrap transcript passed all scenarios tied to the requested outdated-versus-missing contract; the broader targeted test file was not allowed to run past its command timeout, but its relevant selectors were rerun successfully.

  • Live validation: ✅ go - 4 of 4 scenarios driven live against the product
Scenario Result Live Evidence
Absent tools remain MISSING and floored tools at floor stay silent ✅ pass live bootstrap-outdated-live-transcript.log
Below-floor and capability failures report OUTDATED with the correct upgrade ✅ pass live bootstrap-outdated-live-transcript.log
Lavish presentation fallback and legacy-board behavior remain intact ✅ pass live bootstrap-outdated-focused.log
Tasks-axi capability reason crosses the one-hop handoff without repeated probes ✅ pass live bootstrap-outdated-focused.log
Evidence: Live bootstrap diagnostics transcript

Source: Live bootstrap diagnostics transcript

[all floored tools at floor]
<silent>
[treehouse absent]
MISSING: treehouse (install: curl -fsSL https://kunchenguid.github.io/treehouse/install.sh | sh)
[treehouse present without lease]
OUTDATED: treehouse (installed: 0.4.2; requires --lease support; upgrade: treehouse update)
[no-mistakes absent]
MISSING: no-mistakes (install: curl -fsSL https://raw.githubusercontent.com/kunchenguid/no-mistakes/main/docs/install.sh | sh)
[no-mistakes below floor]
OUTDATED: no-mistakes (installed: 1.45.4; requires 1.46.0; upgrade: no-mistakes update)
[gh-axi absent]
MISSING: gh-axi (install: npm install -g gh-axi && gh-axi setup hooks)
[gh-axi below floor]
OUTDATED: gh-axi (installed: 0.1.19; requires 0.1.29; upgrade: gh-axi update)
[quota-axi absent]
MISSING: quota-axi (install: npm install -g quota-axi)
[quota-axi below floor]
OUTDATED: quota-axi (installed: 0.1.50; requires 0.1.51; upgrade: quota-axi update)
[tasks-axi absent]
MISSING: tasks-axi (install: npm install -g tasks-axi)
[tasks-axi at floor missing both capabilities]
OUTDATED: tasks-axi (installed: 0.2.6; requires 0.2.6 with update --archive-body and mv multi-ID; upgrade: npm install -g tasks-axi)
Evidence: Focused bootstrap behavior checks

Source: Focused bootstrap behavior checks

ok - bootstrap reports treehouse lease + tasks-axi/quota-axi bootstrap contracts
ok - bootstrap: an absent-tool case hides the tool in the fallback base path
ok - bootstrap separates an absent no-mistakes from one below its version floor
ok - bootstrap separates an absent gh-axi from one below its version floor
ok - bootstrap preserves legacy Lavish boards while recommending synchronous reply support
ok - bootstrap separates an absent tasks-axi from one below its floor or feature probe
ok - bootstrap separates an absent quota-axi from one below its version floor
ok - bootstrap: the tasks-axi compatibility verdict and reason travel exactly one process hop

Pipeline

Updates from git push no-mistakes

✅ **Intent** - passed

✅ No issues found.

✅ **Rebase** - passed

✅ No issues found.

✅ **Review** - passed

✅ No issues found.

✅ **Test** - passed

✅ No issues found.

  • Live validation: ✅ go - 4 of 4 scenarios driven live against the product
Scenario Result Live Evidence
Absent tools remain MISSING and floored tools at floor stay silent ✅ pass live bootstrap-outdated-live-transcript.log
Below-floor and capability failures report OUTDATED with the correct upgrade ✅ pass live bootstrap-outdated-live-transcript.log
Lavish presentation fallback and legacy-board behavior remain intact ✅ pass live bootstrap-outdated-focused.log
Tasks-axi capability reason crosses the one-hop handoff without repeated probes ✅ pass live bootstrap-outdated-focused.log
  • bash tests/fm-bootstrap.test.sh (attempted; broad file exceeded the 120-second command bound after the relevant checks)
  • Focused bootstrap selectors for reporting, absent-tool PATH hiding, no-mistakes, gh-axi, lavish-axi, tasks-axi, quota-axi, and tasks-axi handoff via the test definitions
  • Disposable live invocations of bin/fm-bootstrap.sh covering all floored tools at floor, each absent tool, below-floor versions, treehouse lease absence, and missing tasks-axi capabilities
  • git diff --check and targeted bash -n syntax checks
✅ **Document** - passed

✅ No issues found.

✅ **Lint** - passed

✅ No issues found.

✅ **Push** - passed

✅ No issues found.

Copy link
Copy Markdown
Owner

Speaking as Kun's firstmate:

Verdict: Diff reviewed (bin/fm-bootstrap.sh OUTDATED vs MISSING split + upgrade_cmd; bootstrap-diagnostics / AGENTS.md / docs/configuration.md + tests). Closes ready-for-pr #5440 (Closes verified; skill already distinguished upgrade vs install; script wrongly labeled below-floor as MISSING).

contract-class: restore — concrete existing default bootstrap diagnostic path; MISSING reserved for absent tools; OUTDATED carries tool's own updater (no first-install setup hooks / curl installer). Consent unchanged (detect, then ask, then act). Floor values unchanged.

VISION: Interface honesty — aligns (outdated ≠ missing). Authority explicit — aligns (no auto-upgrade). Scripts — aligns. Restart/spine/vendor — align. Scope — aligns (bootstrap diagnostics).

Attestation: MATCH ee0b3229a6e5d5174d8b2d4623392ebd24248eba. First-time fork CI: approved workflow runs 36159681057 (CI), 36159681297/36159799442 (Require no-mistakes) after diff review — no security risk. Firstmate flag: no. Waiting on: CI (not captain).

@greptile-apps

greptile-apps Bot commented Sep 28, 2026 •

Copy link
Copy Markdown

RetriggerConfidence Score: 5/5

[Medium risk] Updates tool diagnostics to distinguish outdated from missing.

The PR appears safe to merge based on the reviewed code.

Reviews (4) · Last reviewed commit: "no-mistakes(document): Refresh outdated-..." · Reviewed by Greptile

Comment thread bin/fm-bootstrap.sh Outdated
Comment thread tests/fm-bootstrap.test.sh
@kunchenguid

Copy link
Copy Markdown
Owner

Speaking as Kun's firstmate:

HEAD 8423c49ac6b0c8977b81a62a54f60a89fcf1eb88 (moved since 2026-09-25 stamp on ee0b3229). MERGEABLE/UNSTABLE. Author ironerumi not blocked. Tip vs main 29213a09: 2 commits / 5 files (bootstrap OUTDATED split). Greptile FAILURE non-blocking.

Closes #5440: body Closes #5440 — accurate (below-floor tools wrongly labeled MISSING; tip emits OUTDATED with version/requirement/upgrade_cmd; MISSING stays absent-only; floors/consent unchanged).

Contract-class: restore (re-verified tip-vs-main). Concrete existing default bootstrap diagnostic path; skill already distinguished upgrade vs install; script wrongly labeled below-floor as MISSING. No auto-upgrade; detect→ask→act unchanged.

VISION.md (each rule)

  1. One captain, one interface — aligns (honest outdated ≠ missing).
  2. Authority explicit — aligns (no automatic upgrades).
  3. Scripts own mechanics — aligns (bootstrap diagnostics).
  4. Restart non-event — aligns.
  5. Delegation with a spine — aligns.
  6. Fleet outlives vendor — aligns.
  7. Scope — aligns (bootstrap diagnostics only).

Attestation: MISMATCH — body still names ee0b3229a6e5d5174d8b2d4623392ebd24248eba, not tip HEAD. Refresh attestation to this HEAD.
Fork CI: re-approved this tip after diff review — CI 36438551362, Require no-mistakes 36438551267. No security risk.
Firstmate flag: no. Waiting on: author (attestation MATCH + green CI/NM), not the captain. No merge.

@ironerumi
ironerumi force-pushed the fm/upstream-5440-outdated-tools branch 2 times, most recently from a5cca66 to d92180e Compare September 29, 2026 17:20
@greptile-apps

greptile-apps Bot commented Sep 29, 2026

Copy link
Copy Markdown

Want your agent to iterate on Greptile's feedback? Try greploops.

@kunchenguid

Copy link
Copy Markdown
Owner

Speaking as Kun's firstmate (OSS triage, not the captain).

Thanks for re-raising this, @ironerumi. I re-read the thread and checked the new tip against main.

What changed since my 2026-09-28 stamp (head 8423c49a, attestation MISMATCH):

  • New head: 5760624a (5 commits on current main, 0 behind).
  • Attestation: now MATCH.
  • Mergeable: MERGEABLE (UNSTABLE while CI runs).
  • CI: the fork runs were held again. I reviewed the diff for security (bootstrap, tasks-axi lib, session-start, docs, and tests only; no workflows or secrets). I approved CI 37556003791 and Require no-mistakes 37556003675. NM body compliance is already green, and CI is running now.
  • Greptile: 5/5 on this head. Its two P2s (repeated tasks-axi probes, absent-tool tests depending on PATH) are addressed by the probe-reason handoff and the reworked absent-tool fixtures.

Contract-class: restore (re-verified on the tip; my own verdict)

On main, a present but below-floor or feature-incompatible treehouse, no-mistakes, gh-axi, quota-axi, or tasks-axi prints MISSING: … (install: …). The bootstrap-diagnostics contract already treats "upgrade" and "install" as different remedies. The tip prints OUTDATED: <tool> (installed: …; requires …; upgrade: …) and keeps MISSING for absent tools only. Floors are unchanged, and the detect, ask, act consent order is unchanged.
The new FM_TASKS_AXI_CHECK_REASON handoff is consumed and unset just like the existing verdict variable. It only avoids repeating probes and adds no new default-on surface.

VISION.md, rule by rule

  • One captain, one interface: aligns. The diagnostic is honest: outdated is not missing.
  • Authority is explicit: aligns. Nothing upgrades on its own, and consent is still required.
  • Scripts own the mechanics: aligns. Deterministic version and capability checks.
  • A restart is a non-event: aligns.
  • Delegation with a spine: aligns.
  • The fleet outlives any vendor: aligns.
  • Scope: aligns. Bootstrap diagnostics only.

Notes

waiting-ci: nothing is needed from you right now. If CI goes green on 5760624a and the PR stays MATCH and CLEAN, it is an auto-merge candidate on the next triage pass. No captain decision is needed.

@ironerumi
ironerumi force-pushed the fm/upstream-5440-outdated-tools branch from 5760624 to 983ddc5 Compare October 8, 2026 14:59
@kunchenguid

Copy link
Copy Markdown
Owner

Speaking as Kun's firstmate (OSS triage, not the captain).

Thanks for the new push, @ironerumi. I re-read the thread and checked head 983ddc50 against main.

Contract-class: restore (re-checked on this tip, my own verdict). On main, a treehouse, no-mistakes, gh-axi, quota-axi, or tasks-axi that is installed but below its floor, or missing a capability, still prints MISSING: … (install: …). The tip prints OUTDATED: <tool> (installed: …; requires …; upgrade: …) and keeps MISSING for tools that are actually absent. Floors are unchanged, nothing upgrades on its own, and the detect → ask → act consent order is unchanged. The FM_TASKS_AXI_CHECK_REASON handoff is consumed and unset the same way as the existing verdict variable, and it only accepts its closed vocabulary. Closes #5440 is back in the body, and it is accurate.

VISION.md, rule by rule: One captain, one interface: aligns (an outdated tool is no longer reported as missing). Authority is explicit: aligns (no automatic upgrades). Scripts own the mechanics: aligns. A restart is a non-event: n/a. Delegation with a spine: aligns. The fleet outlives any vendor: aligns. Scope: aligns (bootstrap diagnostics only).

Blocking, on you:

  1. "PR must be raised via no-mistakes" fails. The body was edited at 15:34Z, and its attestation is bound to ee0b3229, but the head is 983ddc50 ("Pipeline attestation head_sha does not match the current PR head"). Please re-raise through git push no-mistakes so the attestation binds this head.
  2. Behavior portable serial 2 was cancelled at the 30-minute job limit on this head. Please make sure it finishes on the re-raised head.

Fork CI didn't need approval on this pass (the runs weren't held). Security: none. This is bootstrap/docs/tests only, with no workflow or secret changes. Once an attested head is fully green and CLEAN, this is an auto-merge candidate as restore. No captain decision is needed.

@ironerumi
ironerumi force-pushed the fm/upstream-5440-outdated-tools branch from 983ddc5 to e762fd2 Compare October 9, 2026 01:42
@kunchenguid

Copy link
Copy Markdown
Owner

Speaking as Kun's firstmate (OSS triage, not the captain).

Thanks for the new attested head, @ironerumi. I re-checked e762fd20 against main 19fcbbde.

Contract-class: restore (re-verified). On main, an installed-but-below-floor or capability-missing tool still prints MISSING:; the tip prints OUTDATED: … and keeps MISSING for absent tools. Floors unchanged; no auto-upgrade; detect → ask → act consent unchanged. Closes #5440.

VISION.md: One captain / Authority explicit / Scripts own mechanics / Restart n/a / Delegation / Vendor / Scope: all align (bootstrap diagnostics only; no automatic upgrades).

Attestation: MATCH at e762fd20. no-mistakes green. Blocking CI: Behavior portable serial 4 failed — tests/fm-remote-reply.test.sh (not ok - the header-collision line was not captured). That suite is outside this PR's files; still, the tip is red until it is green. Outcome: waiting-ci. Auto-merge candidate as restore once fully green and CLEAN. No captain decision. Security: none.

detect_local_tools printed "MISSING:" for a treehouse without --lease, a
no-mistakes below 1.46.0, a gh-axi below its floor, and an incompatible
tasks-axi or quota-axi, so a supervisor read an installed tool as absent
and took the first-install remediation again.

Report those as "OUTDATED:" with the installed version, the requirement
and the tool's own upgrade command: treehouse update, no-mistakes update,
gh-axi update and quota-axi update. tasks-axi ships no self-updater, so it
keeps its install command. "MISSING:" stays for absent tools only, and
lavish-axi keeps PRESENTATION_UNAVAILABLE with its text fallback.

Update the bootstrap-diagnostics handler, the AGENTS.md section 13 trigger
list and the operator diagnostics in docs/configuration.md, and cover
absent, below-floor and at-floor for every floored tool in
tests/fm-bootstrap.test.sh.
Rendering the tasks-axi OUTDATED requirement text ran the two `--help`
capability probes again after the compatibility check had already run
them, including when session start handed bootstrap an incompatible
verdict. The check now records the reason behind its verdict - the
version floor, or the capability probes the build fails - and reuses it,
both within the process and across the existing one-hop handoff, so
naming a missing capability costs no second probe pass. A build below the
floor is answered by its version alone and never pays for capability
probes it cannot use.

The bootstrap tests that simulate a tool as absent removed it from the
fake bin directory while bootstrap kept searching the fallback base PATH,
so a real host install could satisfy the lookup instead of the expected
MISSING line. Those cases now hide the tool from the base path as well,
and a new case pins the contrast between a bare and a curated fallback.

Verified: the touched bootstrap suite passes, and its probe-count and
capability assertions fail against the pre-fix scripts. Run with a
fallback base PATH carrying real installs of the absent tools, the
pre-fix suite fails on "absent treehouse reports a missing tool" while
the fixed suite passes every case.
@ironerumi
ironerumi force-pushed the fm/upstream-5440-outdated-tools branch from e762fd2 to b769fd1 Compare October 12, 2026 13:13
@kunchenguid

Copy link
Copy Markdown
Owner

Speaking as Kun's firstmate: thanks @ironerumi — tip moved to b769fd1a (rebased/attested) since the 2026-10-09 waiting-ci stamp on e762fd20.

Contract-class: restore (re-verified). On main, installed-but-below-floor or capability-missing tools still print MISSING:; the tip prints OUTDATED: … and keeps MISSING for absent tools. Floors unchanged; no auto-upgrade; detect → ask → act unchanged. Closes #5440.

VISION.md: One captain / Authority / Scripts / Restart n/a / Spine / Vendor / Scope: all align (bootstrap diagnostics only).

Attestation: MATCH. NM green. CI on this tip: Behavior portable serial 2 cancelled at the ~30m job window (no failing test; last lines ok then The operation was canceled). Behavior tests (Herdr) failed on an unrelated concurrent secondmate recovery lock contention (tests/fm-backend-herdr-presentation-e2e.test.sh) — outside this PR's bootstrap/docs/tests files. I requeued failed jobs on CI run 38254228027 (--failed).

Status: waiting-ci. Auto-merge candidate as restore once fully green and CLEAN. No captain decision. Security: none.

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.

2 participants