@chrono-meta/fh-gate 2.15.1 → 3.1.0
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.
- package/.claude/regression/probes_live.yaml +137 -0
- package/.claude/rules/.residency-patterns.defaults +7 -0
- package/.claude/rules/fh_4axis_gate.md +88 -1
- package/.claude-plugin/marketplace.json +8 -2
- package/AGENTS.md +27 -0
- package/CATALOG.md +17 -0
- package/CLAUDE.md +13 -3
- package/README.ja.md +51 -7
- package/README.ko.md +48 -7
- package/README.md +43 -6
- package/README.zh.md +45 -8
- package/docs/STANDARDS_ALIGNMENT.md +61 -0
- package/docs/USER_GUIDE.md +3 -0
- package/docs/USE_CASES.md +50 -0
- package/docs/model_tier_expectations.md +60 -0
- package/knowledge/shared/harness-core/fh_three_layer_canon.md +77 -10
- package/knowledge/shared/harness-core/field_verdict_crossfamily_gate.md +18 -0
- package/knowledge/shared/harness-core/harness_incubator_doctrine.md +9 -0
- package/knowledge/shared/harness-core/iso_ai_standards_crosswalk.md +139 -0
- package/knowledge/shared/harness-core/measurement-integrity-checklist.md +35 -1
- package/knowledge/shared/harness-core/ship_readiness_gate.md +19 -2
- package/knowledge/shared/learnings/subagent_invocations_log.yaml +489 -3
- package/package.json +48 -2
- package/plugins/fh-commons/.claude-plugin/plugin.json +1 -1
- package/plugins/fh-commons/skills/preprep/README.md +4 -1
- package/plugins/fh-commons/skills/preprep/SKILL.md +99 -3
- package/plugins/fh-commons/skills/preprep/diagram_from_json.py +154 -0
- package/plugins/fh-commons/skills/preprep/fixtures/fixture_R3_negative.pptx +0 -0
- package/plugins/fh-commons/skills/preprep/fixtures/fixture_R3_positive.pptx +0 -0
- package/plugins/fh-commons/skills/preprep/fixtures/mk_slide_fixtures.py +179 -0
- package/plugins/fh-commons/skills/preprep/interslide_deps.py +98 -9
- package/plugins/fh-commons/skills/preprep/lane_adjacent_dup.py +4 -1
- package/plugins/fh-commons/skills/preprep/lane_diagram.py +95 -0
- package/plugins/fh-commons/skills/preprep/lane_geometry.py +181 -0
- package/plugins/fh-commons/skills/preprep/lane_promise.py +4 -1
- package/plugins/fh-commons/skills/preprep/lane_slide_refs.py +134 -0
- package/plugins/fh-commons/skills/preprep/lane_slide_relations.py +300 -0
- package/plugins/fh-commons/skills/preprep/preprep.py +129 -8
- package/plugins/fh-commons/skills/preprep/preprep_wire.py +210 -0
- package/plugins/fh-commons/skills/preprep/presentation_checklist.md +4 -0
- package/plugins/fh-commons/skills/preprep/surfaces.example.yaml +18 -0
- package/plugins/fh-commons/skills/preprep/test_preprep_lanes_rp.py +184 -0
- package/plugins/fh-meta/.claude-plugin/plugin.json +1 -1
- package/plugins/fh-meta/CHANGELOG.md +67 -0
- package/plugins/fh-meta/skills/auto-decorrelation/SKILL.md +87 -2
- package/plugins/fh-meta/skills/frontier-digest/SKILL.md +2 -2
- package/plugins/fh-meta/skills/frontier-digest/SKILL_detail.md +25 -5
- package/plugins/fh-meta/skills/hub-cc-pr-reviewer/SKILL.md +11 -0
- package/plugins/fh-meta/skills/hub-cc-pr-reviewer/SKILL_detail.md +3 -0
- package/plugins/fh-qp/.claude-plugin/plugin.json +22 -0
- package/plugins/fh-qp/README.md +71 -0
- package/plugins/fh-qp/fixtures/evidence_known_clean.txt +3 -0
- package/plugins/fh-qp/fixtures/evidence_known_dirty.txt +6 -0
- package/plugins/fh-qp/fixtures/reach_known_partial.tsv +4 -0
- package/plugins/fh-qp/fixtures/reach_known_reached.tsv +4 -0
- package/plugins/fh-qp/fixtures/reach_known_wall.tsv +3 -0
- package/plugins/fh-qp/fixtures/verdicts_known_bad_branch.tsv +2 -0
- package/plugins/fh-qp/fixtures/verdicts_known_bad_vacuous_machine.tsv +2 -0
- package/plugins/fh-qp/fixtures/verdicts_known_good.tsv +4 -0
- package/plugins/fh-qp/fixtures/verdicts_verify_only.tsv +3 -0
- package/plugins/fh-qp/qp_profile.example.yaml +29 -0
- package/plugins/fh-qp/scripts/qp_tools.sh +216 -0
- package/plugins/fh-qp/skills/qp/SKILL.md +65 -0
- package/plugins/fh-qp/skills/qp-plan/SKILL.md +42 -0
- package/plugins/fh-qp/skills/qp-regress/SKILL.md +45 -0
- package/plugins/fh-qp/skills/qp-run/SKILL.md +49 -0
- package/scripts/backtick_guard.sh +194 -0
- package/scripts/chamber_run.sh +14 -5
- package/scripts/com.forge-harness.live-eval.plist +84 -0
- package/scripts/compaction_probe.sh +9 -35
- package/scripts/context_continuity_score.sh +49 -7
- package/scripts/directional_diff_gate.sh +14 -2
- package/scripts/fh-gate.sh +3 -3
- package/scripts/files_manifest_shipping_check.sh +19 -0
- package/scripts/frontier_digest_autopilot.sh +4 -1
- package/scripts/gate_pathspec_check.sh +1 -1
- package/scripts/map_postprocess.py +90 -0
- package/scripts/outbound_query_guard.sh +131 -0
- package/scripts/outbound_query_hook.sh +373 -0
- package/scripts/package_coverage_check.sh +79 -18
- package/scripts/pipe_verdict_guard.sh +41 -1
- package/scripts/probe_live_eval.sh +240 -0
- package/scripts/probe_live_eval_lib.py +579 -0
- package/scripts/proposal_hook.sh +192 -0
- package/scripts/public_surface_scan_files.sh +11 -2
- package/scripts/push_zone_check.sh +78 -0
- package/scripts/residency_closure_scan.py +252 -0
- package/scripts/revert_probe.sh +250 -0
- package/scripts/selfcheck.sh +106 -3
- package/scripts/session_close_check.sh +100 -0
- package/scripts/sim_isolated_run.sh +195 -9
- package/scripts/test_action_yml_lanes.sh +97 -0
- package/scripts/test_backtick_guard_lanes.sh +115 -0
- package/scripts/test_degrade_scan_shell_probes.sh +7 -7
- package/scripts/test_fh_qp_lanes.sh +105 -0
- package/scripts/test_files_manifest_shipping_lanes.sh +5 -5
- package/scripts/test_gate_two_verdicts_lanes.sh +139 -0
- package/scripts/test_heavy_classifier_lanes.sh +1 -1
- package/scripts/test_lane_runner_lanes.sh +59 -33
- package/scripts/test_map_postprocess_lanes.sh +143 -0
- package/scripts/test_mapped_tracks_lanes.sh +1 -1
- package/scripts/test_marker_affected_lanes.sh +93 -0
- package/scripts/test_marker_crossfamily_lanes.sh +90 -6
- package/scripts/test_marker_oracle_lanes.sh +136 -0
- package/scripts/test_marker_soul_check_lanes.sh +24 -0
- package/scripts/test_node_check_lanes.sh +34 -34
- package/scripts/test_outbound_query_hook_lanes.sh +433 -0
- package/scripts/test_outbound_query_lanes.sh +87 -0
- package/scripts/test_package_coverage_lanes.sh +53 -27
- package/scripts/test_pipe_verdict_guard_lanes.sh +31 -5
- package/scripts/test_precommit_pointer_index_lanes.sh +33 -0
- package/scripts/test_preprep_diagram_lanes.sh +87 -0
- package/scripts/test_preprep_drift_anchor.sh +16 -7
- package/scripts/test_preprep_drift_anchor_lanes.sh +23 -0
- package/scripts/test_preprep_slide_refs_lanes.sh +169 -0
- package/scripts/test_probe_live_eval_lanes.sh +437 -0
- package/scripts/test_proposal_hook_lanes.sh +57 -0
- package/scripts/test_push_zone_lanes.sh +304 -0
- package/scripts/test_residency_closure_lanes.sh +70 -0
- package/scripts/test_revert_probe_lanes.sh +146 -0
- package/scripts/test_session_close_lanes.sh +3 -5
- package/scripts/test_sim_isolated_run_lanes.sh +136 -0
- package/scripts/test_utterance_intake_lanes.sh +414 -0
- package/scripts/test_worktree_reclaim_lanes.sh +70 -0
- package/scripts/transcript_utterances.py +222 -0
- package/scripts/utterance_intake.sh +424 -0
- package/scripts/utterance_landing_check.sh +2 -2
- package/scripts/validate_yaml.sh +27 -0
- package/scripts/worktree_reclaim.sh +95 -0
- package/templates/.git-hooks/pre-commit +380 -5
- package/templates/.git-hooks/pre-push +91 -0
- package/templates/RED_TEAM_REPORT.md +49 -0
- package/templates/settings.PreToolUse.snippet.json +101 -1
- package/plugins/fh-commons/README.md +0 -38
|
@@ -42,43 +42,43 @@ echo "── node-check lanes ──"
|
|
|
42
42
|
# LANE 1 (S3-1) — NOT a git repo. The git-hook floor cannot be installed here at all, so it is
|
|
43
43
|
# N/A, not missing. Reporting it would be an unfixable notice repeating every session forever.
|
|
44
44
|
mkdir -p "$TMP/nogit"
|
|
45
|
-
out="$(run "$TMP/nogit" "$TMP/s1" FH_MACHINE_ID=nogitbox)"
|
|
45
|
+
out="$(run "$TMP/nogit" "$TMP/s1" FH_MACHINE_ID=nogitbox)"; rc=$?
|
|
46
46
|
# POSITIVE CONTROL: assert what MUST appear alongside what must not. Absence-only lanes are
|
|
47
47
|
# satisfied by a script that prints nothing at all — an `exit 0` stub passed lanes 1, 4 and 7
|
|
48
48
|
# (cross-family mutation 2026-07-30), so each now pins an expected utterance too.
|
|
49
49
|
case "$out" in
|
|
50
|
-
*"Missing mechanical floor"*) bad "lane1 non-git: must NOT claim a missing floor (N/A, unfixable)" "$out" ;;
|
|
50
|
+
*"Missing mechanical floor"*) bad "lane1 non-git: must NOT claim a missing floor (N/A, unfixable)" "rc=$rc | $out" ;;
|
|
51
51
|
*"first session for this clone"*) ok "lane1 non-git: N/A on the git floor, but still reports the node event" ;;
|
|
52
|
-
*) bad "lane1 non-git: silent — a stub would pass this lane" "$out" ;;
|
|
52
|
+
*) bad "lane1 non-git: silent — a stub would pass this lane" "rc=$rc | $out" ;;
|
|
53
53
|
esac
|
|
54
54
|
|
|
55
55
|
# LANE 2 (S3-2) — hooks exist but belong to another framework (husky/pre-commit). Executable ≠ FH's
|
|
56
56
|
# gate. Silence here is the exact accident this check was built for: FH gates absent, machine quiet.
|
|
57
57
|
mk_git_hub "$TMP/husky" no
|
|
58
|
-
out="$(run "$TMP/husky" "$TMP/s2" FH_MACHINE_ID=huskybox)"
|
|
58
|
+
out="$(run "$TMP/husky" "$TMP/s2" FH_MACHINE_ID=huskybox)"; rc=$?
|
|
59
59
|
case "$out" in
|
|
60
60
|
*"Missing mechanical floor"*) ok "lane2 foreign hooks: FH gate absence reported" ;;
|
|
61
|
-
*) bad "lane2 foreign hooks: non-FH hooks were accepted as FH floors" "$out" ;;
|
|
61
|
+
*) bad "lane2 foreign hooks: non-FH hooks were accepted as FH floors" "rc=$rc | $out" ;;
|
|
62
62
|
esac
|
|
63
63
|
|
|
64
64
|
# LANE 3 (S3-3) — Mode D user on a FRESH clone: companion store present, settings.local.json absent
|
|
65
65
|
# (it is gitignored, so a clone never has it). This is the MEASURED 2026-07-30 incident. Must speak.
|
|
66
66
|
mk_git_hub "$TMP/moded" yes
|
|
67
67
|
mkdir -p "$TMP/companion/.git"
|
|
68
|
-
out="$(run "$TMP/moded" "$TMP/s3" FH_MACHINE_ID=modedbox BE_DIR="$TMP/companion")"
|
|
68
|
+
out="$(run "$TMP/moded" "$TMP/s3" FH_MACHINE_ID=modedbox BE_DIR="$TMP/companion")"; rc=$?
|
|
69
69
|
case "$out" in
|
|
70
70
|
*companion-load*) ok "lane3 fresh Mode D clone: companion-load absence surfaced" ;;
|
|
71
|
-
*) bad "lane3 fresh Mode D clone: SILENT — the measured incident would recur" "$out" ;;
|
|
71
|
+
*) bad "lane3 fresh Mode D clone: SILENT — the measured incident would recur" "rc=$rc | $out" ;;
|
|
72
72
|
esac
|
|
73
73
|
|
|
74
74
|
# LANE 4 (M2-4) — public non-Mode-D user: no companion store anywhere. The companion item must not
|
|
75
75
|
# appear, or the majority path gets a false positive for a feature it does not use.
|
|
76
76
|
mk_git_hub "$TMP/public" yes
|
|
77
|
-
out="$(run "$TMP/public" "$TMP/s4" FH_MACHINE_ID=publicbox)"
|
|
77
|
+
out="$(run "$TMP/public" "$TMP/s4" FH_MACHINE_ID=publicbox)"; rc=$?
|
|
78
78
|
case "$out" in
|
|
79
|
-
*companion-load*) bad "lane4a non-Mode-D: companion item shown to a user with no store" "$out" ;;
|
|
79
|
+
*companion-load*) bad "lane4a non-Mode-D: companion item shown to a user with no store" "rc=$rc | $out" ;;
|
|
80
80
|
*"first session for this clone"*) ok "lane4a non-Mode-D: companion absent, node event still reported" ;;
|
|
81
|
-
*) bad "lane4a non-Mode-D: silent — a stub would pass this lane" "$out" ;;
|
|
81
|
+
*) bad "lane4a non-Mode-D: silent — a stub would pass this lane" "rc=$rc | $out" ;;
|
|
82
82
|
esac
|
|
83
83
|
|
|
84
84
|
# LANE 4b (S4-1) — CLAUDE.local.md is Claude Code's STANDARD local-override file; anyone may keep
|
|
@@ -86,9 +86,9 @@ esac
|
|
|
86
86
|
# gets a companion notice every session forever (state-based emission makes it permanent, not
|
|
87
87
|
# one-shot). Only the binding INSIDE the file counts.
|
|
88
88
|
printf '# my local notes\nuse tabs not spaces\n' > "$TMP/public/CLAUDE.local.md"
|
|
89
|
-
out="$(run "$TMP/public" "$TMP/s4b" FH_MACHINE_ID=publicbox)"
|
|
89
|
+
out="$(run "$TMP/public" "$TMP/s4b" FH_MACHINE_ID=publicbox)"; rc=$?
|
|
90
90
|
case "$out" in
|
|
91
|
-
*companion-load*) bad "lane4b plain CLAUDE.local.md: existence alone classified the user as Mode D" "$out" ;;
|
|
91
|
+
*companion-load*) bad "lane4b plain CLAUDE.local.md: existence alone classified the user as Mode D" "rc=$rc | $out" ;;
|
|
92
92
|
*) ok "lane4b plain CLAUDE.local.md: not treated as a Mode D signal" ;;
|
|
93
93
|
esac
|
|
94
94
|
|
|
@@ -106,10 +106,10 @@ for binding in 'BE_DIR=/x/store' 'companion store: ~/notes' '컴패니언 스토
|
|
|
106
106
|
'vault: ~/vaults/notes' 'gbrain ingest target: ~/gbrain' 'backend: obsidian'; do
|
|
107
107
|
i=$((i+1))
|
|
108
108
|
printf '# local\n%s\n' "$binding" > "$TMP/public/CLAUDE.local.md"
|
|
109
|
-
out="$(run "$TMP/public" "$TMP/s4c$i" FH_MACHINE_ID=publicbox)"
|
|
109
|
+
out="$(run "$TMP/public" "$TMP/s4c$i" FH_MACHINE_ID=publicbox)"; rc=$?
|
|
110
110
|
case "$out" in
|
|
111
111
|
*companion-load*) ok "lane4c.$i Mode D detected via: $binding" ;;
|
|
112
|
-
*) bad "lane4c.$i binding present but Mode D not detected: $binding" "$out" ;;
|
|
112
|
+
*) bad "lane4c.$i binding present but Mode D not detected: $binding" "rc=$rc | $out" ;;
|
|
113
113
|
esac
|
|
114
114
|
done
|
|
115
115
|
rm -f "$TMP/public/CLAUDE.local.md"
|
|
@@ -136,24 +136,24 @@ done
|
|
|
136
136
|
# exist and working hooks read as missing.
|
|
137
137
|
mk_git_hub "$TMP/wt" yes
|
|
138
138
|
git -C "$TMP/wt" worktree add -q "$TMP/wt_linked" -b lane7 2>/dev/null
|
|
139
|
-
out="$(run "$TMP/wt_linked" "$TMP/s7" FH_MACHINE_ID=wtbox)"
|
|
139
|
+
out="$(run "$TMP/wt_linked" "$TMP/s7" FH_MACHINE_ID=wtbox)"; rc=$?
|
|
140
140
|
case "$out" in
|
|
141
|
-
*"Missing mechanical floor"*) bad "lane7 worktree: false missing-floor (hooks resolve to the main gitdir)" "$out" ;;
|
|
141
|
+
*"Missing mechanical floor"*) bad "lane7 worktree: false missing-floor (hooks resolve to the main gitdir)" "rc=$rc | $out" ;;
|
|
142
142
|
*"first session for this clone"*) ok "lane7 worktree: hooks resolved correctly, node event reported" ;;
|
|
143
|
-
*) bad "lane7 worktree: silent — a stub would pass this lane" "$out" ;;
|
|
143
|
+
*) bad "lane7 worktree: silent — a stub would pass this lane" "rc=$rc | $out" ;;
|
|
144
144
|
esac
|
|
145
145
|
|
|
146
146
|
# LANE 8 (M3-3) — python3 unavailable: the companion verdict is UNMEASURED, never silently "fine".
|
|
147
147
|
# Simulated by a PATH with no python3, for a Mode D hub (so the check is applicable).
|
|
148
148
|
mk_git_hub "$TMP/nopy" yes
|
|
149
149
|
mkdir -p "$TMP/emptybin" "$TMP/companion2/.git"
|
|
150
|
-
out="$(PATH="$TMP/emptybin:/usr/bin:/bin" run "$TMP/nopy" "$TMP/s8" FH_MACHINE_ID=nopybox BE_DIR="$TMP/companion2")"
|
|
150
|
+
out="$(PATH="$TMP/emptybin:/usr/bin:/bin" run "$TMP/nopy" "$TMP/s8" FH_MACHINE_ID=nopybox BE_DIR="$TMP/companion2")"; rc=$?
|
|
151
151
|
if command -v python3 >/dev/null 2>&1 && [ -x /usr/bin/python3 ]; then
|
|
152
152
|
ok "lane8 skipped: /usr/bin/python3 exists so absence cannot be simulated via PATH"
|
|
153
153
|
else
|
|
154
154
|
case "$out" in
|
|
155
155
|
*UNMEASURED*|*unmeasured*) ok "lane8 no python3: reported UNMEASURED, not silence" ;;
|
|
156
|
-
*) bad "lane8 no python3: absence read as pass" "$out" ;;
|
|
156
|
+
*) bad "lane8 no python3: absence read as pass" "rc=$rc | $out" ;;
|
|
157
157
|
esac
|
|
158
158
|
fi
|
|
159
159
|
|
|
@@ -249,11 +249,11 @@ else
|
|
|
249
249
|
fi
|
|
250
250
|
git -C "$_dn" fetch -q origin >/dev/null 2>&1
|
|
251
251
|
_h0="$(git -C "$_dn" rev-parse HEAD)"
|
|
252
|
-
run "$_dn" "$_ap_root/s_a"
|
|
252
|
+
_out_a="$(run "$_dn" "$_ap_root/s_a" 2>&1)"; _rc_a=$?
|
|
253
253
|
if [ "$(git -C "$_dn" rev-parse HEAD)" != "$_h0" ]; then
|
|
254
254
|
ok "lane10-a APPLY: consented + on default branch → fast-forwarded"
|
|
255
255
|
else
|
|
256
|
-
bad "lane10-a APPLY: consented + on default branch did NOT fast-forward (feature inert — every refuse lane below is then vacuous)" "
|
|
256
|
+
bad "lane10-a APPLY: consented + on default branch did NOT fast-forward (feature inert — every refuse lane below is then vacuous)" "before=$_h0 rc=$_rc_a out=$_out_a"
|
|
257
257
|
fi
|
|
258
258
|
|
|
259
259
|
# b — the envelope. Never applies off the default branch, and NEVER switches branches.
|
|
@@ -267,13 +267,13 @@ else
|
|
|
267
267
|
# version of this lane asserted only those two and stayed green against a defeated envelope —
|
|
268
268
|
# decorative. The tip that must not move is the CURRENT branch's own.
|
|
269
269
|
_f0="$(git -C "$_dn" rev-parse feat-x)"
|
|
270
|
-
run "$_dn" "$_ap_root/s_b"
|
|
270
|
+
_out_b="$(run "$_dn" "$_ap_root/s_b" 2>&1)"; _rc_b=$?
|
|
271
271
|
if [ "$(git -C "$_dn" rev-parse "$_DEF")" = "$_m0" ] \
|
|
272
272
|
&& [ "$(git -C "$_dn" rev-parse feat-x)" = "$_f0" ] \
|
|
273
273
|
&& [ "$(git -C "$_dn" branch --show-current)" = "feat-x" ]; then
|
|
274
274
|
ok "lane10-b ENVELOPE: off default branch → no apply on EITHER branch, no switch"
|
|
275
275
|
else
|
|
276
|
-
bad "lane10-b ENVELOPE: a branch tip moved off the default branch — the shared-checkout hazard" "main=$_m0->$(git -C "$_dn" rev-parse "$_DEF") feat-x=$_f0->$(git -C "$_dn" rev-parse feat-x) branch=$(git -C "$_dn" branch --show-current)"
|
|
276
|
+
bad "lane10-b ENVELOPE: a branch tip moved off the default branch — the shared-checkout hazard" "main=$_m0->$(git -C "$_dn" rev-parse "$_DEF") feat-x=$_f0->$(git -C "$_dn" rev-parse feat-x) branch=$(git -C "$_dn" branch --show-current) rc=$_rc_b out=$_out_b"
|
|
277
277
|
fi
|
|
278
278
|
git -C "$_dn" switch -q "$_DEF" >/dev/null 2>&1
|
|
279
279
|
|
|
@@ -285,29 +285,29 @@ p=sys.argv[1]; s=open(p,encoding='utf-8').read()
|
|
|
285
285
|
open(p,'w',encoding='utf-8').write(re.sub(r'\nstanding_consent:\n(?: .*\n| .*\n)*', '\n', s, count=1))
|
|
286
286
|
PYX
|
|
287
287
|
_h1="$(git -C "$_dn" rev-parse HEAD)"
|
|
288
|
-
run "$_dn" "$_ap_root/s_c"
|
|
288
|
+
_out_c="$(run "$_dn" "$_ap_root/s_c" 2>&1)"; _rc_c=$?
|
|
289
289
|
[ "$(git -C "$_dn" rev-parse HEAD)" = "$_h1" ] \
|
|
290
290
|
&& ok "lane10-c NO-GRANT: absent standing_consent → no apply" \
|
|
291
|
-
|| bad "lane10-c NO-GRANT: applied without a grant" "
|
|
291
|
+
|| bad "lane10-c NO-GRANT: applied without a grant" "before=$_h1 rc=$_rc_c out=$_out_c"
|
|
292
292
|
|
|
293
293
|
# d — expired lease. A lease nobody enforces is not a lease.
|
|
294
294
|
cp "$_ap_root/uap.bak" "$_dn/tracks/_meta/user_adaptation_profile.md"
|
|
295
295
|
sed -i.bak2 's/expires: [0-9-]*/expires: 2020-01-01/' "$_dn/tracks/_meta/user_adaptation_profile.md"
|
|
296
296
|
_h2="$(git -C "$_dn" rev-parse HEAD)"
|
|
297
|
-
run "$_dn" "$_ap_root/s_d"
|
|
297
|
+
_out_d="$(run "$_dn" "$_ap_root/s_d" 2>&1)"; _rc_d=$?
|
|
298
298
|
[ "$(git -C "$_dn" rev-parse HEAD)" = "$_h2" ] \
|
|
299
299
|
&& ok "lane10-d EXPIRED: past-dated lease → no apply" \
|
|
300
|
-
|| bad "lane10-d EXPIRED: applied under an expired lease" "
|
|
300
|
+
|| bad "lane10-d EXPIRED: applied under an expired lease" "before=$_h2 rc=$_rc_d out=$_out_d"
|
|
301
301
|
cp "$_ap_root/uap.bak" "$_dn/tracks/_meta/user_adaptation_profile.md"
|
|
302
302
|
|
|
303
303
|
# e — divergence. --ff-only must refuse rather than absorb, and local work must survive.
|
|
304
304
|
(cd "$_dn" && echo local-only > mine.txt && git add -A && git commit -qm diverge) >/dev/null 2>&1
|
|
305
305
|
_h3="$(git -C "$_dn" rev-parse HEAD)"
|
|
306
|
-
run "$_dn" "$_ap_root/s_e"
|
|
306
|
+
_out_e="$(run "$_dn" "$_ap_root/s_e" 2>&1)"; _rc_e=$?
|
|
307
307
|
if [ "$(git -C "$_dn" rev-parse HEAD)" = "$_h3" ] && [ -f "$_dn/mine.txt" ]; then
|
|
308
308
|
ok "lane10-e DIVERGED: ff refused, local commit survives"
|
|
309
309
|
else
|
|
310
|
-
bad "lane10-e DIVERGED: local history was moved or lost" "$_h3 -> $(git -C "$_dn" rev-parse HEAD)"
|
|
310
|
+
bad "lane10-e DIVERGED: local history was moved or lost" "$_h3 -> $(git -C "$_dn" rev-parse HEAD) rc=$_rc_e out=$_out_e"
|
|
311
311
|
fi
|
|
312
312
|
|
|
313
313
|
# f — WRONG CLASS. The refusal that the other three arms structurally cannot produce.
|
|
@@ -367,7 +367,7 @@ PYX
|
|
|
367
367
|
if [ "$_h5" = "$(git -C "$_dn" rev-parse "origin/$_DEF")" ]; then
|
|
368
368
|
bad "lane10-f VACUOUS: clone is not behind origin, so 'no apply' proves nothing" "$_h5"
|
|
369
369
|
fi
|
|
370
|
-
run "$_dn" "$_ap_root/s_f"
|
|
370
|
+
_out_f="$(run "$_dn" "$_ap_root/s_f" 2>&1)"; _rc_f=$?
|
|
371
371
|
_filewide=0
|
|
372
372
|
bash "$FH_REPO/scripts/consent_registry_check.sh" \
|
|
373
373
|
"$_dn/tracks/_meta/consent_classes.yaml" \
|
|
@@ -375,9 +375,9 @@ PYX
|
|
|
375
375
|
if [ "$(git -C "$_dn" rev-parse HEAD)" = "$_h5" ] && [ "$_filewide" = "0" ]; then
|
|
376
376
|
ok "lane10-f WRONG-CLASS: another class granted, this one only in prose → no apply (file-wide check still 0)"
|
|
377
377
|
elif [ "$_filewide" != "0" ]; then
|
|
378
|
-
bad "lane10-f VACUOUS: the fixture broke the file-wide verdict (rc=$_filewide), so it re-tests lane10-c's axis, not the class join" "rebuild the fixture so the bare check returns 0"
|
|
378
|
+
bad "lane10-f VACUOUS: the fixture broke the file-wide verdict (rc=$_filewide), so it re-tests lane10-c's axis, not the class join" "rebuild the fixture so the bare check returns 0 | run_rc=$_rc_f run_out=$_out_f"
|
|
379
379
|
else
|
|
380
|
-
bad "lane10-f WRONG-CLASS: applied on a class that was never granted" "$_h5 -> $(git -C "$_dn" rev-parse HEAD)"
|
|
380
|
+
bad "lane10-f WRONG-CLASS: applied on a class that was never granted" "$_h5 -> $(git -C "$_dn" rev-parse HEAD) run_rc=$_rc_f run_out=$_out_f"
|
|
381
381
|
fi
|
|
382
382
|
cp "$_ap_root/uap.bak" "$_dn/tracks/_meta/user_adaptation_profile.md"
|
|
383
383
|
|
|
@@ -387,10 +387,10 @@ PYX
|
|
|
387
387
|
(cd "$_ap_root/up" && echo newer3 > f.txt && git commit -qam ahead3) >/dev/null 2>&1
|
|
388
388
|
git -C "$_dn" fetch -q origin >/dev/null 2>&1
|
|
389
389
|
_h4="$(git -C "$_dn" rev-parse HEAD)"
|
|
390
|
-
run "$_dn" "$_ap_root/s_f"
|
|
390
|
+
_out_ctrl="$(run "$_dn" "$_ap_root/s_f" 2>&1)"; _rc_ctrl=$?
|
|
391
391
|
[ "$(git -C "$_dn" rev-parse HEAD)" != "$_h4" ] \
|
|
392
392
|
&& ok "lane10-CONTROL: apply arm still fires after the refuse arms (instrument alive)" \
|
|
393
|
-
|| bad "lane10-CONTROL: apply arm went inert — the refuse lanes above prove nothing" "
|
|
393
|
+
|| bad "lane10-CONTROL: apply arm went inert — the refuse lanes above prove nothing" "before=$_h4 rc=$_rc_ctrl out=$_out_ctrl"
|
|
394
394
|
fi
|
|
395
395
|
rm -rf "$_ap_root"
|
|
396
396
|
|