Refusals and findings
This reference is generated by anb skill. Command descriptions come from the CLI definitions; examples run against a scratch notebook. CI checks the committed copy for drift.
Refusals carry an error code, a message explaining the condition and a try array of recovery commands. Fill placeholders before running a suggested command. JSON and TOON contain the same values.
The scratch notebook
Section titled “The scratch notebook”The scratch notebook the refusals below run against:
$ anb add task "Ship the parser" --tag epicok: addid: task.ship-the-parserpath: tasks/task.ship-the-parser.md$ anb add task "Grammar parser accepts fences" --from task.ship-the-parserok: addid: task.grammar-parser-accepts-fencespath: tasks/task.grammar-parser-accepts-fences.md$ anb add decision "Fences never nest" --kind ruleok: addid: decision.fences-never-nestpath: decisions/decision.fences-never-nest.md$ anb add note Fence --kind termok: addid: note.fencepath: notes/note.fence.mdunknown-id
Section titled “unknown-id”No record carries the id.
$ anb start task.parsererror: unknown-idmessage: no record `task.parser`try[1]: anb listinvalid-transition
Section titled “invalid-transition”The record’s state does not allow the move; the valid moves are listed, each with its command.
$ anb close task.ship-the-parser --body "The parser is verified."error: invalid-transitionmessage: "`task.ship-the-parser` is open; valid: start, close --reason"try[2]: anb start task.ship-the-parser,"anb close task.ship-the-parser --reason \"<why>\""Another person holds the Task, having started it or been handed it. start takes work nobody holds, so a held Task changes hands through edit --taken-by first, on purpose.
$ anb edit task.grammar-parser-accepts-fences --taken-by Graceok: editid: task.grammar-parser-accepts-fenceschanged[1]: taken-byalready: false$ anb start task.grammar-parser-accepts-fenceserror: takenmessage: `task.grammar-parser-accepts-fences` is taken by Gracetry[2]: "anb edit task.grammar-parser-accepts-fences --taken-by \"<name>\"",anb show task.grammar-parser-accepts-fencesinvalid-argument
Section titled “invalid-argument”A flag or value is invalid for this command or record type. The reply suggests a valid form.
$ anb add decision Tabs --priority 2error: invalid-argumentmessage: "priority: applies only to a task"try[1]: "anb add decision \"<title>\""$ anb close task.ship-the-parsererror: invalid-argumentmessage: "close: pass one of --body \"<outcome>\", --body-file <path>, --reason \"<why>\", or --resolved-by <id>"try[2]: "anb close task.ship-the-parser --body \"<outcome>\"","anb close task.ship-the-parser --reason \"<why>\""dangling-ref
Section titled “dangling-ref”An envelope reference names a record that does not exist.
$ anb add task "A child" --from task.ghosterror: dangling-refmessage: "from: `task.ghost` names no record"try[2]: "anb add task \"<title>\" --id task.ghost",anb listwould-cycle
Section titled “would-cycle”The proposed dependency would create a cycle. The reply prints the cycle.
$ anb block task.ship-the-parser task.grammar-parser-accepts-fencesok: blockid: task.ship-the-parseron: task.grammar-parser-accepts-fencesalready: false$ anb block task.grammar-parser-accepts-fences task.ship-the-parsererror: would-cyclemessage: "the edge would close a dependency cycle: task.grammar-parser-accepts-fences → task.ship-the-parser → task.grammar-parser-accepts-fences"try[1]: anb unblock task.ship-the-parser task.grammar-parser-accepts-fencesunfinished-dependencies
Section titled “unfinished-dependencies”A Task can be started to coordinate its parts, but successful completion requires its prerequisites to be closed. Inspect the listed blockers; do not remove them merely to make closing succeed.
$ anb start task.ship-the-parserok: startid: task.ship-the-parserfrom: opento: activealready: falserecord: id: task.ship-the-parser path: tasks/task.ship-the-parser.md more: anb show task.ship-the-parser --all archived: false fields: count: 10 omitted: 0 rows[10]: - [2]: id,task.ship-the-parser - [2]: type,task - [2]: state,active - [2]: title,Ship the parser - [2]: by,Ada - [2]: taken-by,Ada - [2]: tags,epic - [2]: blocked-by,task.grammar-parser-accepts-fences - [2]: created,2026-01-15 - [2]: updated,2026-01-15 body: lines: 0 characters: 0 head: "" omitted: 0 from: [] born[1]: task.grammar-parser-accepts-fences task: [] bound: [] "blocked-by"[1]: task.grammar-parser-accepts-fences blocks: [] links: [] "linked-by": [] mentions: [] "mentioned-by": []$ anb close task.ship-the-parser --body "The parser is verified."error: unfinished-dependenciesmessage: cannot complete `task.ship-the-parser` while dependencies remain unfinishedfindings[1]: task.grammar-parser-accepts-fencestry[1]: anb show task.grammar-parser-accepts-fencescount: 1omitted: 0id: task.ship-the-parserduplicate-id
Section titled “duplicate-id”An existing record reserves its id, including in the archive. Only deleting a record frees its id.
$ anb add task "Ship the parser again" --id task.ship-the-parsererror: duplicate-idmessage: `task.ship-the-parser` already exists at tasks/task.ship-the-parser.mdtry[2]: anb show task.ship-the-parser,"anb add task \"<title>\""wrong-type
Section titled “wrong-type”The id names a type the command does not act on.
$ anb start note.fenceerror: wrong-typemessage: `note.fence` is not a tasktry[1]: anb show note.fencestill-referenced
Section titled “still-referenced”Other records reference this id. The reply identifies the references that prevent deletion.
$ anb delete task.ship-the-parsererror: still-referencedmessage: `task.ship-the-parser` is still referenced by 1 recordfindings[1]: task.grammar-parser-accepts-fences — fromtry[1]: anb show task.grammar-parser-accepts-fencescount: 1omitted: 0cannot-supersede
Section titled “cannot-supersede”The target is not eligible for supersession. Only an active Decision or Note can be replaced.
$ anb retire decision.fences-never-nestok: retireid: decision.fences-never-nestfrom: activeto: retiredalready: false$ anb add decision "Fences nest once" --kind rule --supersedes decision.fences-never-nesterror: cannot-supersedemessage: "cannot supersede `decision.fences-never-nest`: its state is `retired`, not active"try: []archived
Section titled “archived”An archived record is read, never mutated in place; restore brings it back.
$ anb archive decision.fences-never-nestok: archiveid: decision.fences-never-nestfrom: decisions/decision.fences-never-nest.mdto: archive/decisions/decision.fences-never-nest.mdalready: false$ anb edit decision.fences-never-nest --title Fenceserror: archivedmessage: `decision.fences-never-nest` is archivedtry[2]: anb show decision.fences-never-nest,anb restore decision.fences-never-nestopen-questions
Section titled “open-questions”A Task leaves for the archive with the records bound to it, so an open Question bound to it holds the move back. Close the Question, or clear its task so that it outlives the Task.
$ anb add question "Do fences nest" --task task.ship-the-parserok: addid: question.do-fences-nestpath: questions/question.do-fences-nest.md$ anb close task.ship-the-parser --reason "replaced by a smaller plan"ok: closeid: task.ship-the-parserfrom: activeto: closedalready: falseunblocked: count: 0 omitted: 0 rows: []"open-questions": count: 1 omitted: 0 rows[1]: question.do-fences-nest$ anb archive task.ship-the-parsererror: open-questionsmessage: `task.ship-the-parser` has 1 open question bound to it; close each or clear its task firstfindings[1]: question.do-fences-nesttry[2]: anb close question.do-fences-nest --resolved-by <id>,anb edit question.do-fences-nest --clear taskcount: 1omitted: 0invalid-record
Section titled “invalid-record”The operation requires a valid record. Read the findings with check and follow the suggested repair before retrying.
$ anb start task.brokenerror: invalid-recordmessage: tasks/task.broken.md is invalid (1 finding)findings[1]: "line 4: bad-value state: `bogus` is not one of open, active, review, closed for a task"try[1]: anb show task.brokencount: 1omitted: 0Codes without an example
Section titled “Codes without an example”Other refusal codes describe command or storage failures: unknown-command (a verb anb does not have; the reply offers anb --help), storage (the file system failed the read or write, in the message) and not-utf8 (a record file is not UTF-8; anb check names it).
Check findings
Section titled “Check findings”anb check prints findings[N]{file,line,severity,code,repair,message}; an error fails the command, a warning does not. The repair column carries the command that erases the finding when the tool has one.
| Severity | Codes |
|---|---|
| error | no-envelope, unclosed-envelope, bad-envelope-line, duplicate-field, missing-field, bad-value, bad-date, bad-id, id-filename-mismatch, type-dir-mismatch, archived-live-record, dangling-ref, block-cycle, origin-cycle, duplicate-id, broken-supersession, broken-binding, not-utf8 |
| warning | unknown-field, unarchived-settled-record, orphan-field, unreadable-reference, crlf, bom, no-final-newline |