h-diagnose — Test rival explanations
Abduction is an internal routine of this skill, not a separate public skill.
Use FPF source when an FPF distinction or diagnostic pattern is material to the
current failure; a purely mechanical failure needs no ritual source query.
Before relying on FPF diagnostic semantics, inspect a known SourceID or UnitID with
mcp__haft__haft_query(action="fpf", mode="inspect", identifier="..."), or
use mode="concern" with the concrete failure question and inspect the direct
pattern body. Query returns source candidates, not a selected cause or verdict.
A candidate_set is incomplete: select by the current condition and required
result kind, then inspect one exact PatternID. If no candidate fits, abstain.
Never use a query performed after the diagnosis or edit as proof that the
earlier work followed that source.
Conditional project-memory orientation
When this diagnosis is context-heavy, multi-session, or reliance-bearing and
the exact EntityOfConcern is not already current, resolve its identity with
haft_query(action="memory", memory_request={"mode":"resolve", "contract_version":"haft.memory.v1","basis":{"kind":"project_current"}, "query":"...","max_candidates":5}). Select the exact candidate by the current
use rather than rank, then use the closed memory_request neighborhood branch
advertised by the tool schema with
projection_profile_ref="agent_orientation.v2".
Inspect result_kind before relying on content. project_basis_unavailable,
known absence, or explicit abstention is visible but non-blocking: continue the
diagnosis without inventing a profile, entity, artifact, or human gate. This
read does not replace code-graph preflight before a later code edit. Never
persist typed memory merely because a read failed; persistence requires an
explicit operator save request or a concrete operator-named or agent-inferred
receiving use supplied by current Work, with provenance.
Procedure
- Stabilize the observed signal without naming a cause. State time window, scope, reproducibility, and what remains unaffected.
- Inspect the failing code, logs, tests, and related Haft decisions when they are current. Treat stale governing assumptions as one possible hypothesis, not as proof.
- Generate at least three rival hypotheses that differ in kind. For each, state a discriminating probe that could refute it.
- Run read-only probes in parallel where possible. Give each investigator one hypothesis and the same signal; prohibit edits.
- Rank by evidence for, evidence against, and remaining uncertainty. Keep refuted and inconclusive rivals visible when they matter to fallback or replay.
- State the smallest supported conclusion.
Inconclusiveis valid; a plausible story is not a root-cause finding.
Persistence boundary
Default to a conversational diagnosis. Do not automatically create a ProblemCard or SolutionPortfolio. Persist only on explicit save intent or when a concrete operator-named or agent-inferred receiving use needs the diagnosis to remain addressable. In that case, record the stable diagnosis problem and the rival hypotheses with their evidence limits; do not present hypothesis ranking as a binding decision.
Result
Return the leading explanation, concrete evidence, live rivals, and the next discriminating probe if uncertainty remains. Diagnosis does not authorize a fix. Implement only when the operator separately asks for the change.