Skip to content

rhei list rejects a workspace named by the current directory: ., ./, and bare index.rhei.md #120

Description

@vjovanov

Reproduced on 2026-08-30.

The task's historical fixture directory
~/f/rhei/fix/poll-attempt-budget-sentinel/rhei-runs/ticket-118 is not
present on this machine, so I recreated the same kind of valid directory
workspace from the supervised-ticket-fix template. The recreated workspace
was /tmp/rhei-list-repro-1788111508189312160; rhei validate succeeded
against it.

Versions and source commits:

  • The task's stated version: rhei 0.3.1, built from
    311ad90e9bf763ade13801f185f310449bba5c64 (v0.3.1) in a temporary
    detached worktree from ~/f/rhei/main.
  • Current installed release: rhei 0.3.2, source checkout
    ~/f/rhei/main at 01aee9d7d89d6c1f6f58e62d88a6f934bc2d81f5 (v0.3.2).
    It produced the same results.

Fixture setup:

$ cd ~/f/rhei/main
$ rhei instantiate supervised-ticket-fix README.md \
    --set title='rhei list reproduction' --set rounds=1 \
    --output /tmp/rhei-list-repro-1788111508189312160
Validation succeeded
$ rhei validate /tmp/rhei-list-repro-1788111508189312160
Validation succeeded

Using the rhei 0.3.1 binary, from inside that same workspace:

$ cd /tmp/rhei-list-repro-1788111508189312160
$ old_bin=/tmp/rhei-v031-target-1788111508189312160/release/rhei
$ "$old_bin" --version
rhei 0.3.1

$ "$old_bin" list .
  × invalid rhei path .
  help: check the plan's task metadata (**State:**, **Prior:**,
        **Assignee:**), then re-run: rhei validate <plan>
$ echo $?
1

$ "$old_bin" list ./
  × invalid rhei path ./
  help: check the plan's task metadata (**State:**, **Prior:**,
        **Assignee:**), then re-run: rhei validate <plan>
$ echo $?
1

$ "$old_bin" list index.rhei.md
  × invalid rhei path .
  help: check the plan's task metadata (**State:**, **Prior:**,
        **Assignee:**), then re-run: rhei validate <plan>
$ echo $?
1

$ "$old_bin" list ./index.rhei.md
  × invalid rhei path .
  help: check the plan's task metadata (**State:**, **Prior:**,
        **Assignee:**), then re-run: rhei validate <plan>
$ echo $?
1

$ "$old_bin" list ../rhei-list-repro-1788111508189312160
Task rhei-list-repro-1788111508189312160.ticket: rhei list reproduction [supervising]
  Task rhei-list-repro-1788111508189312160.ticket.plan-approval: Get the plan approved [plan-approval]
  Task rhei-list-repro-1788111508189312160.ticket.implement: Implement the fix [implement]
  Task rhei-list-repro-1788111508189312160.ticket.review-1: Review round 1 [review] (prior: rhei-list-repro-1788111508189312160.ticket.implement)
  Task rhei-list-repro-1788111508189312160.ticket.fix-1: Fix round 1 [fix] (prior: rhei-list-repro-1788111508189312160.ticket.review-1)
  Task rhei-list-repro-1788111508189312160.ticket.ship: Ship the fix [ship] (prior: rhei-list-repro-1788111508189312160.ticket.implement)
$ echo $?
0

$ "$old_bin" list /tmp/rhei-list-repro-1788111508189312160
Task rhei-list-repro-1788111508189312160.ticket: rhei list reproduction [supervising]
  Task rhei-list-repro-1788111508189312160.ticket.plan-approval: Get the plan approved [plan-approval]
  Task rhei-list-repro-1788111508189312160.ticket.implement: Implement the fix [implement]
  Task rhei-list-repro-1788111508189312160.ticket.review-1: Review round 1 [review] (prior: rhei-list-repro-1788111508189312160.ticket.implement)
  Task rhei-list-repro-1788111508189312160.ticket.fix-1: Fix round 1 [fix] (prior: rhei-list-repro-1788111508189312160.ticket.review-1)
  Task rhei-list-repro-1788111508189312160.ticket.ship: Ship the fix [ship] (prior: rhei-list-repro-1788111508189312160.ticket.implement)
$ echo $?
0

$ "$old_bin" list /tmp/rhei-list-repro-1788111508189312160/index.rhei.md
Task rhei-list-repro-1788111508189312160.ticket: rhei list reproduction [supervising]
  Task rhei-list-repro-1788111508189312160.ticket.plan-approval: Get the plan approved [plan-approval]
  Task rhei-list-repro-1788111508189312160.ticket.implement: Implement the fix [implement]
  Task rhei-list-repro-1788111508189312160.ticket.review-1: Review round 1 [review] (prior: rhei-list-repro-1788111508189312160.ticket.implement)
  Task rhei-list-repro-1788111508189312160.ticket.fix-1: Fix round 1 [fix] (prior: rhei-list-repro-1788111508189312160.ticket.review-1)
  Task rhei-list-repro-1788111508189312160.ticket.ship: Ship the fix [ship] (prior: rhei-list-repro-1788111508189312160.ticket.implement)
$ echo $?
0

The same loop also ran these literal shell arguments, with the same six-task
tree and exit status 0:

$ "$old_bin" list "$PWD"
$ echo $?
0
$ "$old_bin" list "$PWD/index.rhei.md"
$ echo $?
0

The current rhei 0.3.2 binary produced the same six-task tree and the same
exit statuses.

This is specifically a current-directory resolution defect: . and ./
fail, and a bare index.rhei.md is reduced to . and then fails, while the
same directory or plan works when named from its parent or by an absolute
path. The validation-help text is also misleading because the workspace is
valid and the problem is argument resolution. The practical workaround is to
pass the absolute path or name the workspace from its parent directory.

REPRO: yes

Filed by an agent triaging a local report.

Activity

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions