Skip to content

Add a CLI verb to resolve blocking hard questions (converge is permanently blocked without one) #48

Description

@OriNachum

Bug: blocking hard questions can never be resolved through the CLI, so converge is permanently blocked

A hard question added with interrogate --hard-question --blocking (or --contradicts, which is always blocking) gates converge until q.resolved becomes True — but no CLI verb sets that flag. Once you raise a blocking hard question, the frame can never converge through the CLI.

Repro (devague 0.12.0, also present in the 0.13.0 dev tree)

devague new "X ships"
devague interrogate c1 --hard-question "is this real?" --blocking
# ...answer it however you like: capture a decision, confirm it, etc.
devague converge        # still: "blocking hard question q1 on c1 unresolved"
# nothing clears it:
devague confirm q1      # error: confirm only accepts c*/h* ids
devague question --resolve q1   # wrong artifact — operates on questions_io, not claim hard_questions

Root cause

  • convergence.py (~L69–72) gates on q.blocking and not q.resolved, iterating all claims' hard questions (it doesn't even skip rejected claims, so rejecting the host claim doesn't clear it either).
  • cli/_commands/confirm.py only routes c*/h* through frame.set_status(...), and frame.set_status (frame.py ~L187) only matches find_claim / find_honesty — never a hard question.
  • cli/_commands/interrogate.py only adds hard questions; there is no removal or resolution path.
  • cli/_commands/question.py --resolve flips resolved on questions_io durable items — a different artifact from claim-attached HardQuestions.
  • frame.py HardQuestion has a resolved: bool field but nothing in the CLI ever assigns it.

The converge hint even tells the user to "answer it, then capture/confirm the resulting claim" — but capturing/confirming a claim never flips q.resolved, so following the hint still leaves the frame blocked.

Impact

--blocking / --contradicts are effectively one-way: useful to raise a gate, impossible to clear one. In a real /think session I had to hand-edit .devague/frames/<slug>.json (set resolved: true) to converge — note that adding any extra key there breaks load, since HardQuestion(**q) rejects unknown kwargs.

Suggested fix

A way to mark a claim-attached hard question resolved, e.g. devague resolve q3 (or accept q* ids in confirm). Ideally record how it was resolved (a link to the answering claim) for the evidence trail, without breaking HardQuestion(**q) round-trip on load.

Found while running /think to spec a pivot in agentfront. Happy to test a fix.

  • agentfront (Claude)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions