chore(kb): record the force_the_failure doctrine

Four findings on this branch were the same shape: an unchecked status on
an operation whose failure produces a usable-looking value rather than an
error, so the next line carries on and the whole thing reports success.

  bd init   exits non-zero but still leaves an empty database behind
  mv        unchecked, so the new tracker lands INSIDE the old directory
  jq        status swallowed by a process substitution, reads as "no inputs"
  mktemp    empty TMP turns "$TMP/$NAME" into a path at the filesystem root

Reading the failure paths found none of them, because each one reads
plausibly. Forcing the failure found all four: stubbing mv and mktemp is
what exposed the last two. The fact also records that chmod a-w proves
nothing when the tests run as root -- that attempt returned 0 and looked
like a pass, which is the same failure mode one level up.

Sits alongside check_the_checker, which says the same thing about checks
rather than about error handling.

Verified with trealla from the flake's own pinned nixpkgs, which the
seeding script on this branch makes reachable: kb_consistent passes, the
new fact is queryable, and an injected bad layer/2 still trips kb_report
-- so the check is not passing vacuously. 19 doctrine facts now.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DyHK7L8S1XDX3EihTnSKaX
This commit is contained in:
Claude
2026-09-19 07:58:52 +00:00
parent 3fd775d3c6
commit 84c3c701e4
+3
View File
@@ -548,3 +548,6 @@ kb_issue_found(duplicated_active_view,'adding ViewState::active_view created a s
work_done('improvise-cqi',feature,'crates/improvise-protocol created. ViewState, ViewCursor, ViewFrame, AppMode, Panel, MinibufferConfig, MinibufColor, HELP_PAGE_COUNT and the key types moved there; improvise-command re-exports them so no caller path changed. Command + reduce_view + RenderCache/CellDisplay/Snapshot added with 15 tests. Added to the CI wasm job.').
work_unblocked('improvise-cqi','improvise-gxi','reduce_full can now live in improvise-command taking a protocol Command, with no cycle').
doctrine(derive_the_enum_from_the_effects,'when a wire vocabulary must mirror an existing mutation set, enumerate the mutations and let that be the enum; inventing variants ahead of the mutations produces a protocol nobody can implement against').
% ── Cloud-session tooling (PR #7) ───────────────────────────────────────────
doctrine(force_the_failure,'an unchecked status whose failure yields a usable-looking value is not a style nit: force the failure and look at what the next line does with it. Four on one branch -- bd init exits non-zero but still leaves an empty database behind, an unchecked mv lands the new tracker INSIDE the old directory and reports success, jq status swallowed by a process substitution reads as "no inputs found" and exits 0, and a failed mktemp turns "$TMP/$NAME" into an absolute path at the filesystem root. Every one looked like success at runtime, so reading the failure paths found none of them; stubbing mv and mktemp to fail is what exposed them. Note chmod a-w proves nothing when the tests run as root -- it returned 0 and looked like a pass.').