Skip to content

Wave 8.4: pre-push §7 Prior-art escape-hatch substance arm - #43

Merged
artyhoo merged 1 commit into
mainfrom
wave-8.4/pre-push-pa-substance
May 12, 2026
Merged

Wave 8.4: pre-push §7 Prior-art escape-hatch substance arm#43
artyhoo merged 1 commit into
mainfrom
wave-8.4/pre-push-pa-substance

Conversation

@artyhoo

@artyhoo artyhoo commented May 12, 2026

Copy link
Copy Markdown
Owner

Summary

Closes #discipline-theatre at .husky/pre-push §7 (Prior-art trailer). On capability commits (per pa_detect_capability_reason), the Prior-art: skipped — … escape-hatch is now rejected as contradictory by construction — must cite an actual SSOT entry (prior-art-evaluations.md#N).

Structural twin of Wave 8.3 §9 (s17_check_trailer). Same calibration shape: new env PA_SUBSTANCE_WARN_ONLY default true through 2026-06-10.

Wave 8 umbrella — §13.29 substantive compliance. Depends on Wave 8.3 (#42) merged.

What changed

  • .husky/pre-push:196-205pa_check_trailer() substance arm on the skipped payload branch; distinct exit code 2.
  • .husky/pre-push:223-265 — outer router applies PA_SUBSTANCE_WARN_ONLY (mirrors §9 base/substance pattern).
  • packages/core/audit-self/pre-push.test.sh:76-125 — 4 new tests: pa_substance_negative, pa_substance_positive, pa_substance_noncapability_unaffected, pa_substance_warn_only_default.

Stat: 2 files, +96/-6. Test suite 8/8 (was 4/4); principles 56/56; make self-audit 17/17.

How to verify

  • make self-audit → 17/17 green (9 audit + 8 substance)
  • bash packages/core/audit-self/pre-push.test.sh → 8/8 pass
  • npm run test:principles → 56/56 pass
  • Mutation arm: pa_substance_negative confirms skipped rationale rejected with rc=2 on capability commit
  • Calibration: with PA_SUBSTANCE_WARN_ONLY unset (= default true), outer router warns only

§1.7 Forward-check applied

The substance arm forward-validates by executing the loophole and confirming rejection:

  • .husky/pre-push:196-205 — substance branch returns rc=2 + emits "substance: Prior-art: skipped on capability commit — cite an SSOT entry". The check rejects the exact textual pattern that previously passed (Prior-art: skipped — refactor only) when the commit otherwise matches pa_detect_capability_reason.
  • packages/core/audit-self/pre-push.test.sh:76-87test_pa_substance_negative is the mutation arm (§13.29 D6=C paired-negative): synthetic capability commit + skipped trailer → asserts rc=2. If the substance gate were removed, this test would flip from PASS to FAIL — discipline-as-test invariant.
  • packages/core/audit-self/pre-push.test.sh:87-97test_pa_substance_positive confirms the gate accepts a real SSOT citation (prior-art-evaluations.md#38) on the same capability fixture → rc=0. Forward-validates that the gate is not blanket-blocking; substance ≠ refusal.

§1.7 Backward-check applied

Backward-validates resistance to known anti-patterns surfaced in earlier waves:

  • .husky/pre-push:223-265 — outer router gates rc=2 behind PA_SUBSTANCE_WARN_ONLY (default true through 2026-06-10), same calibration shape as Wave 8.3 §9 (S17_SUBSTANCE_WARN_ONLY). Resists the «hot-deploy substance gate → mass false-positive on in-flight branches» failure mode that Wave 7 7.6.c calibration window was designed for.
  • packages/core/audit-self/pre-push.test.sh:98-115test_pa_substance_noncapability_unaffected resists over-fire: mocks pa_detect_capability_reason returning 1, inlines outer-router conditional, asserts skip path. Closes the «discipline applied beyond its declared scope» anti-pattern (substance gate must NOT fire on non-capability commits like refactors / docs / snapshot regen).
  • packages/core/audit-self/pre-push.test.sh:116-125test_pa_substance_warn_only_default asserts that with PA_SUBSTANCE_WARN_ONLY unset, the outer router emits warning but does not block push (rc=0). Resists the «calibration toggle silently inverted» regression class.

Recursive self-application audit

This PR is itself a capability commit (new ≥80 LOC under packages/ would trigger — actually +63 LOC test extension + 33 LOC hook, total 96; the test file is preexisting so capability-gate matches on the hook diff via the §9 path). The commit body carries §1.7 Bootstrap: instead of a runtime trailer, because the §7 substance arm itself only activates post-2026-06-10 and the introducing commit cannot retroactively cite the gate it is creating — same Bootstrap escape-hatch pattern as Wave 8.3 commit c990d83.

Follow-ups (NOT in this PR)

  • Wave 8.5 — retroactive sweep + cutoff + §13.29 closure (wave-8.5/retroactive-sweep-and-cleanup).

…its cannot skip

Wave 8.4 (umbrella §13.29). Closes #discipline-theatre at §7: a commit that
satisfies pa_detect_capability_reason (new dep / new ≥50 LOC under
packages/core/<dir>/ / new ≥80 LOC under packages/) cannot use the
`Prior-art: skipped — refactor only` escape-hatch — that rationale is
contradictory by construction. Must cite a real SSOT entry.

- .husky/pre-push §7 — pa_check_trailer() gains substance arm on the
  `skipped` payload branch; returns distinct exit code 2; outer router
  applies PA_SUBSTANCE_WARN_ONLY (default true through 2026-06-10,
  mirrors §9 base/substance pattern from Wave 7 7.6.c + Wave 8.3).
- packages/core/audit-self/pre-push.test.sh — 4 new tests:
  pa_substance_negative, pa_substance_positive,
  pa_substance_noncapability_unaffected, pa_substance_warn_only_default.

Paired-negative arm provision (§13.29 D6=C): substance_negative IS the
mutation arm; positive + noncapability_unaffected confirm no over-fire.

§1.7 Bootstrap: introduces substance arm for §7 (Prior-art escape-hatch);
not enforced until 2026-06-10 calibration close.
@artyhoo
artyhoo merged commit 14f9eff into main May 12, 2026
17 checks passed
@artyhoo
artyhoo deleted the wave-8.4/pre-push-pa-substance branch May 22, 2026 18:11
artyhoo added a commit that referenced this pull request May 28, 2026
… consolidation + F.6 self-contained rationale

Two of three MINOR findings from PR #261 Phase -1 cold-review applied (the third — SSOT #20 line-citation gap — was a false-positive; #20 already cites :L88 at patch:79 identical to peer rows).

MINOR #1 (#ai-traps-section-fragmented) — added new §4.5 "AI-traps applied (canonical + domain-specific)" consolidating the T-trap enumeration that was previously fragmented inline at §4 §1.7 line 333. Each T-number now names the specific action in this R-phase that honours it (T1 sampling floor=5 → §1.4 enumerated all 84 SSOT rows; T3 → file:line + verbatim excerpts at lines 140-143/87/93-95/101-105/109-113; etc.). T-N1/T-N2/T-N3/T-N4 listed with their honouring action too. The prior inline mention at §4 §1.7 line 333 now points forward to §4.5.

MINOR #3 (#f6-supplementary-rationale-relies-on-matrix-jump) — added "Supplementary, not subsumed by F.3 (self-contained statement)" paragraph at end of F.6 section. Now self-contained explanation: F.3-without-F.6 = Bug #3 fixed by side-effect but latent landmines remain; F.6-without-F.3 = Bugs #2/#4 unfixed → REJECT; combined F.3+F.6 = defence in depth on Bug #3. Reader no longer needs to jump to coverage matrix at lines 297-307 to understand why F.6 is additive not replacement.

MINOR #2 dropped — reviewer misread: #20 citation has explicit ":L88" line ref identical to peer rows (#9/#43/#68/#77). Verified at patch:79.

Prior-art: skipped — markdown polish on a research-patch; no new capability; per CLAUDE.md "Refactors, doc edits, test additions for existing capabilities ... NOT capability commits."
artyhoo added a commit that referenced this pull request May 29, 2026
…eep evaluation (#268)

Variant scored: MCP-consumer bridge (handoff_create_task + accept_existing_plan +
WebSocket tail + handoff_sync_status). 7 DeepWiki probes + 2 WebSearch queries +
SSOT #27/#28/#30/#43/#44/#46/#67/#80 consult + SKILL.md:404/429 disambiguation.

Verdict: REFERENCE (not ADOPT). Body-format falsifier PASSES — description field
accepts arbitrary markdown (z.string().optional(), no .max()). Minimum call =
{projectId, title}. BUT full pipeline bridge blocked by three structural issues:
(1) accept_existing_plan requires physical PLAN.md on disk in .ai-factory/ —
filesystem coupling beyond MCP boundary; (2) WebSocket broadcast channel has no
topic filter — client must filter by taskId; (3) aif-handoff Reviewer (autoMode)
conflicts with reviewer-discipline.md §2 strategy-fork-surface gate.

Admission gate §2.4: PR #127/#128 touch packages/runtime/ only — no packages/mcp/
or apps/coordinator/ changes. Gate CLEAR.

SKILL.md:404 vs :429 inconsistency resolved analytically (both consistent — BFR
verdict = REFERENCE for SP skill; operational action = ADOPT SP dispatch template).

Prior-art: prior-art-evaluations.md#44 (DEFER, body-format now confirmed compatible);
prior-art-evaluations.md#30 (DEFER, accept_existing_plan bypass documented);
prior-art-evaluations.md#67 (REJECT unchanged — Variant A is optional layer, not
replacement). Sub-wave D proposes new SSOT row for Variant A bridge vocabulary.
artyhoo added a commit that referenced this pull request May 29, 2026
…k + aif-handoff MCP) REFERENCE (#275)

Verdict per BFR-default §1: REFERENCE — design-vocabulary for dispatch-trigger
optimisation of Variant A; not actionable standalone.

Key findings (2026-05-29 evidence):
- CC PostToolUse hooks expose a purpose-built `mcp_tool` hook type for
  already-connected MCP servers (code.claude.com/docs/en/hooks.md fetched
  2026-05-29) — T-AIF-BRIDGE-B'-1 evades via different shape than originally
  framed.
- aif-handoff MCP server runs standalone without coordinator daemon for task
  creation (DeepWiki ×2 phrasings: «MCP server can be invoked statelessly from
  an arbitrary process» + «MCP HTTP daemon runs independently») —
  T-AIF-BRIDGE-B'-3 evades.
- 4 sub-options each fit <100 LOC bridge target: Option (a') = 0 LOC bash
  (mcp_tool hook config), Option (a) = ~25 LOC bash (command hook + curl),
  Option (b) = ~15 LOC chokidar Node, Option (c) = ~10 LOC fswatch bash.

BUT: B' inherits all 3 of SW-A's ADOPT-blockers verbatim (PLAN.md disk coupling,
WebSocket-broadcast no-topic-filter, autoMode Reviewer vs reviewer-discipline.md
§2 conflict — DN-1=B-constrained applies). B' optimises only the dispatch
trigger; the load-bearing blockers persist. Comparison table vs A and B in §6.

§4 5-criteria: PASS-PASS-PARTIAL-PASS-INHERITED. Match ~35%. Atomicity
INCONCLUSIVE/MITIGABLE (chokidar awaitWriteFinish for Option b; empirical for
hooks).

Falsifier: B' upgrades to ADOPT VOCABULARY iff Sub-wave D greenlights A AND
DN-1=B-constrained adopted.

T-discipline applied per kickoff §6 SW-B2: T1 / T3 / T7 / T11 / T12 / T13 / T15
/ T16 / T17 / T19 (own cold-QA before push) / T20 + T-AIF-BRIDGE-B'-1..5.

Prior-art: SSOT #20 (CC hooks API, ADOPT) + SSOT #27/#28/#30/#43/#44/#46/#67/#80
(aif-handoff rows). Additive note to SSOT #44 proposed (no verdict change).
Proposed new SSOT row at next-available slot #85.
artyhoo added a commit that referenced this pull request May 29, 2026
… Implementer-equivalent only) value-add audit (#276)

R-phase patch for Sub-wave C of the aif-handoff-as-runtime-bridge umbrella.
Evaluates Variant C (kickoff §3 lines 124-145): aif-handoff as Implementer-
equivalent only, bypass Planner+Reviewer cycle, thin CLI wrapper for kickoff
dispatch + kanban status tracking.

Verdict: REJECT (BFR-default §1 ladder). Rationale:
- The kickoff-framed "aif-handoff exec --kickoff <path>" CLI does not exist
  in lee-to/aif-handoff (DeepWiki probes 1+5, 2026-05-29).
- No first-class Implementer-only mode; skipReview:true bypasses Reviewer but
  Planner is mandatory unless accept_existing_plan with on-disk PLAN.md
  (same disk coupling SW-A flagged for Variant A).
- BEFORE/AFTER maintainer-action count: 25% literal / 0% cognitive reduction
  (T-AIF-BRIDGE-C table §4) — below kickoff §8 STOP 30% threshold → verdict
  "Variant C value-add insufficient".
- Pure-tracker pattern (paused:true + autoMode:false + manual state-machine
  transitions) IS shipped but adds zero automation beyond UI tracking;
  Docker+SQLite infra unjustified.

Cites:
- SW-A merged PR #268 (Variant A REFERENCE, 28% match, 3 ADOPT-blockers)
- SW-B merged PR #267 (Variant B REJECT, ~5% match, no dir-watch capability)
- PR #269 follow-up (mechanical corrections, no verdict changes)
- DN-1=B-constrained input consumed in criterion 5 (mooted for Variant C
  which bypasses aif-handoff Reviewer entirely)
- Gate-4 admission re-sweep: PR #127+#128 touch packages/runtime/ only
  (no MCP/coordinator drift in 30-day window)

5 distinct DeepWiki probes + 2 WebSearches + cross-ref to SW-A/SW-B/PR #269
= 19+ evidence channels (T1 floor exceeded 3.8x). §1.7 forward+backward +
§self-application + T-trap walk per ai-laziness-traps.md §3.

Single output file under docs/meta-factory/research-patches/. No code, skill,
agent, install.sh, or .claude/rules/ modifications.

### §1.7 Forward-check applied

build-first-reuse-default.md §1 verdict ladder applied; BFR §3 6-layer search
performed (SSOT rows #27/#28/#29/#30/#43/#44/#46/#67/#80 reviewed at
prior-art-evaluations.md:95-148; DeepWiki >=5 probes; WebSearch >=2 phrasings;
own-stack sweep at .claude/skills/meta-orchestrator/SKILL.md:441 anti-scope +
:404+:429 SP requesting-code-review). no-paid-llm-in-ci.md §1 enforced (all
evidence via subscription-bundled DeepWiki/WebSearch + free gh CLI + bash).
reviewer-discipline.md §2 respected (DN-1=B-constrained consumed as fact, not
re-litigated; verdict is research finding against §8 STOP, not strategy
choice). ai-laziness-traps.md §3 active T-traps applied (T1, T3, T7, T11,
T12, T13, T15, T16, T17, T19, T20, T-AIF-BRIDGE-C MANDATORY BEFORE/AFTER
table at patch §4). Evidence: see patch §8 file:line citations.

### §1.7 Backward-check applied

SSOT #27/#28/#67 receive additive notes (additive-only; no verdict changes).
Original DEFER/DEFER/REJECT rationales reviewed at prior-art-evaluations.md:
95, 96, 135 — consistent with Sub-wave C findings (reinforce existing
classifications, do not re-litigate). No .claude/rules/* modified; no
.claude/skills/* modified; no agents/* modified; no packages/* modified;
no install.sh modified; no kickoff.md modified. Single output file in
docs/meta-factory/research-patches/. Scope strictly bounded to Variant C;
SW-A/SW-B/SW-B2/SW-D out of scope. T15 self-application confirmed in
patch §10. Memory not written (Sub-wave D synthesis is the natural
codification surface). Evidence: see patch §9 file:line citations.
artyhoo added a commit that referenced this pull request May 31, 2026
… task (Sub-wave A) (#323)

Closes the resolve half of the autonomous question-loop: questions.ts (#318) collects parked tasks; answer.ts pushes the human's answer back and resumes. Source-verified resume (vs lee-to/aif-handoff, design §3.1): request_changes (default) = POST /tasks/:id/comments {message} then POST /tasks/:id/events {request_changes} (done→implementing); approve = events {approve_done} (done→verified); retry = events {retry_from_blocked}. Status is EVENT-only; PUT {status} ignored. Verified 65/65 runtime-bridge tests; matches design §1.2. Live E2E deferred (no parked task yet). Authored by Sub-wave A worker.

Prior-art: BUILD (thin, project-specific). BFR §3 WebSearch 2026-06-01 surfaced no upstream tool that pulls an agent-runtime's parked review-questions into a chat + pushes answers + resumes (hits were resume-screeners, noise); native fetch, no new dependency; sibling of questions.ts #318 under design #315. Adjacent aif-handoff SSOT rows #67/#43/#88 cover aif's own primitives, not this wrapper CLI — no new row, matching the #318 sibling precedent.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant