v0.7.2
Cycle 10 WP-F verification-surfaced remediation. Nine latent defects in the v0.7.0/v0.7.1 hook infrastructure caught by the methodology running against its own corpus in enforcement mode. All fixes land in this release. Invariant 8's compound defense is now operational end-to-end on any corpus that runs the plugin.
Hook infrastructure fixes
- All RDD hook scripts now read input from stdin, not
$1. Since v0.6.0, every input-dependent hook (invariant-reminder.sh,orientation-trigger.sh,sizing-check.sh,epistemic-gate.sh,tier1-verify-dispatch.sh) has been silently non-functional in Claude Code's actual runtime becausehooks.jsonpassed input via$INPUT(expected as a shell variable) while Claude Code delivers the JSON payload via stdin. Synthetic tests masked the divergence by invoking scripts directly with$1. Onlytier1-phase-manifest-check.shworked by accident — it readscycle-status.mdfrom disk and falls through on empty input — and that accidental functionality was precisely what caught the gap during WP-F.hooks.jsondrops the"$INPUT"argument from every command; scripts read stdin when$1is empty and stdin is not a terminal (backward compatible with direct invocation for test harnesses) - PostToolUse Tier 1 hook strips plugin namespace prefix before matching against
TIER1_MECHANISMS. Claude Code dispatches plugin-provided subagents with the<plugin>:<name>form (e.g.,rdd:susceptibility-snapshot-evaluator), but the mechanism list used bare names. Every prefixed dispatch silently skipped logging, breaking the compound check's cross-reference entirely.${SUBAGENT_TYPE#*:}normalizes the name; the original prefixed form is preserved in the dispatch log'ssubagent_typefield for forensic record - Stop hook schema conformance — replaced
{"decision":"allow",...}with plain-text stdout (advisory mode, matching the convention of the project's other stdout-based hooks) and schema-valid{"decision":"block",...}(enforcement mode). Claude Code's Stop hook schema only accepts"approve" | "block"for thedecisionfield; emitting"allow"failed JSON validation every invocation and the advisory notice never reached the agent - Stop hook E1 dispatch detection is cycle-sensitive. Matches on mechanism name AND substituted
expected_path, mirroring the enforcement-mode compound check. Without this, prior-cycle dispatch log residue produced misleading "dispatched but no artifact" messages at the current cycle's phase boundary - PostToolUse hook emits JSON
null(not string"null") for missing Output path lines.jq --argjsonreplacesjq --argwhen the path is absent, so downstream queries likejq '.expected_path == null'work correctly - Distinguish user-tooling mechanisms from subagent dispatches. The manifest supports a
mechanism_type: user-toolingfield foraid-cycle-gate-reflectionentries. In enforcement mode, the compound check's dispatch-log cross-reference no longer applies to user-tooling mechanisms — gate reflection notes are produced by the orchestrator in-context, not by an isolated subagent dispatch, so they have no dispatch log entry by design. The structural floor (E1/S1/S2/S3) still applies; the Susceptibility Snapshot at the same phase boundary is the complementary content-level defense
Migrate subcommand fixes
/rdd-conform migrateStep 6 includesdocs/system-design.mdin its mechanical path substitution file list. The system design document contains multiple pre-migration path references (Appendix A per-phase susceptibility snapshot briefs, Test Architecture table, Integration Contracts notes) that were previously not updated by the migration operation, leaving the file in an inconsistent mix post-migration/rdd-conform migrateStep 5 rewrites internal relative links in the movedcycle-status.md. When the file moves fromdocs/todocs/housekeeping/, its own./essays/...,./product-discovery.md,./domain-model.md,./system-design.md, and./roadmap.mdreferences need to be rewritten for the new directory depth. Order matters:./essays/audits/→./audits/must run before./essays/→../essays/
Verification evidence
- First live operational Tier 1 dispatch in project history. The build-phase susceptibility snapshot fired via the ADR-065 Skill-Structure anchor without ceremonial attention, produced a substantive artifact, was logged by the PostToolUse hook, cross-referenced by the Stop hook compound check, and cleared the build phase boundary block. ARCHITECT phase open question 1 (does the per-phase dispatch actually fire under task load?) is answered empirically: yes, and the harness layer captures it
- First gate reflection note. The User-Tooling Layer graduated-artifact mechanism (ADR-066) produced its first real artifact at
docs/housekeeping/gates/014-build-gate.mdwith all five required headers and four required fields, successfully satisfying the manifest check - Three preserved historical snapshots at
docs/housekeeping/audits/—.pre-prefix-fix.md(first live dispatch that surfaced Finding #7),.post-prefix-pre-stdin.md(second dispatch that surfaced Finding #9), and the canonical build snapshot (third, through the fully-fixed chain). The preservation pattern is itself a methodology commitment: Option B (preserve-and-re-dispatch) is the right remediation for artifact/log provenance gaps discovered at enforcement boundaries
Cycle 10 full closure
- 57 scenarios verified across two releases (44 v0.7.0 + 13 v0.7.1). All PASS
- Nine remediation commits during WP-F verification, each numbered in
docs/housekeeping/cycle-status.md - Cycle 11 candidate research question surfaced: what categories of behavior are structurally unreachable by specification-conformant synthetic tests, and which warrant runtime-level testing infrastructure? A runtime smoke test that fires an actual subagent dispatch and verifies the dispatch log is populated would have caught Findings #7 and #9 before WP-F