Skip to content

feat: adopt tasks-axi backlog mutations - #60

Merged
kunchenguid merged 6 commits into
mainfrom
fm/tx-adopt-flip-a3
Jun 23, 2026
Merged

kunchenguid merged 6 commits into
mainfrom
fm/tx-adopt-flip-a3

Conversation

@kunchenguid

Copy link
Copy Markdown
Owner

Intent

Flip ON full tasks-axi backlog mutation-adoption in firstmate's AGENTS.md (CLAUDE.md is a symlink to it). tasks-axi 0.1.1 is published and empirically verified to round-trip data/backlog.md byte-safely. The prior PR #55 shipped detection-only and AGENTS.md said mutation-adoption was DEFERRED; this change activates it. Specifically: (1) Section 3 TASKS_AXI bootstrap note now says WHEN tasks-axi is on PATH firstmate mutates data/backlog.md via its verbs instead of hand-editing, WHEN absent it hand-edits exactly as before with the silent guarantee intact. (2) Section 10 replaces the deferred paragraph with the ACTIVE policy plus a verb mapping of firstmate's real ops (add/done/update/block/unblock/ready/show/mv/render, all verified against tasks-axi 0.1.1 --help), notes tasks-axi auto-prunes Done to done_keep=10 and archives to data/done-archive.md which SUPERSEDES the manual prune convention when present, and keeps the In flight/Queued/Done format spec block intact since the verbs edit in place byte-exact. (3) The WHEN-ABSENT path stays the unchanged hand-edit behavior. (4) Secondmates inherit automatically via the same AGENTS.md + .tasks.toml. Deliberate scope decisions: this is purely a docs/policy change - tasks-axi itself was NOT changed, and data/backlog.md was NOT reformatted or migrated (it is gitignored/local and tasks-axi handles it in place). I also fixed one internal-consistency line in the section 2 layout that still called .tasks.toml 'currently inert', since that contradicts the flip. Prose follows the repo convention of one full sentence per physical line and plain '-' dashes (no em dashes).

What Changed

  • Captain, activates tasks-axi as the preferred data/backlog.md mutation path when a compatible 0.1.1+ install is detected, while preserving manual edits as the fallback when unavailable.
  • Adds fm-tasks-axi-lib.sh feature probing and wires bootstrap diagnostics so incompatible tasks-axi versions do not silently enter the active mutation policy.
  • Updates teardown guidance and tests to align Done pruning, handoff safety, date-gated queue handling, and shellcheck-clean behavior with the new active policy.

Risk Assessment

✅ Low: Captain, the remaining change is well-bounded to tasks-axi policy docs plus a small compatibility probe and teardown reminder, with no material merge-blocking issues found.

Testing

Captain, I inspected the base-to-target diff, ran the two relevant automated shell tests, verified the installed tasks-axi is version 0.1.1, checked the documented command help surface, and ran a disposable firstmate-style backlog fixture that used tasks-axi to add, start, update, block, unblock, show, complete, render, prune Done to 10, and archive older entries. All checks passed, evidence was written under the requested evidence directory, and the worktree was clean afterward.

Evidence: policy excerpts
$ readlink CLAUDE.md
AGENTS.md

$ cat .tasks.toml
backend = "markdown"

[markdown]
path = "data/backlog.md"
archive = "data/done-archive.md"
done_keep = 10

$ sed -n "112,120p" AGENTS.md
- `CREW_HARNESS_OVERRIDE: <name>` - record and use the override silently; surface a harness fact only if it actually blocks work or the captain asks.
- `FLEET_SYNC: <repo>: skipped: <reason>` - bootstrap continued; investigate only if the dirty, diverged, or offline clone blocks work.
- `TASKS_AXI: available` - an optional capability fact, not a problem; record it silently and never surface it to the captain.
  Bootstrap prints this only after the `tasks-axi` compatibility probe passes for version 0.1.1 or newer.
  When a compatible `tasks-axi` is on PATH, firstmate routes routine `data/backlog.md` mutations through its verbs instead of hand-editing the file, exactly as section 10 describes.
  When `tasks-axi` is absent or fails the compatibility probe, firstmate hand-edits `data/backlog.md` exactly as before, so the silent guarantee that backlog bookkeeping keeps working holds either way.
  It is never a missing tool to install: its absence or incompatibility only falls back to hand-editing and never blocks work.

Bootstrap's fleet refresh is bounded by `FM_FLEET_SYNC_BOOTSTRAP_TIMEOUT` seconds, default 20; a timeout is reported as a `FLEET_SYNC` skip and does not block startup.

$ sed -n "652,685p" AGENTS.md
- [x] <id> - <one line> - data/<id>/report.md (reported <date>)
`` `

Re-evaluate Queued on every teardown and every heartbeat: anything whose blocker is gone and whose time/date gate, if any, has arrived gets dispatched.

Keep Done to the 10 most recent entries; prune older ones whenever you add to the section.
Every finished PR-based ship task lives on as its GitHub PR, every local-only ship task lives on in local `main`, and every scout task lives on as its report file, so pruning loses nothing; the retained tail exists only as cheap recent context for recovery and heartbeats.

A tracked `.tasks.toml` at this repo root pins the `tasks-axi` markdown backend to `data/backlog.md`, with `done_keep = 10` and an archive at `data/done-archive.md`.
When a compatible `tasks-axi` is on PATH, firstmate mutates the backlog through its verbs instead of hand-editing, with secondmate handoffs still going through the validated helper described in section 6.
Compatible means the shared bootstrap probe accepts `tasks-axi --version` as 0.1.1 or newer.
The `## In flight` / `## Queued` / `## Done` format above stays the contract: the verbs edit `data/backlog.md` in place, byte-exact, preserving whatever item forms the file already uses - the bold in-flight `- **<id>**` form, the `- [ ]`/`- [x]` queued and done forms, and `blocked-by: <id> - <reason>` - rather than reformatting them.
Map firstmate's real backlog operations to the approved commands:

- File an item: `tasks-axi add <id> "<one line>" --kind <ship|scout> --repo <name>`, plus `--start` for immediate dispatch (In flight) or the default queue placement, and `--blocked-by <id>` (repeatable) when it waits on another task.
- Start an existing queued item: `tasks-axi start <id>` before dispatching work from Queued, after checking that blockers are gone and any time/date gate has arrived.
- Move a finished task to Done: `tasks-axi done <id> --pr <url>` for a PR-based ship, `--report <path>` for a scout, or `--note "local main"` for a local-only merge.
- Append a status note: `tasks-axi update <id> --append "<note>"`; replace fields with `--title`, `--body`, or `--body-file <path>`.
- Manage dependencies: `tasks-axi block <id> --by <other>` and `tasks-axi unblock <id> --by <other>`, then `tasks-axi ready` to list queued work with no unresolved blockers.
  This is a dependency check only; future-dated items still stay queued until their date arrives.
- Read an item's full notes: `tasks-axi show <id> --full`.
- Hand a task off to a secondmate home: keep using `bin/fm-backlog-handoff.sh <secondmate-id> <item-key>...`; do not call bare `tasks-axi mv` for this path, because the helper resolves and validates the secondmate home before moving anything.
- Normalize the file: `tasks-axi render` rewrites every id'd task in canonical form and leaves free-form lines untouched.

`tasks-axi done` auto-prunes Done to `done_keep = 10` and archives the pruned entries to `data/done-archive.md`, which supersedes the manual "keep Done to the 10 most recent" pruning above: when compatible `tasks-axi` is present you do not hand-prune Done, and nothing is lost because pruned entries are archived rather than deleted.
When `tasks-axi` is absent or fails the compatibility probe, every firstmate home (main and each secondmate) hand-edits `data/backlog.md` exactly as this section describes, including the manual Done pruning.
Secondmates inherit this automatically: each secondmate home carries the same `AGENTS.md` and its own `.tasks.toml`, so the same present-or-absent rule applies in every home with no separate setup.

## 11. Crewmate briefs

Scaffold with `bin/fm-brief.sh <id> <repo-name>` - it writes `data/<id>/brief.md` with the standard contract (branch setup, status-reporting protocol, push/merge rules, definition of done) and all paths filled in.
For a ship task the definition of done is shaped by the project's delivery mode (section 6): `no-mistakes` ends in the harness-appropriate no-mistakes validation pipeline, `direct-PR` has the crewmate push and open the PR itself, `local-only` has it stop at "ready in branch" for firstmate to review and merge locally.
The scaffold reads the mode via `fm-project-mode.sh`, so you do not pass it.
Ship briefs also include the project-memory contract: run `bin/fm-ensure-agents-md.sh` when the project already has agent-memory files or when the task produced durable project-intrinsic knowledge, then record proportionate learnings in `AGENTS.md`.
Evidence: tasks-axi help surface
$ tasks-axi add --help
usage: tasks-axi add <id> "<title>" [flags]
aliases: create
flags:
  --kind <ship|scout|docs|...>, --repo <name>, --body <text> or --body-file <path>
  --start (place in In flight) | --queue (place in Queued, default)
  --blocked-by <id> (repeatable, must exist), --pr <url>, --report <path>, --priority <0-4>
  --mint [--prefix <p>]   mint a slug-xx id from the title instead of passing one
examples:
  tasks-axi add lavish-foo-q9 "fix summary toggle" --kind ship --repo lavish-axi --start
  tasks-axi add fm-x "adopt lease" --blocked-by treehouse-lease-t4
  tasks-axi add "quick note" --mint
$ tasks-axi start --help
usage: tasks-axi start <id>
Move a task to In flight (idempotent).
examples:
  tasks-axi start firstmate-treehouse-lease-adopt
$ tasks-axi done --help
usage: tasks-axi done <id> [flags]
aliases: close
Re-running on an already Done task backfills links/notes without changing the close date.
flags:
  --pr <url>, --report <path>, --note "<text>"
  --keep <n> (default from config), --no-prune
examples:
  tasks-axi done sm-idle-handoff-q8 --pr https://github.com/o/r/pull/42
  tasks-axi done pr31-review-r6 --report data/pr31-review-r6/report.md
$ tasks-axi update --help
usage: tasks-axi update <id> [flags]
aliases: edit
flags:
  --title <text>, --body <text> or --body-file <path>, --append "<note>"
  --repo <name>, --kind <name>, --priority <0-4>, --pr <url>, --report <path>
examples:
  tasks-axi update nm-release-validation --append "step 3 in progress on lavish #87"
  tasks-axi update fm-x --repo firstmate --kind ship
$ tasks-axi block --help
usage: tasks-axi block <id> --by <other>
Record a blocked-by dependency edge (idempotent).
The blocker named by --by must already exist.
examples:
  tasks-axi block firstmate-treehouse-lease-adopt --by treehouse-lease-t4
$ tasks-axi unblock --help
usage: tasks-axi unblock <id> --by <other>
Clear a blocked-by dependency edge (idempotent).
$ tasks-axi ready --help
usage: tasks-axi ready [--repo <name>]
List unblocked queued work - the tasks dispatchable right now.
$ tasks-axi show --help
usage: tasks-axi show <id> [--full]
aliases: view
examples:
  tasks-axi show homemux-h7
  tasks-axi show homemux-h7 --full
$ tasks-axi mv --help
usage: tasks-axi mv <id> --to <path-or-dir>
Move a task to another backlog file (generalizes a hand-rolled line move).
Fails while active tasks still block on this id.
examples:
  tasks-axi mv hibit-cert-cleanup --to ../homemux/data/backlog.md
$ tasks-axi render --help
usage: tasks-axi render
Normalize the backlog file: rewrite every id'd task in canonical form.
Free-form lines are left untouched.
Evidence: tasks-axi end-to-end transcript
$ tasks-axi --version
0.1.1

$ cat .tasks.toml
backend = "markdown"

[markdown]
path = "data/backlog.md"
archive = "data/done-archive.md"
done_keep = 10

$ tasks-axi add prereq-a1 "ship prerequisite" --kind ship --repo firstmate
task:
  id: prereq-a1
  title: ship prerequisite
  state: queued
  blocked: no
  blocked_by: none
  kind: ship
  repo: firstmate
  priority: "-"
  created: 2026-06-23
  closed: "-"
  deps: none
  links: none
  body: ""
help[2]:
  - Run `tasks-axi start prereq-a1` to move it to in flight
  - Run `tasks-axi block prereq-a1 --by <other>` to record a dependency

$ tasks-axi add dependent-a1 "adopt tasks-axi mutations" --kind docs --repo firstmate --blocked-by prereq-a1
task:
  id: dependent-a1
  title: adopt tasks-axi mutations
  state: queued
  blocked: yes
  blocked_by: prereq-a1
  kind: docs
  repo: firstmate
  priority: "-"
  created: 2026-06-23
  closed: "-"
  deps: "blocked-by:prereq-a1"
  links: none
  body: ""
help[2]:
  - Run `tasks-axi start dependent-a1` to move it to in flight
  - Run `tasks-axi block dependent-a1 --by <other>` to record a dependency

$ tasks-axi ready
count: 1
ready[1]{id,state,kind,repo,title}:
  prereq-a1,queued,ship,firstmate,ship prerequisite
help[1]:
  - Run `tasks-axi start <id>` to dispatch one of these

$ tasks-axi start prereq-a1
start:
  id: prereq-a1
  state: in_flight
help[1]:
  - Run `tasks-axi done prereq-a1 --pr <url>` when it ships

$ tasks-axi update prereq-a1 --append "Validated compatible tasks-axi mutation path."
task:
  id: prereq-a1
  title: ship prerequisite
  state: in_flight
  blocked: no
  blocked_by: none
  kind: ship
  repo: firstmate
  priority: "-"
  created: 2026-06-23
  closed: "-"
  deps: none
  links: none
  body: Validated compatible tasks-axi mutation path.
help[1]:
  - Run `tasks-axi show prereq-a1 --full` to see the result

$ tasks-axi show prereq-a1 --full
task:
  id: prereq-a1
  title: ship prerequisite
  state: in_flight
  blocked: no
  blocked_by: none
  kind: ship
  repo: firstmate
  priority: "-"
  created: 2026-06-23
  closed: "-"
  deps: none
  links: none
  body: Validated compatible tasks-axi mutation path.

$ tasks-axi done prereq-a1 --pr https://github.com/kunchenguid/firstmate/pull/58
done:
  id: prereq-a1
  state: done
  pruned: 0
help[1]:
  - Run `tasks-axi ready` to dispatch work unblocked by this

$ tasks-axi ready
count: 1
ready[1]{id,state,kind,repo,title}:
  dependent-a1,queued,docs,firstmate,adopt tasks-axi mutations
help[1]:
  - Run `tasks-axi start <id>` to dispatch one of these

$ tasks-axi add manual-blocker-a1 "manual blocker" --kind ship --repo firstmate
task:
  id: manual-blocker-a1
  title: manual blocker
  state: queued
  blocked: no
  blocked_by: none
  kind: ship
  repo: firstmate
  priority: "-"
  created: 2026-06-23
  closed: "-"
  deps: none
  links: none
  body: ""
help[2]:
  - Run `tasks-axi start manual-blocker-a1` to move it to in flight
  - Run `tasks-axi block manual-blocker-a1 --by <other>` to record a dependency

$ tasks-axi block dependent-a1 --by manual-blocker-a1
block:
  id: dependent-a1
  blocked_by: manual-blocker-a1
help[2]:
  - Run `tasks-axi unblock dependent-a1 --by <other>` to clear it
  - Run `tasks-axi ready` to see what is still dispatchable

$ tasks-axi ready
count: 1
ready[1]{id,state,kind,repo,title}:
  manual-blocker-a1,queued,ship,firstmate,manual blocker
help[1]:
  - Run `tasks-axi start <id>` to dispatch one of these

$ tasks-axi unblock dependent-a1 --by manual-blocker-a1
unblock:
  id: dependent-a1
  blocked_by: manual-blocker-a1
help[1]:
  - Run `tasks-axi ready` to see newly unblocked work

$ tasks-axi start dependent-a1
start:
  id: dependent-a1
  state: in_flight
help[1]:
  - Run `tasks-axi done dependent-a1 --pr <url>` when it ships

$ tasks-axi done dependent-a1 --pr https://github.com/kunchenguid/firstmate/pull/58
done:
  id: dependent-a1
  state: done
  pruned: 0
help[1]:
  - Run `tasks-axi ready` to dispatch work unblocked by this

$ tasks-axi add archive-sample-01 "completed backlog sample 01" --kind ship --repo firstmate --start
task:
  id: archive-sample-01
  title: completed backlog sample 01
  state: in_flight
  blocked: no
  blocked_by: none
  kind: ship
  repo: firstmate
  priority: "-"
  created: 2026-06-23
  closed: "-"
  deps: none
  links: none
  body: ""
help[2]:
  - Run `tasks-axi start archive-sample-01` to move it to in flight
  - Run `tasks-axi block archive-sample-01 --by <other>` to record a dependency

$ tasks-axi done archive-sample-01 --note "fixture complete"
done:
  id: archive-sample-01
  state: done
  pruned: 0
help[1]:
  - Run `tasks-axi ready` to dispatch work unblocked by this

$ tasks-axi add archive-sample-02 "completed backlog sample 02" --kind ship --repo firstmate --start
task:
  id: archive-sample-02
  title: completed backlog sample 02
  state: in_flight
  blocked: no
  blocked_by: none
  kind: ship
  repo: firstmate
  priority: "-"
  created: 2026-06-23
  closed: "-"
  deps: none
  links: none
  body: ""
help[2]:
  - Run `tasks-axi start archive-sample-02` to move it to in flight
  - Run `tasks-axi block archive-sample-02 --by <other>` to record a dependency

$ tasks-axi done archive-sample-02 --note "fixture complete"
done:
  id: archive-sample-02
  state: done
  pruned: 0
help[1]:
  - Run `tasks-axi ready` to dispatch work unblocked by this

$ tasks-axi add archive-sample-03 "completed backlog sample 03" --kind ship --repo firstmate --start
task:
  id: archive-sample-03
  title: completed backlog sample 03
  state: in_flight
  blocked: no
  blocked_by: none
  kind: ship
  repo: firstmate
  priority: "-"
  created: 2026-06-23
  closed: "-"
  deps: none
  links: none
  body: ""
help[2]:
  - Run `tasks-axi start archive-sample-03` to move it to in flight
  - Run `tasks-axi block archive-sample-03 --by <other>` to record a dependency

$ tasks-axi done archive-sample-03 --note "fixture complete"
done:
  id: archive-sample-03
  state: done
  pruned: 0
help[1]:
  - Run `tasks-axi ready` to dispatch work unblocked by this

$ tasks-axi add archive-sample-04 "completed backlog sample 04" --kind ship --repo firstmate --start
task:
  id: archive-sample-04
  title: completed backlog sample 04
  state: in_flight
  blocked: no
  blocked_by: none
  kind: ship
  repo: firstmate
  priority: "-"
  created: 2026-06-23
  closed: "-"
  deps: none
  links: none
  body: ""
help[2]:
  - Run `tasks-axi start archive-sample-04` to move it to in flight
  - Run `tasks-axi block archive-sample-04 --by <other>` to record a dependency

$ tasks-axi done archive-sample-04 --note "fixture complete"
done:
  id: archive-sample-04
  state: done
  pruned: 0
help[1]:
  - Run `tasks-axi ready` to dispatch work unblocked by this

$ tasks-axi add archive-sample-05 "completed backlog sample 05" --kind ship --repo firstmate --start
task:
  id: archive-sample-05
  title: completed backlog sample 05
  state: in_flight
  blocked: no
  blocked_by: none
  kind: ship
  repo: firstmate
  priority: "-"
  created: 2026-06-23
  closed: "-"
  deps: none
  links: none
  body: ""
help[2]:
  - Run `tasks-axi start archive-sample-05` to move it to in flight
  - Run `tasks-axi block archive-sample-05 --by <other>` to record a dependency

$ tasks-axi done archive-sample-05 --note "fixture complete"
done:
  id: archive-sample-05
  state: done
  pruned: 0
help[1]:
  - Run `tasks-axi ready` to dispatch work unblocked by this

$ tasks-axi add archive-sample-06 "completed backlog sample 06" --kind ship --repo firstmate --start
task:
  id: archive-sample-06
  title: completed backlog sample 06
  state: in_flight
  blocked: no
  blocked_by: none
  kind: ship
  repo: firstmate
  priority: "-"
  created: 2026-06-23
  closed: "-"
  deps: none
  links: none
  body: ""
help[2]:
  - Run `tasks-axi start archive-sample-06` to move it to in flight
  - Run `tasks-axi block archive-sample-06 --by <other>` to record a dependency

$ tasks-axi done archive-sample-06 --note "fixture complete"
done:
  id: archive-sample-06
  state: done
  pruned: 0
help[1]:
  - Run `tasks-axi ready` to dispatch work unblocked by this

$ tasks-axi add archive-sample-07 "completed backlog sample 07" --kind ship --repo firstmate --start
task:
  id: archive-sample-07
  title: completed backlog sample 07
  state: in_flight
  blocked: no
  blocked_by: none
  kind: ship
  repo: firstmate
  priority: "-"
  created: 2026-06-23
  closed: "-"
  deps: none
  links: none
  body: ""
help[2]:
  - Run `tasks-axi start archive-sample-07` to move it to in flight
  - Run `tasks-axi block archive-sample-07 --by <other>` to record a dependency

$ tasks-axi done archive-sample-07 --note "fixture complete"
done:
  id: archive-sample-07
  state: done
  pruned: 0
help[1]:
  - Run `tasks-axi ready` to dispatch work unblocked by this

$ tasks-axi add archive-sample-08 "completed backlog sample 08" --kind ship --repo firstmate --start
task:
  id: archive-sample-08
  title: completed backlog sample 08
  state: in_flight
  blocked: no
  blocked_by: none
  kind: ship
  repo: firstmate
  priority: "-"
  created: 2026-06-23
  closed: "-"
  deps: none
  links: none
  body: ""
help[2]:
  - Run `tasks-axi start archive-sample-08` to move it to in flight
  - Run `tasks-axi block archive-sample-08 --by <other>` to record a dependency

$ tasks-axi done archive-sample-08 --note "fixture complete"
done:
  id: archive-sample-08
  state: done
  pruned: 0
help[1]:
  - Run `tasks-axi ready` to dispatch work unblocked by this

$ tasks-axi add archive-sample-09 "completed backlog sample 09" --kind ship --repo firstmate --start
task:
  id: archive-sample-09
  title: completed backlog sample 09
  state: in_flight
  blocked: no
  blocked_by: none
  kind: ship
  repo: firstmate
  priority: "-"
  created: 2026-06-23
  closed: "-"
  deps: none
  links: none
  body: ""
help[2]:
  - Run `tasks-axi start archive-sample-09` to move it to in flight
  - Run `tasks-axi block archive-sample-09 --by <other>` to record a dependency

$ tasks-axi done archive-sample-09 --note "fixture complete"
done:
  id: archive-sample-09
  state: done
  pruned: 1
help[1]:
  - Run `tasks-axi ready` to dispatch work unblocked by this

$ tasks-axi add archive-sample-10 "completed backlog sample 10" --kind ship --repo firstmate --start
task:
  id: archive-sample-10
  title: completed backlog sample 10
  state: in_flight
  blocked: no
  blocked_by: none
  kind: ship
  repo: firstmate
  priority: "-"
  created: 2026-06-23
  closed: "-"
  deps: none
  links: none
  body: ""
help[2]:
  - Run `tasks-axi start archive-sample-10` to move it to in flight
  - Run `tasks-axi block archive-sample-10 --by <other>` to record a dependency

$ tasks-axi done archive-sample-10 --note "fixture complete"
done:
  id: archive-sample-10
  state: done
  pruned: 1
help[1]:
  - Run `tasks-axi ready` to dispatch work unblocked by this

$ tasks-axi add archive-sample-11 "completed backlog sample 11" --kind ship --repo firstmate --start
task:
  id: archive-sample-11
  title: completed backlog sample 11
  state: in_flight
  blocked: no
  blocked_by: none
  kind: ship
  repo: firstmate
  priority: "-"
  created: 2026-06-23
  closed: "-"
  deps: none
  links: none
  body: ""
help[2]:
  - Run `tasks-axi start archive-sample-11` to move it to in flight
  - Run `tasks-axi block archive-sample-11 --by <other>` to record a dependency

$ tasks-axi done archive-sample-11 --note "fixture complete"
done:
  id: archive-sample-11
  state: done
  pruned: 1
help[1]:
  - Run `tasks-axi ready` to dispatch work unblocked by this

$ tasks-axi render
render:
  normalized: 11

$ tasks-axi show archive-sample-11 --full
task:
  id: archive-sample-11
  title: completed backlog sample 11
  state: done
  blocked: no
  blocked_by: none
  kind: ship
  repo: firstmate
  priority: "-"
  created: "-"
  closed: 2026-06-23
  deps: none
  links: none
  body: fixture complete

$ tasks-axi ready
count: 1
ready[1]{id,state,kind,repo,title}:
  manual-blocker-a1,queued,ship,firstmate,manual blocker
help[1]:
  - Run `tasks-axi start <id>` to dispatch one of these

$ sed -n "1,220p" data/backlog.md
# Backlog

## In flight
## Queued
- [ ] manual-blocker-a1 - manual blocker (repo: firstmate) (kind: ship) (since 2026-06-23)
## Done
- [x] archive-sample-11 - completed backlog sample 11 (repo: firstmate) (kind: ship) (done 2026-06-23)
  fixture complete
- [x] archive-sample-10 - completed backlog sample 10 (repo: firstmate) (kind: ship) (done 2026-06-23)
  fixture complete
- [x] archive-sample-09 - completed backlog sample 09 (repo: firstmate) (kind: ship) (done 2026-06-23)
  fixture complete
- [x] archive-sample-08 - completed backlog sample 08 (repo: firstmate) (kind: ship) (done 2026-06-23)
  fixture complete
- [x] archive-sample-07 - completed backlog sample 07 (repo: firstmate) (kind: ship) (done 2026-06-23)
  fixture complete
- [x] archive-sample-06 - completed backlog sample 06 (repo: firstmate) (kind: ship) (done 2026-06-23)
  fixture complete
- [x] archive-sample-05 - completed backlog sample 05 (repo: firstmate) (kind: ship) (done 2026-06-23)
  fixture complete
- [x] archive-sample-04 - completed backlog sample 04 (repo: firstmate) (kind: ship) (done 2026-06-23)
  fixture complete
- [x] archive-sample-03 - completed backlog sample 03 (repo: firstmate) (kind: ship) (done 2026-06-23)
  fixture complete
- [x] archive-sample-02 - completed backlog sample 02 (repo: firstmate) (kind: ship) (done 2026-06-23)
  fixture complete

$ sed -n "1,220p" data/done-archive.md

## Archived 2026-06-23
- [x] prereq-a1 - ship prerequisite https://github.com/kunchenguid/firstmate/pull/58 (repo: firstmate) (kind: ship) (merged 2026-06-23)
  Validated compatible tasks-axi mutation path.

## Archived 2026-06-23
- [x] dependent-a1 - adopt tasks-axi mutations https://github.com/kunchenguid/firstmate/pull/58 blocked-by: prereq-a1 (repo: firstmate) (kind: docs) (merged 2026-06-23)

## Archived 2026-06-23
- [x] archive-sample-01 - completed backlog sample 01 (repo: firstmate) (kind: ship) (done 2026-06-23)
  fixture complete
Evidence: fixture backlog after tasks-axi render
# Backlog

## In flight
## Queued
- [ ] manual-blocker-a1 - manual blocker (repo: firstmate) (kind: ship) (since 2026-06-23)
## Done
- [x] archive-sample-11 - completed backlog sample 11 (repo: firstmate) (kind: ship) (done 2026-06-23)
  fixture complete
- [x] archive-sample-10 - completed backlog sample 10 (repo: firstmate) (kind: ship) (done 2026-06-23)
  fixture complete
- [x] archive-sample-09 - completed backlog sample 09 (repo: firstmate) (kind: ship) (done 2026-06-23)
  fixture complete
- [x] archive-sample-08 - completed backlog sample 08 (repo: firstmate) (kind: ship) (done 2026-06-23)
  fixture complete
- [x] archive-sample-07 - completed backlog sample 07 (repo: firstmate) (kind: ship) (done 2026-06-23)
  fixture complete
- [x] archive-sample-06 - completed backlog sample 06 (repo: firstmate) (kind: ship) (done 2026-06-23)
  fixture complete
- [x] archive-sample-05 - completed backlog sample 05 (repo: firstmate) (kind: ship) (done 2026-06-23)
  fixture complete
- [x] archive-sample-04 - completed backlog sample 04 (repo: firstmate) (kind: ship) (done 2026-06-23)
  fixture complete
- [x] archive-sample-03 - completed backlog sample 03 (repo: firstmate) (kind: ship) (done 2026-06-23)
  fixture complete
- [x] archive-sample-02 - completed backlog sample 02 (repo: firstmate) (kind: ship) (done 2026-06-23)
  fixture complete
Evidence: fixture done archive

## Archived 2026-06-23
- [x] prereq-a1 - ship prerequisite https://github.com/kunchenguid/firstmate/pull/58 (repo: firstmate) (kind: ship) (merged 2026-06-23)
  Validated compatible tasks-axi mutation path.

## Archived 2026-06-23
- [x] dependent-a1 - adopt tasks-axi mutations https://github.com/kunchenguid/firstmate/pull/58 blocked-by: prereq-a1 (repo: firstmate) (kind: docs) (merged 2026-06-23)

## Archived 2026-06-23
- [x] archive-sample-01 - completed backlog sample 01 (repo: firstmate) (kind: ship) (done 2026-06-23)
  fixture complete
Evidence: bootstrap test transcript
ok - bootstrap accepts treehouse get --lease support
ok - bootstrap reports treehouse without get --lease support
ok - bootstrap reports compatible optional tasks-axi availability
ok - bootstrap ignores incompatible optional tasks-axi
Evidence: teardown test transcript
ok - local-only worktree with HEAD on a fork remote is torn down (fix holds)
ok - teardown prompts tasks-axi backlog refresh when compatible
ok - local-only worktree with truly unpushed work is refused (safety preserved)
ok - local-only worktree with work merged into local main is torn down (no regression)
ok - no-mistakes worktree with HEAD on origin is torn down (no regression)
ok - no-mistakes worktree with truly unpushed work is refused (no regression)
ok - local-only worktree with unpushed work is torn down under --force (escape hatch)

Pipeline

Updates from git push no-mistakes

✅ **intent** - passed

✅ No issues found.

✅ **Rebase** - passed

✅ No issues found.

🔧 **Review** - 3 issues found → auto-fixed (3) ✅
  • 🚨 AGENTS.md:663 - The active tasks-axi policy omits the dispatch path for an existing queued task. Section 7 still requires re-evaluating Queued and dispatching unblocked or date-due work, but under the new 'no hand-editing when tasks-axi is present' rule the documented verb list only covers add --start for new immediate dispatch and never tells firstmate to run tasks-axi start &lt;id&gt; for an already-queued item. That can leave launched work recorded as Queued, making recovery or heartbeat dispatch it again.
  • ⚠️ AGENTS.md:668 - This new mapping tells firstmate to hand off secondmate work with bare tasks-axi mv, but the rest of AGENTS.md still directs handoffs through bin/fm-backlog-handoff.sh. That helper resolves the registered secondmate home, validates the .fm-secondmate-home marker, refuses in-flight items, and provides idempotent all-or-nothing moves. The new policy either conflicts with those existing instructions or bypasses their firstmate-specific safety checks, so the handoff path should be reconciled before enabling mandatory tasks-axi mutations.
  • ⚠️ AGENTS.md:659 - The README still says tasks-axi is detection-only and backlog mutations remain manual, contradicting the new active policy here. Since README is the public operator overview, merge would leave two repo-level sources giving opposite instructions about whether firstmate should use tasks-axi.

🔧 Fix: Captain, document tasks-axi start and handoff policy
2 warnings still open:

  • ⚠️ AGENTS.md:115 - The new policy activates tasks-axi for any executable on PATH, but bootstrap still detects it with a bare command-v check while section 10 relies on 0.1.1-specific verbs, flags, pruning, and format compatibility. An older incompatible tasks-axi install would now be treated as safe and could fail or mutate the durable backlog incorrectly. Gate adoption on a version or feature probe, or explicitly fall back to manual edits when the probe fails.
  • ⚠️ AGENTS.md:672 - This says tasks-axi done supersedes manual Done pruning, but the operational teardown path still tells firstmate to move the task to Done and keep Done to 10 manually, including the printed prompt in bin/fm-teardown.sh. Since that prompt appears at the exact moment the backlog must be updated, it can steer agents around tasks-axi done and skip archive-backed pruning. Update the teardown instructions or prompt to use tasks-axi done when available.

🔧 Fix: Gate tasks-axi adoption and teardown prompts
1 warning still open:

  • ⚠️ AGENTS.md:670 - tasks-axi ready only reports queued tasks without unresolved blockers, but the existing protocol also treats future date-gated queued items as not dispatchable until their date arrives. This line now describes ready as a complete 'dispatchable right now' list, so a firstmate following the new policy can start future-dated work early. Clarify that ready is dependency-only and that date gates still need the existing manual check before tasks-axi start.

🔧 Fix: Clarify tasks-axi date gates
✅ Re-checked - no issues remain.

✅ **Test** - passed

✅ No issues found.

  • git diff 3718fd0cd010a0a2668493d8c11eeb6331904d7d..f33ebc40e8dfd68183348e5e415585af30f6e54f -- AGENTS.md README.md bin/fm-bootstrap.sh bin/fm-tasks-axi-lib.sh bin/fm-teardown.sh tests/fm-bootstrap.test.sh tests/fm-teardown.test.sh
  • tests/fm-bootstrap.test.sh > /var/folders/5x/4nqprlbx0518k3ybcb1sz6gr0000gn/T/no-mistakes-evidence/01KVV986B2GZC3950RQ7CS223X/fm-bootstrap.test.log 2>&1
  • tests/fm-teardown.test.sh > /var/folders/5x/4nqprlbx0518k3ybcb1sz6gr0000gn/T/no-mistakes-evidence/01KVV986B2GZC3950RQ7CS223X/fm-teardown.test.log 2>&1
  • command -v tasks-axi and tasks-axi --version
  • tasks-axi --help, tasks-axi add --help, tasks-axi done --help, and tasks-axi ready --help
  • for cmd in add start done update block unblock ready show mv render; do tasks-axi "$cmd" --help; done > /var/folders/5x/4nqprlbx0518k3ybcb1sz6gr0000gn/T/no-mistakes-evidence/01KVV986B2GZC3950RQ7CS223X/tasks-axi-help-surface.log
  • ./run-e2e.sh &gt; /var/folders/5x/4nqprlbx0518k3ybcb1sz6gr0000gn/T/no-mistakes-evidence/01KVV986B2GZC3950RQ7CS223X/tasks-axi-e2e.log 2&gt;&amp;1 from the evidence fixture
  • readlink CLAUDE.md, cat .tasks.toml, and targeted sed excerpts from AGENTS.md into policy-excerpts.txt
  • git status --short after testing to confirm no worktree artifacts were left behind
✅ **Document** - passed

✅ No issues found.

✅ **Lint** - passed

✅ No issues found.

✅ **Push** - passed

✅ No issues found.

Section 3 TASKS_AXI note and section 10 now describe the active policy:
when tasks-axi is on PATH, route backlog mutations through its verbs
(add/done/update/block/unblock/ready/show/mv/render) and rely on its
auto-prune+archive instead of hand-editing; when absent, hand-edit as
before. Secondmates inherit via the same AGENTS.md and .tasks.toml.
@kunchenguid
kunchenguid merged commit a1d66d6 into main Jun 23, 2026
4 checks passed
@kunchenguid
kunchenguid deleted the fm/tx-adopt-flip-a3 branch June 23, 2026 23:06
augustomklee added a commit to augustomklee/firstmate that referenced this pull request Jun 24, 2026
Port upstream batch 3: optional tasks-axi backlog support (kunchenguid#55 + kunchenguid#60)
leo1oel added a commit to leo1oel/nemo that referenced this pull request Jun 25, 2026
Port upstream tasks-axi support (kunchenguid#55/kunchenguid#60) adapted to the herdr/Claude-only
fork: provisioning lives in the dotfiles update-tools.sh axi loop (this fork
has no fm-bootstrap), and a compatible tasks-axi is optional everywhere.

- .tasks.toml: pin the tasks-axi markdown backend to data/backlog.md
  (done_keep=10, archive data/done-archive.md)
- bin/fm-tasks-axi-lib.sh: shared 0.1.1+ compatibility probe
- bin/fm-teardown.sh: route the post-teardown reminder through tasks-axi
  done/ready when compatible, else the hand-edit fallback; the secondmate
  retirement path keeps its data/secondmates.md hint
- AGENTS.md sections 2/3/7/10, README, CONTRIBUTING: document the verb
  mapping and present-or-absent fallback; add .tasks.toml to tracked material
- tests/fm-teardown.test.sh: compatible-tasks-axi reminder test
vipentti pushed a commit to vipentti/firstmate that referenced this pull request Aug 5, 2026
* docs: flip on tasks-axi backlog mutation-adoption

Section 3 TASKS_AXI note and section 10 now describe the active policy:
when tasks-axi is on PATH, route backlog mutations through its verbs
(add/done/update/block/unblock/ready/show/mv/render) and rely on its
auto-prune+archive instead of hand-editing; when absent, hand-edit as
before. Secondmates inherit via the same AGENTS.md and .tasks.toml.

* no-mistakes(review): Captain, document tasks-axi start and handoff policy

* no-mistakes(review): Gate tasks-axi adoption and teardown prompts

* no-mistakes(review): Clarify tasks-axi date gates

* no-mistakes(document): Sync tasks-axi backlog docs

* no-mistakes(lint): Shellcheck fixes applied
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