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
0of1
Moves
plan.transitionWhat 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.