@chrono-meta/fh-gate 1.4.73 → 1.4.74

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,54 @@
1
+ #!/usr/bin/env bash
2
+ # tier_census_grep.sh — word-boundary tier-reference census helper (Sonnet-Floor Doctrine).
3
+ #
4
+ # WHY (origin: fh_signal_2026-07-10_session — Sonnet full-loop probe): the naive census pattern
5
+ # `opus|sonnet|haiku|floor|tier|model:` false-positives heavily ("frontier" matches `tier`,
6
+ # "floors" prose, method-sense "model"). The probe self-corrected, but per the doctrine's own
7
+ # prescription ladder (step 1: mechanize) the discipline belongs in a script, not re-derived
8
+ # per session. Built 2026-07-10 on operator instruction (evidence-threshold overridden by
9
+ # explicit "complete it" — recorded, not silent).
10
+ #
11
+ # WHAT: emits candidate tier-reference hits with word-boundary patterns, one line per hit
12
+ # (file:line:text), for the auditor to CLASSIFY per sonnet_floor_doctrine.md's table
13
+ # (trust-floor / availability-gate / advisory / N-A). The script finds candidates; the
14
+ # classification stays a judged step with the doctrine table as its anchor.
15
+ #
16
+ # Sense-filter hints (printed, not auto-applied — de-noising must never hide a real gate):
17
+ # - "frontier|multi-tier|C-tier|A/B-tier" → usually N/A (different axis: content/data tiers)
18
+ # - "hub model|mental model|data model" → usually N/A (methodology sense of "model")
19
+ # - execution tier S/M/L/XL → N/A (token budget, not model tier — fh_detail_protocols)
20
+ #
21
+ # Usage: bash scripts/tier_census_grep.sh <file> [file...] Exit: 0 always (census, not gate)
22
+
23
+ set -uo pipefail
24
+
25
+ if [ $# -eq 0 ]; then
26
+ echo "usage: bash scripts/tier_census_grep.sh <file> [file...]" >&2
27
+ exit 0
28
+ fi
29
+
30
+ PATTERN='\b(opus|sonnet|haiku|fable)\b|\bfloor(-status|-tier|s)?\b|\btiers?\b|(^|[^a-zA-Z])model:'
31
+
32
+ for f in "$@"; do
33
+ if [ ! -f "$f" ]; then
34
+ echo "── $f: NOT FOUND (phantom input — check the path) ──"
35
+ continue
36
+ fi
37
+ echo "── census candidates: $f ──"
38
+ # -P where available (GNU/pcre); BSD grep on macOS supports -E word boundaries via [[:<:]] —
39
+ # portable route: grep -nEi with \b works on GNU; on BSD use perl fallback.
40
+ if echo x | grep -P 'x' >/dev/null 2>&1; then
41
+ grep -nPi "$PATTERN" "$f" || echo " (0 candidates)"
42
+ else
43
+ # 0-hit에도 "(0 candidates)"를 찍는다 — GNU 분기와 출력 대칭 (pmh-parity 포트가 잡은 갭, 역이식 2026-07-10)
44
+ hits=$(perl -ne 'print "$.:$_" if /\b(opus|sonnet|haiku|fable)\b|\bfloor(-status|-tier|s)?\b|\btiers?\b|(^|[^a-zA-Z])model:/i' "$f")
45
+ if [ -n "$hits" ]; then printf '%s\n' "$hits"; else echo " (0 candidates)"; fi
46
+ fi
47
+ done
48
+
49
+ cat <<'HINTS'
50
+ ── classify each hit per sonnet_floor_doctrine.md (trust-floor / availability-gate / advisory / N-A) ──
51
+ N/A sense hints (verify, don't auto-drop): frontier·C-tier·A/B-tier (content-tier axis) ·
52
+ "hub/mental/data model" (methodology sense) · S/M/L/XL execution tier (token budget, not model).
53
+ HINTS
54
+ exit 0
@@ -0,0 +1,153 @@
1
+ <!--
2
+ session.md — Claude Code Session Rules Template
3
+
4
+ Purpose of this file:
5
+ - Define Claude's session operating rules (how to behave)
6
+ - Behavioral guidelines applied across the entire project
7
+ - Commit to Git and share with the team
8
+ - Edited and managed directly by the user
9
+
10
+ Difference from MEMORY.md:
11
+ - MEMORY.md: Stores data/experience learned during conversation (auto-managed by Claude)
12
+ - session.md: Defines procedures/rules for Claude to follow (edited directly by the user)
13
+
14
+ Usage:
15
+ - Copy this file to your project's .claude/rules/session.md
16
+ - Add, remove, or modify sections to fit your project
17
+ - Change sections marked with [CUSTOMIZE] comments to match your project
18
+ -->
19
+
20
+ ### Automatic Actions at Session Start
21
+
22
+ #### Root Memory (Knowledge Hub) Connection
23
+
24
+ At the start of a conversation ("hello", "let's start", "load root memory"), perform the following:
25
+
26
+ 1. Read `{FH_ROOT}/CATALOG.md`
27
+ - Understand recent work context
28
+ - Check today's tasks (todo/plan)
29
+
30
+ 2. Load project memory index
31
+ - Check `.claude/projects/.../memory/MEMORY.md`
32
+ - Prioritize loading memory most relevant to current work
33
+ - Proceed naturally without notifying the user that memory was loaded
34
+
35
+ #### Exceptions
36
+ - If the user explicitly requests not to use memory
37
+ - For simple one-off questions, load is optional
38
+
39
+ ---
40
+
41
+ ### Session Backup Before Tests
42
+
43
+ <!-- [CUSTOMIZE] Adjust trigger conditions to match your test framework -->
44
+
45
+ #### Automatic Backup Trigger
46
+
47
+ At any point when tests could be run, **automatically** perform a session backup:
48
+
49
+ 1. **When I recommend running tests** — **immediately before** the recommendation message
50
+ 2. **When the user signals intent to start tests** — **before** running the test command
51
+
52
+ #### Why Backup
53
+ - Sessions can be forcibly terminated when tests start
54
+ - Prevents loss of conversation context, analysis results, and change history
55
+
56
+ #### How to Backup
57
+
58
+ ```bash
59
+ cat > .claude/session_backup_$(date +%Y%m%d_%H%M%S).md << 'EOF'
60
+ # Session Backup - [Task Title]
61
+
62
+ ## Problem
63
+ - [Issue currently being resolved]
64
+
65
+ ## Changes Made
66
+ - [filename:line]
67
+ - [before/after]
68
+
69
+ ## Next Steps
70
+ - [Things to verify after tests]
71
+ EOF
72
+ ```
73
+
74
+ #### Important
75
+ - Perform **automatically** even without an explicit user request
76
+ - Never recommend tests without first creating a backup
77
+
78
+ ---
79
+
80
+ ### Automatic Response to Issues
81
+
82
+ <!-- [CUSTOMIZE] Adjust report tool/path to match your project -->
83
+
84
+ #### Automatic Check Trigger
85
+
86
+ When the user mentions a problem, **automatically** locate and analyze the latest test report:
87
+
88
+ 1. **Trigger keywords**
89
+ - "something broke", "got an error", "it failed", "not working"
90
+ - "issue occurred", "test failed", "broken", "failed"
91
+
92
+ 2. **Analyze and report**
93
+ - Names of failing test cases
94
+ - Error messages and stack traces
95
+ - Summarize in a concise format
96
+
97
+ ---
98
+
99
+ ### Code Writing Principles
100
+
101
+ <!-- [CUSTOMIZE] Adjust to match your project's coding conventions. The 5 principles below are universal and valid for any project. -->
102
+
103
+ Be conscious of all 5 principles **before** writing code — directly reduces back-and-forth where Claude rushes to create something and the user has to correct it.
104
+
105
+ #### 1. Reference Existing Code (Consistency First)
106
+
107
+ - **Reference targets**: Code with similar functionality or in the same layer within the project
108
+ - **No introducing new patterns** — follow existing patterns first; only abstract when the same pattern repeats 3+ times and needs consolidation
109
+ - **Follow framework Core/Base class patterns** — if the project has `.claude/rules/`, that hierarchy takes precedence
110
+
111
+ #### 2. Independence and Regression Prevention
112
+
113
+ - Verify that new code **does not break existing tests or functionality**
114
+ - Manage side effects (shared state, global variables, file locks)
115
+ - Use `git grep` before changes to understand the impact surface — check for unexpected callers
116
+
117
+ #### 3. Locator and Identifier Stability (UI code only)
118
+
119
+ <!-- [CUSTOMIZE] Can be removed for non-mobile QA / non-web QA projects -->
120
+
121
+ - Do not depend on dynamically generated attributes (auto-generated id, timestamps in content-desc)
122
+ - Avoid absolute XPath — fragile to structural changes
123
+ - Consider i18n for text-based identifiers (multilingual projects)
124
+ - If the project has `.claude/rules/LOCATOR_*` guides, those take precedence
125
+
126
+ #### 4. Flakiness Risk Management
127
+
128
+ - **No `time.sleep`** — use explicit waits (implicit/explicit wait) + condition-based polling
129
+ - No unbounded waits without a timeout
130
+ - Allow tolerance in screenshot-based assertions
131
+ - Minimize assumptions about device/environment state (keyboard visibility, previous screen state, etc.)
132
+
133
+ #### 5. Mandatory grep Before Design (Prevent Missing Own Assets)
134
+
135
+ **Before** designing a new feature or pattern:
136
+
137
+ 1. grep for similar implementations in the project — reuse if already present
138
+ 2. grep learnings from sibling projects in the hub (e.g., `{FH_ROOT}/`) — prevent reinventing solutions already solved elsewhere
139
+ 3. Re-read the project's CLAUDE.md and rules/*.md — check for overlooked constraints
140
+
141
+ Starting design with zero cited references is a warning signal for **missing own assets**. Always present at least 1 grep result before beginning design.
142
+
143
+ ---
144
+
145
+ ### Rule Hierarchy and Priority
146
+
147
+ <!-- [CUSTOMIZE] Define rule sources and priority for your project -->
148
+
149
+ **Priority when conflicts arise:**
150
+ 1. **Framework rules** — code patterns (non-negotiable)
151
+ 2. **Test design philosophy** — "what to test" (QA Identity, etc.)
152
+ 3. **Learned feedback** — rules based on user experience
153
+ 4. **Operational rules** — session backup, report analysis, and other work processes
@@ -0,0 +1,34 @@
1
+ ---
2
+ name: {session title — include the date}
3
+ description: {one-line main achievement or pattern}
4
+ type: contrib-session
5
+ date: YYYY-MM-DD
6
+ tags: [{related}, {tags}]
7
+ contributor: {your-handle}
8
+ ---
9
+
10
+ # {Session title}
11
+
12
+ <!--
13
+ Consent note: placing this file under tracks/_contrib/ is your consent to publish it.
14
+ De-identify before opening the PR: no employer/internal-project/colleague names, no home paths,
15
+ no internal domains, no credentials. The PR gate re-checks, but you scrub first.
16
+ -->
17
+
18
+ ## Context
19
+
20
+ {What project/situation this came from — de-identified. What problem you were working on.}
21
+
22
+ ## What happened / what was found
23
+
24
+ {The work, the pattern, the failure, the fix. Concrete enough to be reusable — file/command level
25
+ where possible, minus anything private.}
26
+
27
+ ## Why it matters beyond my project
28
+
29
+ {The reusable claim: when would another operator hit this? What does this generalize to?}
30
+
31
+ ## Decisions / open questions
32
+
33
+ - Decision: {key call made and why}
34
+ - Open: {what remains unresolved — only if applicable}
@@ -0,0 +1,152 @@
1
+ # goal-quench Stop Hook Setup
2
+
3
+ Add the following to your project's `.claude/settings.json` to enable the goal-quench Stop hook:
4
+
5
+ ```json
6
+ {
7
+ "hooks": {
8
+ "Stop": [
9
+ {
10
+ "matcher": "",
11
+ "hooks": [
12
+ {
13
+ "type": "command",
14
+ "command": "bash -c 'f=\".claude/goal-quench.active\"; [ -f \"$f\" ] && echo \"\\n[goal-quench] /goal finished. Running quality verification...\" && cp \"$f\" \".claude/goal-quench.pending\" && rm -f \"$f\" || true'"
15
+ }
16
+ ]
17
+ }
18
+ ]
19
+ }
20
+ }
21
+ ```
22
+
23
+ Add to your project's `.gitignore`:
24
+
25
+ ```
26
+ .claude/goal-quench.active
27
+ .claude/goal-quench.pending
28
+ ```
29
+
30
+ ## How it works
31
+
32
+ 1. `/goal-quench` (Phase 1) writes `.claude/goal-quench.active` with scope + budget info
33
+ 2. User runs `/goal [condition]`
34
+ 3. When `/goal` finishes → Stop hook fires → detects `.active` → copies to `.pending` → removes `.active`
35
+ 4. Next Claude response: detects `.pending` → auto-runs `pipeline-conductor --quick` → cleans up
36
+
37
+ ## Merge with existing settings.json
38
+
39
+ If you already have a `settings.json`, merge the `hooks.Stop` array:
40
+
41
+ ```json
42
+ {
43
+ "permissions": { ... your existing permissions ... },
44
+ "hooks": {
45
+ "Stop": [
46
+ {
47
+ "matcher": "",
48
+ "hooks": [
49
+ { "type": "command", "command": "... your existing stop hook command if any ..." }
50
+ ]
51
+ },
52
+ {
53
+ "matcher": "",
54
+ "hooks": [
55
+ {
56
+ "type": "command",
57
+ "command": "bash -c 'f=\".claude/goal-quench.active\"; [ -f \"$f\" ] && echo \"\\n[goal-quench] /goal finished. Running quality verification...\" && cp \"$f\" \".claude/goal-quench.pending\" && rm -f \"$f\" || true'"
58
+ }
59
+ ]
60
+ }
61
+ ]
62
+ }
63
+ }
64
+ ```
65
+
66
+ ## Manual Apply (forge-harness)
67
+
68
+ A pre-merged `settings.json` for the forge-harness repo is available at:
69
+
70
+ ```
71
+ templates/goal-quench-settings-merged.json
72
+ ```
73
+
74
+ To apply it manually (one command, run from the forge-harness repo root):
75
+
76
+ ```bash
77
+ cp templates/goal-quench-settings-merged.json .claude/settings.json
78
+ ```
79
+
80
+ This file preserves all existing `permissions` and `enabledPlugins` from the current `.claude/settings.json` and adds the `hooks.Stop` section.
81
+
82
+ Note: `.claude/settings.json` is gitignored (local-only file), so this copy must be done manually on each machine.
83
+
84
+ ## Verification Steps
85
+
86
+ After applying the hook, verify the full pipeline with these steps:
87
+
88
+ ### Step 1 — Start a goal-quench session
89
+
90
+ Run the goal-quench skill to write the `.active` file:
91
+
92
+ ```
93
+ /goal-quench
94
+ ```
95
+
96
+ This should create `.claude/goal-quench.active` with scope + budget metadata.
97
+
98
+ Confirm:
99
+
100
+ ```bash
101
+ ls -la .claude/goal-quench.active
102
+ cat .claude/goal-quench.active
103
+ ```
104
+
105
+ ### Step 2 — Run a goal
106
+
107
+ ```
108
+ /goal <your completion condition here>
109
+ ```
110
+
111
+ Example: `/goal all acceptance tests pass`
112
+
113
+ ### Step 3 — Verify Stop hook fired
114
+
115
+ When the `/goal` task finishes (Claude stops responding), check that:
116
+
117
+ ```bash
118
+ # .active should be gone
119
+ ls .claude/goal-quench.active 2>/dev/null && echo "ERROR: .active still exists" || echo "OK: .active removed"
120
+
121
+ # .pending should exist
122
+ ls .claude/goal-quench.pending && echo "OK: .pending created" || echo "ERROR: .pending missing"
123
+
124
+ # .pending content
125
+ cat .claude/goal-quench.pending
126
+ ```
127
+
128
+ ### Step 4 — Verify auto-trigger in next response
129
+
130
+ Send any message to Claude in the same session. The next response should:
131
+ 1. Detect `.claude/goal-quench.pending`
132
+ 2. Auto-run `pipeline-conductor --quick` (or equivalent quality verification)
133
+ 3. Remove `.pending` after completion
134
+
135
+ If the skill is not installed, Claude will report the pending file and ask how to proceed.
136
+
137
+ ### Step 5 — Cleanup check
138
+
139
+ After the verification round completes:
140
+
141
+ ```bash
142
+ ls .claude/goal-quench.* 2>/dev/null || echo "OK: all state files cleaned up"
143
+ ```
144
+
145
+ ## Troubleshooting
146
+
147
+ | Symptom | Likely cause | Fix |
148
+ |---|---|---|
149
+ | `.active` not created after `/goal-quench` | Skill not writing the file | Check SKILL.md `goal-quench` for file write step |
150
+ | `.active` still present after session stop | Hook not installed / not firing | Re-run `cp templates/goal-quench-settings-merged.json .claude/settings.json`, restart Claude Code |
151
+ | `.pending` created but no auto-trigger | pipeline-conductor not installed | Install or implement the skill; Claude will report the pending state |
152
+ | Hook fires on every stop (not just goal-quench) | Expected — `[ -f "$f" ]` guard prevents false triggers when `.active` absent |
@@ -0,0 +1,83 @@
1
+ # FH Starter Profile — Mode C (plugin only, no clone)
2
+
3
+ > **The one opinionated front door.** FH has 33 skills and a full hub you can clone — but you
4
+ > don't need any of that to get value today. This profile is the *single strong default*: one
5
+ > install command, a curated first-five skills, and a zero-install governance gate. Pick up the
6
+ > rest later if you want it.
7
+ >
8
+ > This is **Mode C** (see `knowledge/shared/rules/modes_and_value.md`): you install the plugin/skills only,
9
+ > you do **not** clone the hub. That trade-off is spelled out under *What Mode C does not include*.
10
+
11
+ ---
12
+
13
+ ## 1. Install — one command
14
+
15
+ **Prerequisite**: Claude Code CLI (`claude --version`).
16
+
17
+ ```bash
18
+ claude plugin marketplace add https://github.com/chrono-meta/forge-harness.git
19
+ claude plugin install -s user fh-meta@forge-harness
20
+ ```
21
+
22
+ That's it — no clone, no shell hooks, no machine setup. Open Claude Code in *your own* project and
23
+ the skills are available as slash commands.
24
+
25
+ ```bash
26
+ cd ~/your-project && claude
27
+ ```
28
+
29
+ ## 2. Governance gate — zero install (no plugin needed either)
30
+
31
+ The core FH value — **"pass → accelerate"**: code that clears the gate ships faster. You can run it
32
+ on any file with nothing installed but `npx`:
33
+
34
+ ```bash
35
+ npx --package @chrono-meta/fh-gate fh-gate # default: Claude backend
36
+ FH_BACKEND=codex npx --package @chrono-meta/fh-gate fh-gate # Codex backend
37
+ # → FH_GATE_VERDICT: PASS | PENDING | BLOCKED | ESCALATE
38
+ ```
39
+
40
+ This wraps any coding agent (Claude, Codex) as a post-generation governance gate. It is the single
41
+ highest-leverage thing to try first if you only do one thing.
42
+
43
+ ## 3. The opinionated first five (start here, ignore the other 28)
44
+
45
+ A new user dropped into 33 skills stalls. These five cover the common path; reach for the rest only
46
+ when a real need shows up.
47
+
48
+ | Skill | Run it when | One line |
49
+ |---|---|---|
50
+ | `/plugin-recommender` | "what tools should I even use?" | Discovery — classifies tools, checks token cost |
51
+ | `/context-doctor` | session feels slow / token-heavy | Generates `.claudeignore`, flags large files, `/clear` timing |
52
+ | `/harness-doctor` | "is my setup sane?" | L1–L4 structure diagnosis + prescription |
53
+ | `/goal-quench` | before executing a risky/long task | Gated execution — the acceleration gate in skill form |
54
+ | `/frontier-digest` | "what's new out there?" | External/frontier trend cross-reference |
55
+
56
+ Natural language works too — you don't need to memorize slash commands. "manage my context",
57
+ "recommend a plugin", "check my harness structure" route to the same skills.
58
+
59
+ ## 4. What Mode C does *not* include (honest boundary)
60
+
61
+ Plugin-only install gives you **Layer 2 (the skills)**. It does **not** give you **Layer 1**, which
62
+ only activates when you clone the hub (Mode A/B):
63
+
64
+ - **No active onboarding cascade** — no greeting-triggered 5-skill auto-run. You invoke skills yourself.
65
+ - **No acceleration baseline** — no zshrc notification hook, no sentinels, no weekly-audit schedule,
66
+ no 4-axis pre-commit gate. Those are hub-internal infra and are deliberately not shipped to Mode C.
67
+ - **No automatic harness signals** — history accumulation happens on *your* project side; FH won't
68
+ prompt you. (FH absorbs Mode-C contributions through issue monitoring + PR cadence, not a daemon.)
69
+
70
+ If you later want Layer 1, clone the hub and run `/install-wizard` — the full path. The README's
71
+ "Get started in 2 minutes" covers it.
72
+
73
+ ## 5. Want to go further?
74
+
75
+ - **Clone the hub** (Mode A/B) → persistent cross-project knowledge, `tracks/`, the compounding loop.
76
+ - **Contribute back** → a Mode-C PR is exactly the external validation FH is looking for. Open an
77
+ issue or PR on `chrono-meta/forge-harness`.
78
+
79
+ ---
80
+
81
+ *Design note: this profile follows the frictionless-distribution + opinionated-front-door pattern
82
+ seen in field harnesses like [gstack](https://github.com/garrytan/gstack) — a single strong default
83
+ as the public entry point, full meta-flexibility kept behind it.*
@@ -0,0 +1,46 @@
1
+ #!/usr/bin/env bash
2
+ # temper_check.sh — Wave-T (Temper) step T-1: complexity delta of a quench.
3
+ # Measures how much complexity a steel-quench ADDED to a markdown asset
4
+ # (pre-quench baseline → post-convergence). It is a MEASUREMENT, not a detector
5
+ # (don't-overbuild guard: no judgment engine here — T-3 verdict is human/LLM).
6
+ #
7
+ # Usage: temper_check.sh <repo> <file-rel-path> <pre-quench-ref> [<post-ref>]
8
+ # <post-ref> default = working tree.
9
+ # See plugins/fh-meta/skills/steel-quench/SKILL.md §Wave-T.
10
+ set -euo pipefail
11
+
12
+ repo="${1:?repo path}"; file="${2:?file rel path}"; pre="${3:?pre-quench ref}"; post="${4:-}"
13
+
14
+ metrics() { # reads text on stdin → "lines sections steps tables fences crossrefs"
15
+ local t prose; t="$(cat)"
16
+ # sections/steps/tables count PROSE only — lines inside ``` fences are code
17
+ # (bash comments `# ...` would otherwise inflate Δsections; found run #4, install-wizard)
18
+ prose="$(printf '%s\n' "$t" | awk '/^[[:space:]]*```/{f=!f;next} !f')"
19
+ local lines sections steps tables fences crossrefs
20
+ lines=$(printf '%s\n' "$t" | wc -l | tr -d ' ')
21
+ sections=$(printf '%s\n' "$prose" | grep -cE '^#{1,6} ' || true)
22
+ steps=$(printf '%s\n' "$prose" | grep -cE '^[[:space:]]*([0-9]+\.|[-*] )' || true)
23
+ tables=$(printf '%s\n' "$prose" | grep -cE '^\|' || true)
24
+ fences=$(( $(printf '%s\n' "$t" | grep -c '```' || true) / 2 ))
25
+ crossrefs=$(printf '%s\n' "$t" | grep -oE '\]\(|\[\[' | wc -l | tr -d ' ')
26
+ echo "$lines $sections $steps $tables $fences $crossrefs"
27
+ }
28
+
29
+ pre_txt=$(git -C "$repo" show "$pre:$file")
30
+ if [ -n "$post" ]; then post_txt=$(git -C "$repo" show "$post:$file"); else post_txt=$(cat "$repo/$file"); fi
31
+
32
+ read -r l0 s0 p0 t0 f0 x0 <<<"$(printf '%s' "$pre_txt" | metrics)"
33
+ read -r l1 s1 p1 t1 f1 x1 <<<"$(printf '%s' "$post_txt" | metrics)"
34
+
35
+ printf '\n=== Wave-T complexity delta — %s ===\n' "$file"
36
+ printf 'baseline: %s post: %s\n\n' "$pre" "${post:-<working>}"
37
+ printf '%-12s %6s %6s %8s\n' metric pre post Δ
38
+ for row in "lines $l0 $l1" "sections $s0 $s1" "steps $p0 $p1" "tables $t0 $t1" "fences $f0 $f1" "cross-refs $x0 $x1"; do
39
+ set -- $row; printf '%-12s %6s %6s %+8d\n' "$1" "$2" "$3" "$(( $3 - $2 ))"
40
+ done
41
+
42
+ dx=$(( x1 - x0 )); dp=$(( p1 - p0 ))
43
+ printf '\n-- T-3 heuristic flags (review, not auto-reject) --\n'
44
+ [ "$dx" -gt "$dp" ] && printf ' ⚠ Δcross-refs(%+d) > Δsteps(%+d): quench added wiring, not function?\n' "$dx" "$dp" || true
45
+ [ "$(( s1 - s0 ))" -gt 0 ] && printf ' ⚠ %+d new section(s): confirm each fixes a flaw, not just defends a Wave finding\n' "$(( s1 - s0 ))" || true
46
+ printf '\nNext: run harness-doctor on post asset for absolute tier (T-2), then record τ verdict (PASS / FAIL + named construct)\n'