v0.13.0: questions before the code exists
A second mode. audit sweeps code that exists; interrogate turns the same rules pack into
questions about work that has not started. Closes #229. Claude Code only.
The skill
interrogate (#230) uses list_domains and get_domain and nothing else. It never calls
begin_run, record_domain_result, file_issues or render_report, which is what lets it run
against a directory that is not a repository yet: those tools demand a repository name and a
commit, and work that has not started has neither.
It fans out one read-only sub-agent per relevant domain rather than reading domain documents into
the conversation. A domain document is far larger than its generated skill file suggests, because
the full document carries the Verification: trails that the skill files strip.
Also in #230: a sub-agent is now told explicitly that a domain spooled to a file is not a failed
fetch. A large domain exceeds the tool-result limit and comes back as Error: ... Output has been saved to <path>. The word Error is misleading, the fetch succeeded, and both plausible wrong
reactions are silent ones.
The plan-mode offer hook
integrations/claude-code/interrogate-offer.sh (#231) makes the skill discoverable. There is no
hook event for a permission-mode change, so it gates UserPromptSubmit on
permission_mode == "plan" with a session-keyed stamp, plus a PreToolUse leg on
EnterPlanMode.
It is advisory and never blocks, and that is a constraint rather than a preference: both blocking
channels on UserPromptSubmit erase the user's prompt outright. For the same reason, a hook like
this should be registered as bash "$SCRIPT"; exit 0, because a script with a syntax error exits
2 and exit 2 blocks.
#231 exists because #230 shipped a skill to a public repository while the thing that offers it sat
in private configuration. Outside users would have had a feature nothing could ever tell them
about. Nothing in the verification would have caught it, since every test ran on the machine where
the private half exists.
Marked BETA, literally
The label is not defensive. What has been exercised: question derivation on three of sixteen
domains against one invented brief, the no-run guarantee, and the hook's failure paths. What has
not: the other thirteen domains, and the interactive loop with a real person answering. Nobody has
completed a full interrogation, so the shape of a session is unproven and question quality is
sampled rather than measured.
Housekeeping
Version bumped through scripts/bump-version.py, so all 14 install pins and 2 prose mentions move
together. check-version-pins.py passes and 847 tests pass.
SBOM attached, CycloneDX JSON, runtime dependencies only. It was generated by
tag-version-guard.yml when the tag landed but could not be attached at the time, because this
release did not exist yet.