Skip to content
Cockpit0.29.0
A snapshot: read at commit 707a04c7ce8 on 2026-10-18T00:06:01Z by majordomus 0.29.0. Nothing on this page is read again. See it live

I2760

A scope entry is one path, and a path context would refuse is refused at start

Where it stands

devtask.issue
Readiness
ready no dependency and no gate holds it; nobody has started it
Status
READY
Can start
startable
Milestone
Milestone status
ACTIVE
Wave
0
Waiting on
none
Holds back
none
Behind it in all
0
Evidence
0 of 1
A move writes the repository: it stamps one field of this issue's record and appends one event to the ledger, and a commit will carry both.
The same moves from a terminal

majordomus plan start I2760

majordomus plan verify I2760

majordomus plan done I2760

What it is

Objective
Refuse at `start` every scope entry that the task record cannot hold as one path or that `context` would refuse, and stop a recorded entry that `context` cannot resolve from breaking `context` and every commit hook.
Why
On 2026-10-15 a task in the worktree of #1170 was started with a pasted prompt as its scope. `start` normalised the comma-separated entry as one path, because it held no `..` and did not start with `/`, then joined the normalised paths with spaces. The record wrote each word as a scope path, about 270 of them, and three of them were a lone `/`. From then on `majordomus context` died with `refused-path '/'` at the first of them, and the pre-commit hook, which runs `context`, refused every commit in that worktree. On 2026-10-16 the repair lane found it only by reading the record, and had to close the task to commit.
Now
`start` refuses an entry that is empty, absolute or escapes the repository, but accepts one holding whitespace and then splits it into words. `context` calls mj_ctxd_target for each recorded scope path, and mj_ctxd_target exits the process on a path it refuses.
Wanted
`start` refuses, before writing anything, an entry holding whitespace and any entry `context` would refuse (absolute, escaping, or resolving outside the repository through a link), naming the entry and the remedy. mj_ctxd_refusal answers why a path is refused without exiting; mj_ctxd_target dies on that answer exactly as before; `context` prints a recorded entry it refuses as refused and goes on with the rest, so an old or hand-edited record degrades one line rather than the whole briefing.
Done when
unknown: the record declares no `completion`
Risk
unknown: the record declares no `risk`

Acceptance

  • majordomus start refuses a scope entry holding whitespace with exit 2, writes no task record, and names the entry
  • majordomus start refuses a scope entry that resolves outside the repository through a symbolic link
  • majordomus context, over a recorded scope that names `/`, prints that entry as refused, still prints the other scope paths' documents, and exits 0
  • majordomus context resolve <outside path> still refuses with the same message and exit code
  • case 3160 fails against master without the change
Validation
bash test/run.sh 3160_a_scope_entry_is_one_path 04_start_checkbin/majordomus plan validate
Evidence required
scope_entry_case
Evidence present
unknown: the record carries no `evidence` entries

Scope

Touches
lib/start.shlib/context.shlib/context_docs.shtest/cases/3160_a_scope_entry_is_one_path.sh.ai/repo/project/issues/I2760.yaml
Not
unknown: the record declares no `non_scope`
Depends on
none
Priority
p1
Profile
implementation
Parallel safe
true
Owner
unknown: the record declares no `owner`

The work so far

Branches
none
Merged
none
Commits
0
Trunk
master
Sessions
none
Created
2026-10-16
Updated
2026-10-16
Started
unknown: the record declares no `started_at`
Verified
unknown: the record declares no `verified_at`
Completed
unknown: the record declares no `completed_at`

Synchronisation

Adapter
scripts/github-sync
Repository
unknown: the derived plan's header carries no repository
External issue
unknown: a live GitHub state; this executable makes no network call, so only `scripts/github-sync --check` can answer it
State there
unknown: a live GitHub state; this executable makes no network call, so only `scripts/github-sync --check` can answer it

Findings

Nothing is wrong with these records.