Skip to content

Block acceptance on a question nobody has answered

Open a question against the task, watch finish refuse completion while it is unresolved, resolve it with the answer, and only then complete.

guaranteed Completion and quality gatesintermediateagentreviewerwrites state

Situation

Somebody asked a question that decides how the work is done, nobody answered, and the work carried on. If the task can be accepted anyway, the question was never really a blocker, and the next person discovers the assumption when it is already merged.

What you run

  • question list: the unresolved entries for the active task, numbered
  • finish --outcome completed: refused while an entry is unresolved, with the entry named
  • check: the same gate as a failing line, so it is visible before anyone tries to finish
  • question resolve <n> --answer: rewrites that one line as resolved, with the answer beside the question

Scenario

setup: finish-blocker-open
given:
  - 'an active task with one unresolved question open against it'
steps:
  - id: see-it
    run: ['question', 'list']
    note: 'the open question, numbered, on this branch'
    expect:
      exit: 0
      stdout_contains: ['unresolved', 'tabs']
  - id: refused
    run: ['finish', '--outcome', 'completed', '--verify-command', 'test -d .ai']
    note: 'completion is refused while the question is open; the refusal names it'
    expect:
      exit: 10
      stdout_contains: ['question']
  - id: still-flagged
    run: ['check']
    note: 'check reports the blocker as a failing line, not a warning'
    expect:
      exit: 10
      stdout_contains: ['FAIL']
  - id: resolve
    run: ['question', 'resolve', '1', '--answer', 'tabs are refused; the subset has no tabs']
    note: 'the one line is rewritten as resolved with its answer'
    expect:
      exit: 0
      stdout_contains: ['resolved']
  - id: clear
    run: ['check']
    note: 'nothing blocks now'
    expect:
      exit: 0
      stdout_contains: ['0 failing']
then:
  - 'finish refused with exit 10 while the question was open'
  - 'the resolved entry keeps the question and the answer together'
  - 'check is green once the store holds no unresolved entry'

Outcome

An open question is a blocker the tool enforces, not a note somebody may read. The record of what was asked and what was decided stays in the repository, and finishing over it is impossible rather than discouraged.

The scenario

Executed against the real tool, in a repository prepared by finish-blocker-open, every time this site is generated. What follows is not a description of what should happen; it is what happened.

given

  • an active task with one unresolved question open against it

when

  1. 1majordomus question list
  2. 2majordomus finish --outcome completed --verify-command test -d .ai
  3. 3majordomus check
  4. 4majordomus question resolve 1 --answer tabs are refused; the subset has no tabs
  5. 5majordomus check

then

  • finish refused with exit 10 while the question was open
  • the resolved entry keeps the question and the answer together
  • check is green once the store holds no unresolved entry

What the tool did

Evidence of the run this page was generated from: pass, 5 step(s). Output is normalised: the repository's path, timestamps, ids and durations are placeholders; nothing else is edited.

Tested by test/cases/94_use_cases.sh, which runs every scenario and refuses a step whose recorded output is not what it produced.

  1. the open question, numbered, on this branch

    1  [unresolved] t-<id> — does the parser need to accept tabs? (<date>)
    • exit 0
    • stdout_contains /unresolved/
    • stdout_contains /tabs/
  2. completion is refused while the question is open; the refusal names it

    FAIL blockers    t-<id> — 1 unresolved question(s) on this branch; first: t-<id> — does the parser need to accept tabs?  [reproduce: majordomus question list]
    FAIL note        t-<id> — no --note file and no handover for this task  [reproduce: majordomus handover < note.md]
    INFO regression  t-<id> — profile implementation adds no requirement beyond the shared contract
    OK   scope       t-<id> — 1 touched file(s), all within scope
    OK   state       t-<id> — exact (head <head>)
    INFO continuity  t-<id> — applies to partial and blocked
    INFO mesh        t-<id> — the repository declares no enabled mesh
    INFO use-case    30 advisory gap(s) — not covered by an active use case, and the policy does not require it: command:init command:update command:doctor command:watch command:start command:context command:checkpoint command:handover command:check command:finish command:history command:decision command:question command:prompt command:evidence command:skills command:capture command:search command:doctrine command:plan command:version command:session command:knowledge command:adr command:usecase command:rules command:migrate command:recover command:bench command:archive  [reproduce: majordomus usecase coverage]
    OK   use-case    0 of 30 target(s) covered — every public command the policy requires is named and run by an active use case (policy use_cases.coverage)
    OK   verification t-<id> — test -d .ai — exit 0, <s>s, tree <tree>
    INFO obligation  t-<id> — the task declares no obligations
    INFO gate        t-<id> — this repository declares no CI model at .ai/repo/ci/gates.yaml; nothing can be planned
    INFO gate        t-<id> — not in verification.finish_requires
    finish: refused, 2 unmet
    blocking doctrines:
    - majordomus.blocker-resolution
    - majordomus.note-integrity
    • exit 10
    • stdout_contains /question/
  3. check reports the blocker as a failing line, not a warning

    OK   knowledge   records — 0 record(s) valid against knowledge/v1; every reference resolves  [reproduce: majordomus knowledge check]
    ·    checkpoint  t-<id> — <timed against the checkpoint interval>
    OK   records     ledger.jsonl — every line is a well-formed event
    FAIL blockers    t-<id> — 1 unresolved question(s) on this branch; first: t-<id> — does the parser need to accept tabs?  [reproduce: majordomus question list]
    OK   records     decisions.md — every entry is attributable
    OK   scope       t-<id> — 1 touched file(s), all within scope
    OK   state       t-<id> — exact (head <head>)
    INFO mesh        t-<id> — the repository declares no enabled mesh
    INFO use-case    30 advisory gap(s) — not covered by an active use case, and the policy does not require it: command:init command:update command:doctor command:watch command:start command:context command:checkpoint command:handover command:check command:finish command:history command:decision command:question command:prompt command:evidence command:skills command:capture command:search command:doctrine command:plan command:version command:session command:knowledge command:adr command:usecase command:rules command:migrate command:recover command:bench command:archive  [reproduce: majordomus usecase coverage]
    OK   use-case    0 of 30 target(s) covered — every public command the policy requires is named and run by an active use case (policy use_cases.coverage)
    INFO obligation  t-<id> — the task declares no obligations
    INFO gate        t-<id> — this repository declares no CI model at .ai/repo/ci/gates.yaml; nothing can be planned
    check: 12 finding(s), 1 failing
    • exit 10
    • stdout_contains /FAIL/
  4. the one line is rewritten as resolved with its answer

    resolved for t-<id>: does the parser need to accept tabs?
    • exit 0
    • stdout_contains /resolved/
  5. nothing blocks now

    OK   knowledge   records — 0 record(s) valid against knowledge/v1; every reference resolves  [reproduce: majordomus knowledge check]
    ·    checkpoint  t-<id> — <timed against the checkpoint interval>
    OK   records     ledger.jsonl — every line is a well-formed event
    OK   blockers    t-<id> — none open
    OK   records     decisions.md — every entry is attributable
    OK   scope       t-<id> — 1 touched file(s), all within scope
    OK   state       t-<id> — exact (head <head>)
    INFO mesh        t-<id> — the repository declares no enabled mesh
    INFO use-case    30 advisory gap(s) — not covered by an active use case, and the policy does not require it: command:init command:update command:doctor command:watch command:start command:context command:checkpoint command:handover command:check command:finish command:history command:decision command:question command:prompt command:evidence command:skills command:capture command:search command:doctrine command:plan command:version command:session command:knowledge command:adr command:usecase command:rules command:migrate command:recover command:bench command:archive  [reproduce: majordomus usecase coverage]
    OK   use-case    0 of 30 target(s) covered — every public command the policy requires is named and run by an active use case (policy use_cases.coverage)
    INFO obligation  t-<id> — the task declares no obligations
    INFO gate        t-<id> — this repository declares no CI model at .ai/repo/ci/gates.yaml; nothing can be planned
    check: 12 finding(s), 0 failing
    • exit 0
    • stdout_contains /0 failing/

Why the tool knows this

The chain from this page to the code: the use case names commands, rules and claims; each rule is dispatched from the registry and each claim names the test that proves it; the scenario above executed the commands. Nothing in this chain is prose about intent.

The rules that make it hold

Guarantees exercised

Related use cases

Computed from what they share: claims, rules, commands, category, applications. Nobody maintains this list.

The moments this answers

Searches the titles and descriptions of every page this site publishes.