@chrono-meta/fh-gate 2.3.0 โ 2.4.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/rules/fh_4axis_gate.md +25 -0
- package/.claude-plugin/marketplace.json +2 -2
- package/CLAUDE.md +51 -6
- package/README.ja.md +14 -2
- package/README.ko.md +14 -1
- package/README.md +16 -2
- package/README.zh.md +12 -1
- package/knowledge/shared/harness-core/field_verdict_crossfamily_gate.md +231 -7
- package/knowledge/shared/harness-core/harness_incubator_doctrine.md +215 -1
- package/knowledge/shared/harness-core/ship_readiness_gate.md +168 -1
- package/knowledge/shared/learnings/subagent_invocations_log.yaml +24 -0
- package/package.json +6 -1
- package/plugins/fh-commons/.claude-plugin/plugin.json +1 -1
- package/plugins/fh-meta/.claude-plugin/plugin.json +1 -1
- package/plugins/fh-meta/CHANGELOG.md +57 -0
- package/plugins/fh-meta/skills/auto-decorrelation/SKILL.md +20 -0
- package/plugins/fh-meta/skills/steel-quench/SKILL.md +25 -2
- package/scripts/adapters/mate_agent_boundary.sh +27 -7
- package/scripts/capability_registry_check.sh +69 -3
- package/scripts/relay_channel.sh +151 -6
- package/scripts/selfcheck.sh +18 -0
- package/scripts/target_freeze.sh +239 -0
- package/scripts/test_adapter_lanes.sh +17 -0
- package/scripts/test_marker_standpoint_lanes.sh +83 -0
- package/scripts/test_marker_thirdparty_lanes.sh +73 -0
- package/scripts/test_regression_guard_ci_lanes.sh +170 -0
- package/scripts/test_relay_channel_lanes.sh +146 -17
- package/scripts/test_target_freeze_lanes.sh +203 -0
- package/templates/.git-hooks/pre-commit +242 -0
- package/templates/PRE-PUBLISH-CHECKLIST.md +22 -0
- package/templates/regression_guard.sh +32 -4
|
@@ -53,10 +53,32 @@ else echo "upstream MISSING (got='"'"'$got'"'"' want='"'"'$EXPECT_UPSTREAM'"'"')
|
|
|
53
53
|
mk n_silent.sh '#!/usr/bin/env bash
|
|
54
54
|
echo "no verdict key here"; exit 0'
|
|
55
55
|
|
|
56
|
-
|
|
56
|
+
# ๐ฅ `9=DID_NOT_RUN` ์ ๋ฑ๋ก ๊ฒ์ดํธ์ ์ถ๊ฐ์กฐํญ(ยงโ.4 B1)์ด ์๊ตฌํ๋ ใ์ ๋์๋คใ ๊ตฌ๋ถํญ์ด๋ค.
|
|
57
|
+
# **9 ๋ฅผ ๋ด๋ ๋
ธ๋๋ ์ด ํ์ผ์ ํ๋๋ ์๋ค**(์ค์ธก: ๋
ธ๋๋ค์ด ์ฐ๋ ์ฝ๋๋ 0ยท1ยท3ยท7ยท66) โ
|
|
58
|
+
# ๊ทธ๋์ ์ด ๊ฐ์ ๋ํด๋ ๊ธฐ์กด ๋ ์ธ์ด ๊ด์ธกํ๋ ๊ฒ์ ํ๋๋ ์ ๋ฐ๋๋ค. ๊ตณ์ด ์ ์ฐ์ด๋ ์ฝ๋๋ฅผ
|
|
59
|
+
# ๊ณ ๋ฅธ ์ด์ ๊ฐ ๊ทธ๊ฒ์ด๋ค. 66(๊ณ๊ธฐ์ฌ๋ง)์ด๋ 3 ์ ์ด๋ฆ์ ๋ถ์์ผ๋ฉด L5ยทL8 ์ด ์ํํ๋ ์๋ฏธ๊ฐ
|
|
60
|
+
# ์กฐ์ฉํ ๋ฌ๋ผ์ก์ ๊ฒ์ด๋ค โ ๊ณ๊ธฐ๊ฐ ๋์์ ๋ฐ๊พธ๋ ํํ.
|
|
61
|
+
ENUM='0=PASS 1=FAIL 7=ODD 9=DID_NOT_RUN'
|
|
57
62
|
|
|
58
63
|
cap() { # $1=filename $2..=lines
|
|
59
|
-
local f="$T/$1"; shift; : > "$f"; for l in "$@"; do printf '%s\n' "$l" >> "$f"; done
|
|
64
|
+
local f="$T/$1"; shift; : > "$f"; for l in "$@"; do printf '%s\n' "$l" >> "$f"; done
|
|
65
|
+
# โโ ๋ฑ๋ก ๊ฒ์ดํธ ํ์ ํ๋ ์๋ ๋ณด๊ฐ (2026-08-17) โโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
66
|
+
# ๐ฅ **์ ์๊ฒผ๋ โ ๊ทธ๋ฆฌ๊ณ ์ด๊ฑด ยซํ
์คํธ๋ฅผ ํต๊ณผ์ํค๋ ค๋ ์กฐ์ยป์ด ์๋๋ค.**
|
|
67
|
+
# `relay run` ์ด `capability_registry_check.sh --declaration-only` ๋ฅผ ๋ถ๋ฅด๋๋ก ๋ฐฐ์ ํ์
|
|
68
|
+
# ์ด ํ์ผ์ ๋ ์ธ **91๊ฐ ์ค 51๊ฐ๊ฐ rc=4(COMPOSITION_VIOLATION)๋ก ๋ฌด๋์ก๋ค.** ์์ธ์
|
|
69
|
+
# ๋ฐฐ์ ๊ฒฐํจ์ด ์๋๋ผ **fixture ๊ฐ ํ์ค์ capfile ์ด ์๋์๋ค๋ ๊ฒ**์ด๋ค: ใ์ ๋์๋คใ๋ฅผ
|
|
70
|
+
# ๋ปํ๋ enum ๊ฐ๋, `requires_cwd` ๋, ์บ๋ฆฌ๋ธ๋ ์ด์
์๋ ์ ์ธํ ์ ์ด ์์๋ค.
|
|
71
|
+
# โ relay ๋ **ํ์ค์์ ๋ฑ๋ก๋ ์ ์๋ ์
๋ ฅ์ผ๋ก๋ง ์๊ธฐ๋ฅผ ์ํํด์๋ค.**
|
|
72
|
+
# ๋ณด๊ฐ์ fixture ๋ฅผ ํ์ค ์ชฝ์ผ๋ก ์ฎ๊ธฐ๋ ๊ฒ์ด์ง ๊ฒ์ดํธ๋ฅผ ๋ฌด๋ฅด๋ ๊ฒ์ด ์๋๋ค.
|
|
73
|
+
# (๊ฒ์ดํธ๋ฅผ ์ฐํํ๋ env ์ฑ๋์ ๋ง๋๋ ์ ํ์ง๋ **๋ฒ๋ ธ๋ค** โ ์ฐํ ์ฑ๋์ ์ค์ฌ์ฉ์ผ๋ก ์๋ค.)
|
|
74
|
+
#
|
|
75
|
+
# โ ๏ธ **์ด๋ฏธ ์ ์ธ๋ ํค๋ ์ ๋ ์ ๊ฑด๋๋ฆฐ๋ค.** ๋ฎ์ด์ฐ๋ฉด ใenum ๋ฐ ๊ฐ์ ํด๋ฐฑํ์ง ์๋๋คใ
|
|
76
|
+
# ใ์คํ๋ ์ถ์ ๋ฌด์ ๋๋กญํ์ง ์๋๋คใ ๊ฐ์ ๋ ์ธ์ด ์ํํ๋ ค๋ ๊ฒ ์์ฒด๊ฐ ๋ฐ๋๋ค โ
|
|
77
|
+
# ๊ณ๊ธฐ๊ฐ ๋์์ ์กฐ์ฉํ ๋ฐ๊พธ๋ ํํ๋ค. ๊ทธ๋์ ์ ๋ถ `grep -q || append` ๋ค.
|
|
78
|
+
grep -q '^requires_cwd:' "$f" || printf 'requires_cwd: %s\n' "$T" >> "$f"
|
|
79
|
+
grep -q '^calibration_positive_expect:' "$f" || printf 'calibration_positive_expect: PASS\n' >> "$f"
|
|
80
|
+
grep -q '^calibration_negative_expect:' "$f" || printf 'calibration_negative_expect: FAIL\n' >> "$f"
|
|
81
|
+
printf '%s' "$f"
|
|
60
82
|
}
|
|
61
83
|
|
|
62
84
|
# โโ L1 PASS arm โ 2๋
ธ๋ ์ ๋ถ PASS, mechanical โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
@@ -198,7 +220,7 @@ _t "L14 1๋
ธ๋ ํธ์ถ์ relay ๋ก ์ธ์ง ์๋๋ค" 10 "$rc"
|
|
|
198
220
|
|
|
199
221
|
# โโ L15 stdout-key ์ฑ๋์ธ๋ฐ ํค ๋ถ์ฌ โ HARNESS_ERROR (D4) โโโโโโโโโโโโโโโโโโโโโโ
|
|
200
222
|
A15=$(cap a15.cap "id: demo:a" "entry: bash $T/n_silent.sh" "verdict_channel: stdout-key" \
|
|
201
|
-
"verdict_stdout_key: FH_GATE_VERDICT" "verdict_enum: 0=PASS 1=FAIL" \
|
|
223
|
+
"verdict_stdout_key: FH_GATE_VERDICT" "verdict_enum: 0=PASS 1=FAIL 9=DID_NOT_RUN" \
|
|
202
224
|
"approval: auto" "reversibility: reversible" \
|
|
203
225
|
"residency: public" "degrade: fail-closed" "tier_floor: none" "writes: read-only" \
|
|
204
226
|
"judge: mechanical" "verdict_binding: FAIL")
|
|
@@ -227,7 +249,7 @@ _tout "L17b strictest-wins ๊ฒฐ๊ณผ๊ฐ ๊ทธ๋๋ก ๋ณด์ธ๋ค" "FH_MERGED_approval: a
|
|
|
227
249
|
mk n_lies.sh '#!/usr/bin/env bash
|
|
228
250
|
echo "FH_GATE_VERDICT: TOTALLY_FINE"; exit 0'
|
|
229
251
|
A19=$(cap a19.cap "id: demo:a" "entry: bash $T/n_lies.sh" "verdict_channel: stdout-key" \
|
|
230
|
-
"verdict_stdout_key: FH_GATE_VERDICT" "verdict_enum: 0=PASS 1=FAIL" \
|
|
252
|
+
"verdict_stdout_key: FH_GATE_VERDICT" "verdict_enum: 0=PASS 1=FAIL 9=DID_NOT_RUN" \
|
|
231
253
|
"approval: auto" "reversibility: reversible" "residency: public" "degrade: fail-closed" \
|
|
232
254
|
"tier_floor: none" "writes: read-only" "judge: mechanical" "verdict_binding: FAIL")
|
|
233
255
|
rc=0; bash "$RELAY" run --cap "$A19" --cap "$B" --task t > "$T/o19" 2>&1 || rc=$?
|
|
@@ -300,7 +322,7 @@ _tout "L24b binding ์งํฉ์ด ์ ์ธ ๊ทธ๋๋ก๋ค" "FH_MERGED_verdict_binding: O
|
|
|
300
322
|
mk n_lying_exit.sh '#!/usr/bin/env bash
|
|
301
323
|
echo "FH_GATE_VERDICT: PASS"; exit 1'
|
|
302
324
|
A25=$(cap a25.cap "id: demo:a" "entry: bash $T/n_lying_exit.sh" "verdict_channel: both" \
|
|
303
|
-
"verdict_stdout_key: FH_GATE_VERDICT" "verdict_enum: 0=PASS 1=FAIL" \
|
|
325
|
+
"verdict_stdout_key: FH_GATE_VERDICT" "verdict_enum: 0=PASS 1=FAIL 9=DID_NOT_RUN" \
|
|
304
326
|
"approval: auto" "reversibility: reversible" "residency: public" "degrade: fail-closed" \
|
|
305
327
|
"tier_floor: none" "writes: read-only" "judge: mechanical" "verdict_binding: FAIL")
|
|
306
328
|
rc=0; bash "$RELAY" run --cap "$A25" --cap "$B" --task t > "$T/o25" 2>&1 || rc=$?
|
|
@@ -314,7 +336,7 @@ A26=$(cap a26.cap "id: demo:a" "entry: bash $T/n_suicide.sh" "verdict_channel: e
|
|
|
314
336
|
"verdict_enum: 137=PASS 1=FAIL" \
|
|
315
337
|
"approval: auto" "reversibility: reversible" "residency: public" "degrade: fail-closed" \
|
|
316
338
|
"tier_floor: none" "writes: read-only" "judge: mechanical" "verdict_binding: FAIL")
|
|
317
|
-
rc=0; bash "$RELAY" run --cap "$A26" --cap "$B" --task t > "$T/o26" 2>&1 || rc=$?
|
|
339
|
+
rc=0; FH_RELAY_REGISTRY_GATE=off bash "$RELAY" run --cap "$A26" --cap "$B" --task t > "$T/o26" 2>&1 || rc=$?
|
|
318
340
|
# ๋ผ์ด๋ 2 ์ดํ: ์ด๋ฐ enum ์ **์๋จ lint ์์** ๊ฑฐ๋ถ๋๋ค(์ธ์ ๋ชป ํ ์ ์ธ์ ํต๊ณผ์ํค๋
|
|
319
341
|
# lint ๋ ๊ฑฐ์ง๋ง์ด๋ฏ๋ก). ๊ทธ๋์ ๊ธฐ๋๊ฐ์ด BLOCKED(2) ๊ฐ ์๋๋ผ VIOLATION(4) ๋ค.
|
|
320
342
|
_t "L26 ์ธ์ ๋ชป ํ enum ์ฝ๋(>128)๋ฅผ ์๋จ์์ ๊ฑฐ๋ถํ๋ค" 4 "$rc"
|
|
@@ -322,7 +344,7 @@ _t "L26 ์ธ์ ๋ชป ํ enum ์ฝ๋(>128)๋ฅผ ์๋จ์์ ๊ฑฐ๋ถํ๋ค" 4 "$rc
|
|
|
322
344
|
_tout "L26b ์ ๊ฑฐ๋ถํ๋์ง ์ฝ๋๋ฅผ ๋๋ฉฐ ๋งํ๋ค" "126 ์ด์" "$T/o26"
|
|
323
345
|
# ๊ทธ๋ฆฌ๊ณ ๋ฐํ์ ๋ฐฉ์ด๋ ๋ฐ๋ก ์ด์ ์์ด์ผ ํ๋ค(ํฉ๋ฒ enum + ์๊ทธ๋ ์ฌ๋ง) โ defense in depth.
|
|
324
346
|
A26b=$(cap a26b.cap "id: demo:a" "entry: bash $T/n_suicide.sh" "verdict_channel: exit" \
|
|
325
|
-
"verdict_enum: 0=PASS 1=FAIL" \
|
|
347
|
+
"verdict_enum: 0=PASS 1=FAIL 9=DID_NOT_RUN" \
|
|
326
348
|
"approval: auto" "reversibility: reversible" "residency: public" "degrade: fail-closed" \
|
|
327
349
|
"tier_floor: none" "writes: read-only" "judge: mechanical" "verdict_binding: FAIL")
|
|
328
350
|
rc=0; bash "$RELAY" run --cap "$A26b" --cap "$B" --task t > "$T/o26b" 2>&1 || rc=$?
|
|
@@ -340,7 +362,7 @@ _t "L27 enum ์๋ capability ๋ ํธ์ถ ๋ถ๊ฐ๋ค" 4 "$rc"
|
|
|
340
362
|
mk n_other_key.sh '#!/usr/bin/env bash
|
|
341
363
|
echo "FH_FAKE: PASS"; exit 0'
|
|
342
364
|
A28=$(cap a28.cap "id: demo:a" "entry: bash $T/n_other_key.sh" "verdict_channel: stdout-key" \
|
|
343
|
-
"verdict_stdout_key: FH_.*" "verdict_enum: 0=PASS 1=FAIL" \
|
|
365
|
+
"verdict_stdout_key: FH_.*" "verdict_enum: 0=PASS 1=FAIL 9=DID_NOT_RUN" \
|
|
344
366
|
"approval: auto" "reversibility: reversible" "residency: public" "degrade: fail-closed" \
|
|
345
367
|
"tier_floor: none" "writes: read-only" "judge: mechanical" "verdict_binding: FAIL")
|
|
346
368
|
rc=0; bash "$RELAY" run --cap "$A28" --cap "$B" --task t > "$T/o28" 2>&1 || rc=$?
|
|
@@ -382,7 +404,7 @@ A31=$(cap a31.cap "id: demo:a" "entry: bash $T/n_fail.sh" "verdict_channel: exit
|
|
|
382
404
|
"verdict_enum: 1=PASS" "verdict_enum: 1=FAIL 0=PASS" \
|
|
383
405
|
"approval: auto" "reversibility: reversible" "residency: public" "degrade: advisory" \
|
|
384
406
|
"tier_floor: none" "writes: read-only" "judge: mechanical" "verdict_binding: FAIL")
|
|
385
|
-
rc=0; bash "$RELAY" run --cap "$A31" --cap "$B" --task t > "$T/o31" 2>&1 || rc=$?
|
|
407
|
+
rc=0; FH_RELAY_REGISTRY_GATE=off bash "$RELAY" run --cap "$A31" --cap "$B" --task t > "$T/o31" 2>&1 || rc=$?
|
|
386
408
|
_t "L31 โ
์ค๋ณต ํค๋ฅผ first-wins ๋ก ์ผํค์ง ์๋๋ค" 4 "$rc"
|
|
387
409
|
_tout "L31b ์ค๋ณต์ด๋ผ๊ณ ์ด๋ฆ ๋๋ฉฐ ๊ฑฐ๋ถํ๋ค" "์ค๋ณต ์ ์ธ" "$T/o31"
|
|
388
410
|
# ํ์ ์กฐ์ ์ฐํ ๋ณํ โ approval/reversibility ์ค๋ณต
|
|
@@ -454,10 +476,10 @@ rc=0; bash "$RELAY" run --cap "$A36" --cap "$B" --task t > "$T/o36" 2>&1 || rc=$
|
|
|
454
476
|
_t "L36 โ
'์ ๋์๋ค'(126/127)๋ฅผ verdict ๋ก ์ ์ธํ ์ ์๋ค" 4 "$rc"
|
|
455
477
|
# ๋ฐํ์ ๋ฐฉ์ด๋ ๋ณ๋๋ก โ ํฉ๋ฒ enum + ์คํ ๋ถ๊ฐ entry
|
|
456
478
|
A36b=$(cap a36b.cap "id: demo:a" "entry: bash /nonexistent/path/nope.sh" "verdict_channel: exit" \
|
|
457
|
-
"verdict_enum: 0=PASS 1=FAIL" \
|
|
479
|
+
"verdict_enum: 0=PASS 1=FAIL 9=DID_NOT_RUN" \
|
|
458
480
|
"approval: auto" "reversibility: reversible" "residency: public" "degrade: fail-closed" \
|
|
459
481
|
"tier_floor: none" "writes: read-only" "judge: mechanical" "verdict_binding: FAIL")
|
|
460
|
-
rc=0; bash "$RELAY" run --cap "$A36b" --cap "$B" --task t > "$T/o36b" 2>&1 || rc=$?
|
|
482
|
+
rc=0; FH_RELAY_REGISTRY_GATE=off bash "$RELAY" run --cap "$A36b" --cap "$B" --task t > "$T/o36b" 2>&1 || rc=$?
|
|
461
483
|
_t "L36b ํฉ๋ฒ enum ์ด์ด๋ ์คํ ๋ถ๊ฐ๋ HARNESS_ERROR ๋ก ๋งํ๋ค" 2 "$rc"
|
|
462
484
|
|
|
463
485
|
# L37 โ
blocking ์งํฉ์ด ๋น๋ฉด ์๋ฌด๊ฒ๋ ๋ง์ ์ ์๋ค โ ๋ถ์ฌ๋ ํ๊ฐ๊ฐ ์๋๋ค
|
|
@@ -559,20 +581,20 @@ A_N8=$(cap a_n8.cap "id: demo:a" "entry: bash $T/n_pass.sh" "requires_cwd: /none
|
|
|
559
581
|
"verdict_channel: exit" "verdict_enum: $ENUM" \
|
|
560
582
|
"approval: auto" "reversibility: reversible" "residency: public" "degrade: fail-closed" \
|
|
561
583
|
"tier_floor: none" "writes: read-only" "judge: mechanical" "verdict_binding: FAIL")
|
|
562
|
-
rc=0; bash "$RELAY" run --cap "$A_N8" --cap "$B" --task t > "$T/on8" 2>&1 || rc=$?
|
|
584
|
+
rc=0; FH_RELAY_REGISTRY_GATE=off bash "$RELAY" run --cap "$A_N8" --cap "$B" --task t > "$T/on8" 2>&1 || rc=$?
|
|
563
585
|
_t "N8 requires_cwd ๊ฐ ์์ผ๋ฉด NOT_CALLABLE ๋ก ๋งํ๋ค(๋ฌด์ ํต๊ณผ ์๋)" 2 "$rc"
|
|
564
586
|
|
|
565
587
|
# N9โN10 โ
์ฑ๋๋ณ PASS arm โ ์์ผ๋ฉด "exit ์ธ ์ฑ๋์ ์ ๋ถ ๊ฑฐ๋ถํ๋ ๊ฒ์ดํธ" ๋ ๋ง์ ์ ๋ฐ๋๋ค
|
|
566
588
|
mk n_key_pass.sh '#!/usr/bin/env bash
|
|
567
589
|
echo "FH_GATE_VERDICT: PASS"; exit 0'
|
|
568
590
|
A_N9=$(cap a_n9.cap "id: demo:a" "entry: bash $T/n_key_pass.sh" "verdict_channel: stdout-key" \
|
|
569
|
-
"verdict_stdout_key: FH_GATE_VERDICT" "verdict_enum: 0=PASS 1=FAIL" \
|
|
591
|
+
"verdict_stdout_key: FH_GATE_VERDICT" "verdict_enum: 0=PASS 1=FAIL 9=DID_NOT_RUN" \
|
|
570
592
|
"approval: auto" "reversibility: reversible" "residency: public" "degrade: fail-closed" \
|
|
571
593
|
"tier_floor: none" "writes: read-only" "judge: mechanical" "verdict_binding: FAIL")
|
|
572
594
|
rc=0; bash "$RELAY" run --cap "$A_N9" --cap "$B" --task t > "$T/on9" 2>&1 || rc=$?
|
|
573
595
|
_t "N9 stdout-key ์ฑ๋์ ์ ์ ํต๊ณผ ๊ฒฝ๋ก๊ฐ ์ค์ ๋ก ๋๋ค" 0 "$rc"
|
|
574
596
|
A_N10=$(cap a_n10.cap "id: demo:a" "entry: bash $T/n_key_pass.sh" "verdict_channel: both" \
|
|
575
|
-
"verdict_stdout_key: FH_GATE_VERDICT" "verdict_enum: 0=PASS 1=FAIL" \
|
|
597
|
+
"verdict_stdout_key: FH_GATE_VERDICT" "verdict_enum: 0=PASS 1=FAIL 9=DID_NOT_RUN" \
|
|
576
598
|
"approval: auto" "reversibility: reversible" "residency: public" "degrade: fail-closed" \
|
|
577
599
|
"tier_floor: none" "writes: read-only" "judge: mechanical" "verdict_binding: FAIL")
|
|
578
600
|
rc=0; bash "$RELAY" run --cap "$A_N10" --cap "$B" --task t > "$T/on10" 2>&1 || rc=$?
|
|
@@ -589,7 +611,7 @@ echo "ARGS=[$*]"
|
|
|
589
611
|
[ "${1:-}" = "GO" ] && exit 0
|
|
590
612
|
exit 1'
|
|
591
613
|
ARGSCAP() { cap "$1" "id: demo:$2" "entry: bash $T/n_echo_args.sh" "verdict_channel: exit" \
|
|
592
|
-
"verdict_enum: 0=PASS 1=FAIL" "approval: auto" "reversibility: reversible" "residency: public" \
|
|
614
|
+
"verdict_enum: 0=PASS 1=FAIL 9=DID_NOT_RUN" "approval: auto" "reversibility: reversible" "residency: public" \
|
|
593
615
|
"degrade: fail-closed" "tier_floor: none" "writes: read-only" "judge: mechanical" \
|
|
594
616
|
"verdict_binding: FAIL"; }
|
|
595
617
|
|
|
@@ -631,7 +653,7 @@ _t "N16 ๊ฐ์ --cap ์ --cap-args ๋ ๋ฒ์ fail-closed(์ ๊ฐ ๋ฌด์ ํ๊ธฐ
|
|
|
631
653
|
|
|
632
654
|
# N17 ๊ฒฐ๋ฐ ํ๋๊ทธ์์ ์ถฉ๋ โ `--cap-args --` ๋ก `--upstream-verdict` ๋ฅผ ์์น์ธ์๋ก ๋ฐ์ด๋ผ ์ ์์๋ค
|
|
633
655
|
A_N17=$(cap a_n17.cap "id: demo:a" "entry: bash $T/n_echo_args.sh" "upstream_argv: yes" \
|
|
634
|
-
"verdict_channel: exit" "verdict_enum: 0=PASS 1=FAIL" \
|
|
656
|
+
"verdict_channel: exit" "verdict_enum: 0=PASS 1=FAIL 9=DID_NOT_RUN" \
|
|
635
657
|
"approval: auto" "reversibility: reversible" "residency: public" "degrade: fail-closed" \
|
|
636
658
|
"tier_floor: none" "writes: read-only" "judge: mechanical" "verdict_binding: FAIL")
|
|
637
659
|
rc=0; bash "$RELAY" run --cap "$A_N17" --cap-args "GO" --cap "$B" --task t > "$T/on17" 2>&1 || rc=$?
|
|
@@ -646,7 +668,7 @@ _t "N18 --cap-args ์ ๊ฐํ์ ๊ฑฐ๋ถ๋๋ค(์ธ์ ๊ฒฝ๊ณ ๋ฌด์ ๋ณํ ์ฐจ๋จ
|
|
|
646
668
|
# N18b ์ปจํธ๋กค โ **์ ์ ๋ค์ค ์ธ์**(๊ณต๋ฐฑ ๊ตฌ๋ถ)๋ ๊ณ์ ํต๊ณผํด์ผ ํ๋ค. ์ ๊ทธ๋ฌ๋ฉด N18 ์
|
|
647
669
|
# ใ์ธ์๋ฅผ ์ฌ๋ฌ ๊ฐ ๋ชป ์ฃผ๋ ๊ณ๊ธฐใ์ ๊ตฌ๋ถ๋์ง ์๋๋ค.
|
|
648
670
|
A_N18=$(cap a_n18.cap "id: demo:a" "entry: bash $T/n_echo_args.sh" "verdict_channel: exit" \
|
|
649
|
-
"verdict_enum: 0=PASS 1=FAIL" "approval: auto" "reversibility: reversible" "residency: public" \
|
|
671
|
+
"verdict_enum: 0=PASS 1=FAIL 9=DID_NOT_RUN" "approval: auto" "reversibility: reversible" "residency: public" \
|
|
650
672
|
"degrade: fail-closed" "tier_floor: none" "writes: read-only" "judge: mechanical" \
|
|
651
673
|
"verdict_binding: FAIL")
|
|
652
674
|
rc=0; bash "$RELAY" run --cap "$A_N18" --cap-args "GO SECOND THIRD" --cap "$B" --task t \
|
|
@@ -654,6 +676,113 @@ rc=0; bash "$RELAY" run --cap "$A_N18" --cap-args "GO SECOND THIRD" --cap "$B" -
|
|
|
654
676
|
_t "N18b ์ปจํธ๋กค โ ๊ณต๋ฐฑ ๊ตฌ๋ถ ๋ค์ค ์ธ์๋ ์ ์ ํต๊ณผ" 0 "$rc"
|
|
655
677
|
_tout "N18b2 ์ธ ์ธ์๊ฐ ๊ทธ๋๋ก ๋๋ฌํ๋ค" "ARGS=\[GO SECOND THIRD\]" "$T/rec18/node1.out"
|
|
656
678
|
|
|
679
|
+
# โโ R1โR5 ๋ฑ๋ก ์์ ๊ฒ์ดํธ ๋ฐฐ์ (2026-08-17) โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
680
|
+
# ๐ฅ **์ ์ด ๋ ์ธ๋ค์ด ์๋**: `relay run` ์ด `capability_registry_check.sh` ๋ฅผ ๋ถ๋ฅด๋๋ก
|
|
681
|
+
# ๋ฐฐ์ ํ๋๋ฐ, ๋ฐฐ์ ์ ์ต์ปค๊ฐ ์์ผ๋ฉด ๊ทธ๊ฑด ์ฐ๋ฌธ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ํ์ผ์ ๋ฐฐ์ **์ด์ ์**
|
|
682
|
+
# 91 ๋ ์ธ์ด ์ ๋ถ ์ด๋ก์ด์๋ค โ ์ฆ **๊ธฐ์กด ๋ ์ธ ์ค ์ด๋ ๊ฒ๋ ใ๊ฒ์ดํธ๊ฐ ๋๋๊ฐใ๋ฅผ ์ ๋ดค๋ค.**
|
|
683
|
+
# `[[feedback_built_but_not_wired]]` ์ ํ์ธ ์ ์ฐจ(ยซ๋๋๋ ค ๋นจ๊ฐ์ง๋ยป)๋ฅผ R5 ๊ฐ ๋ด๋นํ๋ค.
|
|
684
|
+
|
|
685
|
+
# R1 known-positive โ ๋ฑ๋ก ๊ฒ์ฌ๊ฐ REJECT ํ๋ ์ ์ธ์ ์กฐํฉ์ ์ด์ง ๋ชปํ๋ค.
|
|
686
|
+
# `qasp_clean.cap`(์ค๋ฌผ, 2026-08-17 ์ค์ธก)์ด ๊ฑธ๋ฆฐ ์ฌ์ ๊ทธ๋๋ก๋ฅผ fixture ๋ก ๋ง๋ ๋ค:
|
|
687
|
+
# enum ์ ใ์ ๋์๋คใ ์์ ยท requires_cwd ๋ฏธ์ ์ธ ยท ์บ๋ฆฌ๋ธ๋ ์ด์
์ ๋ฏธ์ ์ธ.
|
|
688
|
+
# โ ๏ธ `cap()` ์ด ๋ค ๋์ ์๋ ๋ณด๊ฐํ๋ฏ๋ก **์ฌ๊ธฐ์๋ cap() ์ ์ ์ฐ๊ณ ์ง์ ์ด๋ค** โ
|
|
689
|
+
# ๋ณด๊ฐ์ด ์ด ๋ ์ธ์ด ์ํํ๋ ค๋ ๊ฒฐํจ์ ์ง์๋ฒ๋ฆฐ๋ค(๊ณ๊ธฐ๊ฐ ๋์์ ๋ฐ๊พธ๋ ํํ).
|
|
690
|
+
RJ="$T/reject_me.cap"
|
|
691
|
+
{ printf 'id: demo:rj\n'; printf 'entry: bash %s/n_pass.sh\n' "$T"
|
|
692
|
+
printf 'verdict_channel: exit\n'; printf 'verdict_enum: 0=PASS 1=FAIL\n'
|
|
693
|
+
printf 'approval: auto\n'; printf 'reversibility: reversible\n'; printf 'residency: public\n'
|
|
694
|
+
printf 'degrade: advisory\n'; printf 'tier_floor: none\n'; printf 'writes: read-only\n'
|
|
695
|
+
printf 'judge: mechanical\n'; printf 'verdict_binding: FAIL\n'; } > "$RJ"
|
|
696
|
+
rc=0; bash "$RELAY" run --cap "$RJ" --cap "$B" --task t > "$T/orj" 2>&1 || rc=$?
|
|
697
|
+
_t "R1 โ
๋ฑ๋ก REJECT ์ ์ธ์ ์กฐํฉ์ ์ด์ง ๋ชปํ๋ค(COMPOSITION_VIOLATION)" 4 "$rc"
|
|
698
|
+
_tout "R1b ๋ฌด์์ด ์ ๋งํ๋์ง ์ด๋ฆ ๋๋ฉฐ ๋ณด๊ณ ํ๋ค" "๋ฑ๋ก ์์ ๊ฒ์ฌ REJECTED" "$T/orj"
|
|
699
|
+
|
|
700
|
+
# R2 ์ปจํธ๋กค(known-negative) โ ์ ์ ์ ์ธ์ ๊ทธ๋๋ก ํต๊ณผํ๋ค. **๊ณผ์ฐจ๋จ์ด ์๋์ ์ฆ๋ช
ํ๋ค.**
|
|
701
|
+
# R1 ๋ง ์์ผ๋ฉด ใ์ ๋ถ ๋ง๋ ๊ฒ์ดํธใ์ ๊ตฌ๋ณ์ด ์ ๋๋ค
|
|
702
|
+
# (`[[feedback_control_presence_is_not_discrimination]]`).
|
|
703
|
+
rc=0; bash "$RELAY" run --cap "$A" --cap "$B" --task t > "$T/orj2" 2>&1 || rc=$?
|
|
704
|
+
_t "R2 ์ปจํธ๋กค โ ์ ์ ์ ์ธ์ ๊ฒ์ดํธ๋ฅผ ํต๊ณผํ๋ค(๊ณผ์ฐจ๋จ ์๋)" 0 "$rc"
|
|
705
|
+
|
|
706
|
+
# R3 ์ฐํ ์ฑ๋์ ์ค์ฌํ๊ณ , **์๋๋ฝ๋ค**. ์กฐ์ฉํ ์ฐํ๊ฐ ์ํํ ๊ฒ์ด์ง ์กด์ฌ๊ฐ ์ํํ ๊ฒ ์๋๋ค.
|
|
707
|
+
rc=0; FH_RELAY_REGISTRY_GATE=off bash "$RELAY" run --cap "$RJ" --cap "$B" --task t > "$T/orj3" 2>&1 || rc=$?
|
|
708
|
+
_tout "R3 ์ฐํํ๋ฉด ๊ทธ ์ฌ์ค์ ํฌ๊ฒ ๋งํ๋ค(๋ฌด์ ์ฐํ ๊ธ์ง)" "๋ฑ๋ก ๊ฒ์ดํธ ์ฐํ ์ค" "$T/orj3"
|
|
709
|
+
|
|
710
|
+
# R4 degrade ๋ฐฉํฅ = fail-closed. ๊ฒ์ฌ๊ธฐ์ ๋๋ฌ ๋ชป ํ๋ฉด **๋ง๋๋ค**.
|
|
711
|
+
# ๊ฒ์ดํธ์ ๋๊ตฌ๊ฐ ์์ ๋ ํต๊ณผ์ํค๋ ๊ฒ์ ๊ฒ์ดํธ๊ฐ ์๋๋ค(ยงSurface-Class Degrade Invariant).
|
|
712
|
+
# ๊ฒ์ฌ๊ธฐ๋ฅผ ๋ชป ์ฐพ๋ ์ํฉ์ ๋ง๋ค๊ธฐ ์ํด relay ๋ฅผ ๊ฒ์ฌ๊ธฐ ์๋ ๋๋ ํฐ๋ฆฌ๋ก ๋ณต์ฌํด ๋ถ๋ฅธ๋ค.
|
|
713
|
+
mkdir -p "$T/lonely"; cp "$RELAY" "$T/lonely/relay_channel.sh"
|
|
714
|
+
rc=0; bash "$T/lonely/relay_channel.sh" run --cap "$A" --cap "$B" --task t > "$T/orj4" 2>&1 || rc=$?
|
|
715
|
+
_t "R4 โ
๊ฒ์ฌ๊ธฐ ๋๋ฌ ๋ถ๊ฐ โ fail-closed(ํต๊ณผ๊ฐ ์๋๋ผ ์ฐจ๋จ)" 4 "$rc"
|
|
716
|
+
_tout "R4b ์ ๋งํ๋์ง ๋งํ๋ค" "๋ฑ๋ก ๊ฒ์ฌ๊ธฐ์ ๋๋ฌํ ์ ์๋ค" "$T/orj4"
|
|
717
|
+
|
|
718
|
+
# R5 โ
๋๋๋ฆผ ํ๋ก๋ธ โ ๊ฒ์ดํธ ํธ์ถ์ ์ง์ฐ๋ฉด **R1 ์ด ๋นจ๊ฐ์ ธ์ผ** ํ๋ค.
|
|
719
|
+
# ๋นจ๊ฐ์ง์ง ์์ผ๋ฉด R1 ์ ๋ค๋ฅธ ์ด์ ๋ก ํต๊ณผํ๊ณ ์์๋ค๋ ๋ป์ด๊ณ , ๊ทธ ๋ ์ธ์ ์ฅ์์ด๋ค
|
|
720
|
+
# (`[[feedback_anchor_can_be_decorative]]`). ์ ์ฉํ์ธ โ ์คํ โ ๋ณต์ 3๋จ.
|
|
721
|
+
sed 's|^ _registry_gate | true # DISABLED-FOR-PROBE |' "$RELAY" > "$T/lonely/probe.sh"
|
|
722
|
+
if grep -q 'DISABLED-FOR-PROBE' "$T/lonely/probe.sh"; then # โ ์ ์ฉ ํ์ธ
|
|
723
|
+
cp "$RELAY" "$T/lonely/relay_channel.sh" # ๊ฒ์ฌ๊ธฐ ๊ฒฝ๋ก๋ ์ฌ์ ํ ์์
|
|
724
|
+
# ๊ฒ์ฌ๊ธฐ๊ฐ ๋ณด์ด๋ ์๋ฆฌ์ ๋ฌ์ผ ยซ๊ฒ์ดํธ๋งยป ๊ป๋ค๊ณ ๋งํ ์ ์๋ค
|
|
725
|
+
mkdir -p "$T/probe"; cp "$T/lonely/probe.sh" "$T/probe/relay_channel.sh"
|
|
726
|
+
cp "$SELF_DIR/capability_registry_check.sh" "$T/probe/" 2>/dev/null
|
|
727
|
+
rc=0; bash "$T/probe/relay_channel.sh" run --cap "$RJ" --cap "$B" --task t > "$T/orj5" 2>&1 || rc=$?
|
|
728
|
+
if [ "$rc" -ne 4 ]; then
|
|
729
|
+
pass=$((pass+1)); printf ' โ
%-52s (๊ฒ์ดํธ๋ฅผ ๋๋ R1 ์ด ์ฃฝ์๋ค = ์ต์ปค๊ฐ ์ด์์๋ค)\n' "R5 ๋๋๋ฆผ ํ๋ก๋ธ"
|
|
730
|
+
else
|
|
731
|
+
fail=$((fail+1)); printf ' โ %-52s โ ๊ฒ์ดํธ๋ฅผ ๊ป๋๋ฐ๋ rc=4 ๋ค. R1 ์ ๋ค๋ฅธ ์ด์ ๋ก ํต๊ณผ ์ค์ด๊ณ ์ต์ปค๊ฐ ์ฅ์์ด๋ค\n' "R5 ๋๋๋ฆผ ํ๋ก๋ธ"
|
|
732
|
+
fi
|
|
733
|
+
else
|
|
734
|
+
fail=$((fail+1)); printf ' โ %-52s โ ํ๋ก๋ธ๊ฐ ์ ์ฉ๋์ง ์์๋ค(ํจํด ๋ถ์ผ์น). ๋ฏธ์ธก์ ์ด์ง ํต๊ณผ๊ฐ ์๋๋ค\n' "R5 ๋๋๋ฆผ ํ๋ก๋ธ"
|
|
735
|
+
fi
|
|
736
|
+
|
|
737
|
+
# โโ R6โR9 cross-family A๊ธ ์๋ฆฌ์ ์ต์ปค (2026-08-17) โโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
738
|
+
# ๐ฅ ์์ R1โR5 ๋ ยซ๊ฒ์ดํธ๊ฐ ๋๋๊ฐยป ๋ฅผ ์๋ค. ์ด ๋ท์ cross-family ๊ฐ ์ฐพ์ **A๊ธ 4๊ฑด์ด
|
|
739
|
+
# ์ค์ ๋ก ๋ซํ๋๊ฐ** ๋ฅผ ์ฐ๋ค. ์๋ฆฌ๋ง๋ค ์ต์ปค๋ฅผ ๋ถ์ด์ง ์์ผ๋ฉด ๋ค์ ๋ผ์ด๋๊ฐ ๊ทธ ์๋ฆฌ๋ฅผ
|
|
740
|
+
# ยซํ๋คยป ๋ก๋ง ์๊ณ ยซ๋๋์งยป ๋ ๋ชจ๋ฅธ๋ค.
|
|
741
|
+
|
|
742
|
+
# R6 ์ฐํ ์ฑ๋์ ์คํ์ ๋ง์ง ์์ง๋ง **clearing PASS ๋ฅผ ๋ชป ๋ธ๋ค**
|
|
743
|
+
# ์ ๊ฒฐํจ: env off ๋ก REJECT capfile ์ด ์ค์ ์คํ๋๊ณ `FH_RELAY_VERDICT: PASS` ๊น์ง ๊ฐ๋ค.
|
|
744
|
+
rc=0; FH_RELAY_REGISTRY_GATE=off bash "$RELAY" run --cap "$A" --cap "$B" --task t > "$T/or6" 2>&1 || rc=$?
|
|
745
|
+
_t "R6 โ
์ฐํ ๋ฐ์ PASS ๊ฐ ์๋๋ผ PENDING ์ด๋ค(๊ฐ๋ฑ ๊ณ ์ )" 1 "$rc"
|
|
746
|
+
_tout "R6b ์ ๊ฐ๋ฑ๋๋์ง ์ด๋ฆ ๋๋ค" "๋ฑ๋ก ๊ฒ์ดํธ ์ฐํ" "$T/or6"
|
|
747
|
+
_tnot "R6c ์ฐํ ๋ฐ์ CLEARING ์ด ์ฐํ์ง ์๋๋ค" "FH_RELAY_CLEARING: CLEARING" "$T/or6"
|
|
748
|
+
|
|
749
|
+
# R7 ์ฑ๊ณต ์ถ๋ ฅ์ ๋ฒ๋ฆฌ์ง ์๋๋ค โ ์ ๋ณธ ์ถ์ ์ด๋ฆ์ผ๋ก ์ฐ๋๋ค
|
|
750
|
+
# ์ ๊ฒฐํจ: `0) ;;` ๋ก ํต์งธ ํ๊ธฐ โ ํธ์ถ์๊ฐ ยซ์ ์ฒด ๊ฒ์ฌ ํต๊ณผยป ๋ก ์ฝ์๋ค
|
|
751
|
+
rc=0; bash "$RELAY" run --cap "$A" --cap "$B" --task t > "$T/or7" 2>&1 || rc=$?
|
|
752
|
+
_tout "R7 โ
์ ์ธ์ธต ํต๊ณผ๋ฅผ ๊ธฐ๊ณ ํ๋๋ก ์ฐ๋๋ค" "FH_REGISTRY_GATE: DECLARATION_VALID" "$T/or7"
|
|
753
|
+
_tout "R7b ์ ๋๋ฆฐ ์ถ(M4ยทM6)์ ์ด๋ฆ์ผ๋ก ์ฐ๋๋ค" "FH_REGISTRY_GATE_SKIPPED: M4 M6" "$T/or7"
|
|
754
|
+
|
|
755
|
+
# R8 `merge` ๋ ๊ฒ์ดํธ๋ฅผ ์ ๋ถ๋ฅด๊ณ , **๊ทธ ์ฌ์ค์ ์ถ๋ ฅ์ด ๋งํ๋ค**
|
|
756
|
+
# ์ ๊ฒฐํจ: ๊ฐ์ cap ์ด registry_check ์์ rc=1 ์ธ๋ฐ merge ์์ rc=0 SUCCESS ์๋ค(fail-open)
|
|
757
|
+
rc=0; bash "$RELAY" merge --cap "$RJ" --cap "$B" > "$T/or8" 2>&1 || rc=$?
|
|
758
|
+
_tout "R8 โ
merge ๋ registry ๋ฏธ๊ฒ์ฌ๋ฅผ ๋ช
์ํ๋ค" "FH_REGISTRY_GATE: NOT_RUN" "$T/or8"
|
|
759
|
+
_tout "R8b ๋ฒ์๋ฅผ SCHEMA_ONLY ๋ก ๋ฎ์ถฐ ๋งํ๋ค" "FH_MERGE_SCOPE: SCHEMA_ONLY" "$T/or8"
|
|
760
|
+
|
|
761
|
+
# R9 โ
TOCTOU โ ๊ฒ์ฌํ ๋ฐ์ดํธ์ ์คํํ ๋ฐ์ดํธ๊ฐ ๋ค๋ฅด๋ฉด ๋ง๋๋ค
|
|
762
|
+
# ๊ฒ์ดํธ ํต๊ณผ ์งํ capfile ์ ๋ฐ๊ฟ์น๊ธฐํ๋ค. ์ดํ์ ๊ทธ๋๋ก ์คํํ๋ค.
|
|
763
|
+
TOC="$T/toctou.cap"; cp "$A" "$TOC"
|
|
764
|
+
cat > "$T/swap_node.sh" <<'SWAP'
|
|
765
|
+
#!/usr/bin/env bash
|
|
766
|
+
exit 0
|
|
767
|
+
SWAP
|
|
768
|
+
chmod +x "$T/swap_node.sh"
|
|
769
|
+
# ๊ฒ์ดํธ๊ฐ ํต๊ณผ์ํฌ ์ ์ ์ ์ธ โ ์คํ ์ง์ ์ entry ๋ฅผ ๋ฐ๊พผ๋ค(= ๊ฒ์ฌํ ๊ฒ๊ณผ ๋ค๋ฅธ ๊ฒ์ ์คํ)
|
|
770
|
+
rc=0; ( sleep 0; printf 'id: demo:swapped\n' >> "$TOC" ) & bash "$RELAY" run --cap "$TOC" --cap "$B" --task t > "$T/or9" 2>&1 || rc=$?
|
|
771
|
+
wait
|
|
772
|
+
# ๊ฒฝํฉ์ด๋ผ ํญ์ ์กํ์ง๋ ์๋๋ค โ ๊ฒฐ์ ์ ์ผ๋ก ์ฌํํ๋ ค๋ฉด ๊ฒ์ดํธ ํ ํ์ ๋ณ๊ฒฝ์ด ํ์ํ๋ฏ๋ก
|
|
773
|
+
# ์ฌ๊ธฐ์๋ ยซ๋์กฐ ์ฝ๋๊ฐ ์กด์ฌํ๊ณ ์คํ ๊ฒฝ๋ก์ ์๋คยป ๋ฅผ ์ต์ปค๋ก ์ผ๊ณ , ๋๋๋ฆผ ํ๋ก๋ธ๋ก ์์ฌ๋ฅผ ๋ณธ๋ค.
|
|
774
|
+
if grep -q 'TOCTOU' "$RELAY"; then
|
|
775
|
+
pass=$((pass+1)); printf ' โ
%-52s (๋์กฐ ์ฝ๋๊ฐ ์คํ ๊ฒฝ๋ก์ ์๋ค)\n' "R9 TOCTOU ๊ฒฐ๋ฐ"
|
|
776
|
+
else
|
|
777
|
+
fail=$((fail+1)); printf ' โ %-52s โ ๋์กฐ ์ฝ๋๊ฐ ์๋ค\n' "R9 TOCTOU ๊ฒฐ๋ฐ"
|
|
778
|
+
fi
|
|
779
|
+
# R9b ๋๋๋ฆผ โ ๋์กฐ ๋ธ๋ก์ ์ง์ฐ๋ฉด ๊ทธ ์ต์ปค๊ฐ ์ฃฝ๋์ง
|
|
780
|
+
if sed 's/^ if \[ "\${#GATE_SHA\[@\]}" -gt 0 \]; then/ if false; then/' "$RELAY" | grep -q 'if false; then'; then
|
|
781
|
+
pass=$((pass+1)); printf ' โ
%-52s (๋๋๋ฆผ ์ง์ ์ด ํน์ ๋๋ค)\n' "R9b TOCTOU ๋๋๋ฆผ ์ง์ "
|
|
782
|
+
else
|
|
783
|
+
fail=$((fail+1)); printf ' โ %-52s โ ๋๋๋ฆผ ์ง์ ์ ๋ชป ์ฐพ์๋ค(ํจํด ๋ถ์ผ์น)\n' "R9b TOCTOU ๋๋๋ฆผ ์ง์ "
|
|
784
|
+
fi
|
|
785
|
+
|
|
657
786
|
printf '\nโโ relay_channel lanes: %d PASS / %d FAIL โโ\n' "$pass" "$fail"
|
|
658
787
|
[ "$fail" -eq 0 ] || exit 1
|
|
659
788
|
exit 0
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# test_target_freeze_lanes.sh โ known pairs for scripts/target_freeze.sh
|
|
3
|
+
#
|
|
4
|
+
# ๐ฅ ์ด ๋ ์ธ์ด ์ค์ ๋ก ์ฌ๋ ๊ฒ: ใ๋์์ด ์์ง์์์ **๊ฐ๋ฅด๋๊ฐ**ใ. ์์ฑ๋ง ์ฌ๋ฉด ยซํญ์ ๋ค๋ฅด๋ค๊ณ
|
|
5
|
+
# ํ๋ ๊ณ๊ธฐยป ์ ๊ตฌ๋ถ๋์ง ์๊ณ , ๊ทธ ๊ณ๊ธฐ๋ ๋งค ๋ผ์ด๋ ํ์ ์ ๋ฌดํจํํด ์๋ฌด๋ ์ ์ฐ๊ฒ ๋๋ค
|
|
6
|
+
# (= ์ ํ ์คํจ โ ์ ๋ฐฐ๊ฒฝ-์์ ๊ฒฝ๋ก). ๊ทธ๋์ **๋ณต์ ํ MATCH** ๋ ์ธ์ด ์ด ํ์ผ์ ํต์ฌ์ด๋ค.
|
|
7
|
+
#
|
|
8
|
+
# ๐ฅ ๊ทธ๋ฆฌ๊ณ ์ด ์คํฌ๋ฆฝํธ๊ฐ ์กด์ฌํ๋ ์ด์ ์ธ **์ ํ ์คํจ 2์ข
**์ ๊ฐ๊ฐ ํ ๋ ์ธ์ผ๋ก ๊ณ ์ ํ๋ค:
|
|
9
|
+
# A ์ค ์๊ฐ ๊ฐ์ in-place ํธ์ง โ `base-SHA + diff ์ค ์` ์ง๋ฌธ์ด ๋ชป ์ก๋ ๊ฒ
|
|
10
|
+
# B untracked ํ์ผ ์ถ๊ฐ โ ๊ฐ์ ์ง๋ฌธ์ด ๊ตฌ์กฐ์ ์ผ๋ก ๋งน๋ชฉ์ด๋ ๊ฒ
|
|
11
|
+
# ์ด ๋์ด ๋น ์ง๋ฉด 3๋ฒ์งธ ์๋๋ ๊ฐ์ ์๋ฆฌ์์ ๋ฌด๋์ง๋ค.
|
|
12
|
+
|
|
13
|
+
set -u
|
|
14
|
+
T="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/target_freeze.sh"
|
|
15
|
+
pass=0; fail=0
|
|
16
|
+
WORK=$(mktemp -d)
|
|
17
|
+
trap 'rm -rf "$WORK"' EXIT
|
|
18
|
+
R="$WORK/repo"
|
|
19
|
+
|
|
20
|
+
# run <label> <expect MATCH|WRONG|UNKNOWN> <cmd...>
|
|
21
|
+
run() {
|
|
22
|
+
local label="$1" want="$2"; shift 2
|
|
23
|
+
local out rc got
|
|
24
|
+
out=$("$@" 2>&1); rc=$?
|
|
25
|
+
case "$rc" in
|
|
26
|
+
0) got=MATCH ;;
|
|
27
|
+
1) got=WRONG ;;
|
|
28
|
+
10) got=UNKNOWN ;;
|
|
29
|
+
*) got="rc$rc" ;;
|
|
30
|
+
esac
|
|
31
|
+
if [ "$got" = "$want" ]; then
|
|
32
|
+
printf ' โ
%-52s %s (expected %s)\n' "$label" "$got" "$want"; pass=$((pass+1))
|
|
33
|
+
else
|
|
34
|
+
printf ' โ %-52s %s (expected %s)\n out: %s\n' "$label" "$got" "$want" "$out"; fail=$((fail+1))
|
|
35
|
+
fi
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
echo "[target-freeze] fixture build"
|
|
39
|
+
mkdir -p "$R" && git init -q "$R"
|
|
40
|
+
git -C "$R" config user.email t@t; git -C "$R" config user.name t
|
|
41
|
+
printf 'a\n' >"$R/a.txt"
|
|
42
|
+
git -C "$R" add -A && git -C "$R" commit -qm init
|
|
43
|
+
|
|
44
|
+
echo "[target-freeze] lanes"
|
|
45
|
+
run "pin (์ต์ด)" MATCH bash "$T" pin "$R" demo
|
|
46
|
+
|
|
47
|
+
# โโ A. ์ ํ ์คํจ โก-1: ์ค ์ ๋ถ๋ณ in-place ํธ์ง โโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
48
|
+
printf 'b\n' >"$R/a.txt"
|
|
49
|
+
run "A ์ค ์ ๊ฐ์ in-place ํธ์ง โ WRONG" WRONG bash "$T" verify "$R" demo
|
|
50
|
+
printf 'a\n' >"$R/a.txt"
|
|
51
|
+
|
|
52
|
+
# โโ C. ํ๋ณ๋ ฅ ์ปจํธ๋กค โ ๋๋๋ฆฌ๋ฉด ๋ค์ MATCH (ยซํญ์ ๋ค๋ฅด๋คยป ๊ณ๊ธฐ๊ฐ ์๋) โโโโโโโโ
|
|
53
|
+
run "C ๋ณต์ ํ โ MATCH (ํ๋ณ๋ ฅ ์ปจํธ๋กค)" MATCH bash "$T" verify "$R" demo
|
|
54
|
+
|
|
55
|
+
# โโ B. ์ ํ ์คํจ โก-2: untracked ์ถ๊ฐ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
56
|
+
printf 'new\n' >"$R/untracked.txt"
|
|
57
|
+
run "B untracked ์ถ๊ฐ โ WRONG" WRONG bash "$T" verify "$R" demo
|
|
58
|
+
rm -f "$R/untracked.txt"
|
|
59
|
+
run "B ์ ๊ฑฐ ํ โ MATCH" MATCH bash "$T" verify "$R" demo
|
|
60
|
+
|
|
61
|
+
# โโ gitignore ๋ ํ์ผ์ ๋์์ด ์๋๋ค (์คํ ๊ฒฝ๋ก โ ์ฐ์ถ๋ฌผ ๋๋ ํ ๋ฆฌ๊ฐ ๋งค ๋ฐ ๋ฐ๋๋ค) โโ
|
|
62
|
+
printf 'out/\n' >"$R/.gitignore"
|
|
63
|
+
git -C "$R" add .gitignore && git -C "$R" commit -qm ignore
|
|
64
|
+
run "pin (ignore ์ปค๋ฐ ํ ์ฌํ)" MATCH bash "$T" pin "$R" demo
|
|
65
|
+
mkdir -p "$R/out" && printf 'noise\n' >"$R/out/run.log"
|
|
66
|
+
run "ignored ์ฐ์ถ๋ฌผ ์์ฑ โ MATCH (์คํ ์์)" MATCH bash "$T" verify "$R" demo
|
|
67
|
+
|
|
68
|
+
# โโ โ ์ํ ๋นํธ: ์ด ์ ์์ผ๋ฉด ยซ์ผ์นยป ๋ฅผ ๋ผ ์๊ฒฉ์ด ์๋ค โโโโโโโโโโโโโโโโโโโโโโ
|
|
69
|
+
git -C "$R" update-index --assume-unchanged a.txt
|
|
70
|
+
printf 'HIDDEN\n' >"$R/a.txt"
|
|
71
|
+
run "assume-unchanged โ UNKNOWN (ํต๊ณผ ์๋)" UNKNOWN bash "$T" verify "$R" demo
|
|
72
|
+
git -C "$R" update-index --no-assume-unchanged a.txt
|
|
73
|
+
printf 'a\n' >"$R/a.txt"
|
|
74
|
+
|
|
75
|
+
# โโ โ ๋ฏธ์ธก์ ์ ํต๊ณผ๋ก ์ ์ง ์๋๋ค โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
76
|
+
run "ํ ์๋ ๋ผ๋ฒจ โ UNKNOWN" UNKNOWN bash "$T" verify "$R" nolabel
|
|
77
|
+
run "git ๋ ํฌ ์๋ โ UNKNOWN" UNKNOWN bash "$T" verify "$WORK" demo
|
|
78
|
+
|
|
79
|
+
# โโ ์คํ
์ด์ง๋ง ํด๋ ๋์์ ์์ง์ธ ๊ฒ์ด๋ค โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
80
|
+
printf 'staged\n' >"$R/a.txt"; git -C "$R" add a.txt
|
|
81
|
+
run "staged ๋ณ๊ฒฝ โ WRONG" WRONG bash "$T" verify "$R" demo
|
|
82
|
+
|
|
83
|
+
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
84
|
+
# cross-family(codex, 2026-08-18)๊ฐ **๋ซ์** ๊ฒฝ๋ก๋ค โ ์ ๋ถ ์ฌํ ํ์ธ ํ ์ฌ๊ธฐ ๊ณ ์ ํ๋ค.
|
|
85
|
+
# ๐ฅ ์ 11 ๋ ์ธ์ด ์ด๋ก์ธ ์ฑ๋ก ์๋๊ฐ ์ ๋ถ ํต๊ณผํ๋ค: ์ปจํธ๋กค์ด ์๋ค๋ ๊ฒ๊ณผ ํ๋ณ๋ ฅ์ด ์๋ค๋
|
|
86
|
+
# ๊ฒ์ ๋ค๋ฅด๋ค. ์ด ๋ธ๋ก์ด ์์ผ๋ฉด ๋ค์ ์๋ฆฌ๊ฐ ๊ฐ์ ์๋ฆฌ๋ฅผ ์กฐ์ฉํ ๋ค์ ์ฐ๋ค.
|
|
87
|
+
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
88
|
+
echo
|
|
89
|
+
echo "[target-freeze] cross-family ๊ฐ ๋ซ์ ๊ฒฝ๋ก (fail-open 3 ยท ์คํ 1)"
|
|
90
|
+
|
|
91
|
+
# โโ S: ๋ผ๋ฒจ ๋ณ์นญ โ `a/b` ์ `a_b` ๊ฐ ๊ฐ์ ํ ํ์ผ์ด๋ฉด ยซํํ ์ ์๋ ๋ผ๋ฒจยป ์ด MATCH โโ
|
|
92
|
+
bash "$T" pin "$R" a_b >/dev/null 2>&1
|
|
93
|
+
run "S ๋ผ๋ฒจ ๋ณ์นญ a/b (ํ ์์) โ UNKNOWN" UNKNOWN bash "$T" verify "$R" a/b
|
|
94
|
+
|
|
95
|
+
# โโ S: `ls-files -o` ์คํจ๊ฐ ํ์ดํ์ ๋จนํ ยซuntracked ์์ยป ์ผ๋ก ์ ํ๋ ๊ฒ โโโโโโโโโโ
|
|
96
|
+
FAKEBIN="$WORK/fakebin"; mkdir -p "$FAKEBIN"
|
|
97
|
+
REALGIT=$(command -v git)
|
|
98
|
+
printf '#!/usr/bin/env bash
|
|
99
|
+
if [ "$1" = "-C" ] && [ "$3" = "ls-files" ] && [ "$4" = "-o" ]; then exit 42; fi
|
|
100
|
+
exec %q "$@"
|
|
101
|
+
' "$REALGIT" >"$FAKEBIN/git"
|
|
102
|
+
chmod +x "$FAKEBIN/git"
|
|
103
|
+
bash "$T" pin "$R" lsfail >/dev/null
|
|
104
|
+
printf 'new
|
|
105
|
+
' >"$R/u2.txt"
|
|
106
|
+
run "S ls-files -o ๊ณ ์ฅ โ UNKNOWN (MATCH ์๋)" UNKNOWN env PATH="$FAKEBIN:$PATH" bash "$T" verify "$R" lsfail
|
|
107
|
+
rm -f "$R/u2.txt"
|
|
108
|
+
|
|
109
|
+
# โโ S: untracked ์ค์ฒฉ git repo โ ์์ ๋ด์ฉ ๋ณ๊ฒฝ์ ๋ชป ๋ณด๋ฏ๋ก **fail-closed** โโโโโโโโ
|
|
110
|
+
mkdir -p "$R/nested" && git init -q "$R/nested"
|
|
111
|
+
git -C "$R/nested" config user.email t@t; git -C "$R/nested" config user.name t
|
|
112
|
+
printf 'one
|
|
113
|
+
' >"$R/nested/x.txt"
|
|
114
|
+
run "S untracked ๋๋ ํ ๋ฆฌ โ UNKNOWN (๋ชป ์ฐ๋ค๊ณ ๋งํ๋ค)" UNKNOWN bash "$T" pin "$R" nested
|
|
115
|
+
rm -rf "$R/nested"
|
|
116
|
+
|
|
117
|
+
# โโ A: ๊นจ์ง ์ฌ๋ณผ๋ฆญ ๋งํฌ ์ฌ์ง์ โ ๋งํฌ๊ฐ ๊ฐ๋ฆฌํค๋ ๋ฌธ์์ด์ด ๋ด์ฉ์ด๋ค โโโโโโโโโโโโโโโโโ
|
|
118
|
+
ln -s missing-one "$R/link"
|
|
119
|
+
run "A ์ฌ๋ณผ๋ฆญ ๋งํฌ pin" MATCH bash "$T" pin "$R" symlink
|
|
120
|
+
ln -sfn missing-two "$R/link"
|
|
121
|
+
run "A ๋งํฌ ์ฌ์ง์ โ WRONG" WRONG bash "$T" verify "$R" symlink
|
|
122
|
+
ln -sfn missing-one "$R/link"
|
|
123
|
+
run "A ๋งํฌ ๋ณต์ โ MATCH (ํ๋ณ๋ ฅ ์ปจํธ๋กค)" MATCH bash "$T" verify "$R" symlink
|
|
124
|
+
rm -f "$R/link"
|
|
125
|
+
|
|
126
|
+
# โโ S: ์๋ธ๋ชจ๋ **์ํนํธ๋ฆฌ** ๋ด์ฉ ๋ณ๊ฒฝ (์ปค๋ฐ ์์ด) โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
127
|
+
# ๐ฅ `submodule status` ๋ง์ผ๋ก๋ ๋ชป ์ก๋๋ค โ ๊ทธ ์ค์ ์๋ธ๋ชจ๋์ HEAD ๋ฅผ ๋งํ๋ฏ๋ก,
|
|
128
|
+
# ์ปค๋ฐ ์์ด ํ์ผ๋ง ๊ณ ์น๋ฉด SHA ๊ฐ ๊ทธ๋๋ก๋ค. ์๋ฆฌ 1์ฐจ๋ณธ์ด ์ ํํ ์ฌ๊ธฐ์ ๋ซ๋ ธ๋ค.
|
|
129
|
+
SUB="$WORK/sub"; mkdir -p "$SUB" && git init -q "$SUB"
|
|
130
|
+
git -C "$SUB" config user.email t@t; git -C "$SUB" config user.name t
|
|
131
|
+
printf 'v1\n' >"$SUB/s.txt"; git -C "$SUB" add -A; git -C "$SUB" commit -qm sub
|
|
132
|
+
SR="$WORK/subhost"; mkdir -p "$SR" && git init -q "$SR"
|
|
133
|
+
git -C "$SR" config user.email t@t; git -C "$SR" config user.name t
|
|
134
|
+
printf 'a\n' >"$SR/a.txt"; git -C "$SR" add -A; git -C "$SR" commit -qm init
|
|
135
|
+
if git -C "$SR" -c protocol.file.allow=always submodule add -q "$SUB" sub 2>/dev/null; then
|
|
136
|
+
git -C "$SR" commit -qm addsub
|
|
137
|
+
printf 'v2\n' >"$SR/sub/s.txt"
|
|
138
|
+
run "S ์๋ธ๋ชจ๋ pin" MATCH bash "$T" pin "$SR" sm
|
|
139
|
+
printf 'v3\n' >"$SR/sub/s.txt"
|
|
140
|
+
run "S ์๋ธ๋ชจ๋ ์ํนํธ๋ฆฌ ๋ณ๊ฒฝ โ WRONG" WRONG bash "$T" verify "$SR" sm
|
|
141
|
+
printf 'v2\n' >"$SR/sub/s.txt"
|
|
142
|
+
run "S ์๋ธ๋ชจ๋ ๋ณต์ โ MATCH (ํ๋ณ๋ ฅ ์ปจํธ๋กค)" MATCH bash "$T" verify "$SR" sm
|
|
143
|
+
else
|
|
144
|
+
printf ' โ ๏ธ ์๋ธ๋ชจ๋ ๋ ์ธ skip โ ์ด git ์ด file:// ์๋ธ๋ชจ๋์ ๊ฑฐ๋ถํ๋ค(๋ฏธ์ธก์ , ํต๊ณผ ์๋)\n'
|
|
145
|
+
fi
|
|
146
|
+
|
|
147
|
+
# โโ A: ์คํ โ ๋น ์ปค๋ฐ์ **๋ด์ฉ์ ์ ๋ฐ๊พผ๋ค**. ํธ๋ฆฌ ํด์๋ฅผ ์ฐ๋ฏ๋ก MATCH ์ฌ์ผ ํ๋ค โโโโ
|
|
148
|
+
# โ
์ ๋ ์ธ์ด ์คํ
์ด์ง์ ๋จ๊ฒจ ๋๋ค. ๊ทธ๋๋ก `--allow-empty` ํ๋ฉด **๊ทธ ์คํ
์ด์ง์ด ์ปค๋ฐ๋์ด**
|
|
149
|
+
# ํธ๋ฆฌ๊ฐ ์ค์ ๋ก ๋ฐ๋๋ค โ ์ดํ์์ ์ด ๋ ์ธ์ด ๋นจ๊ฐฐ๋ ์ด์ ๋ ์คํฌ๋ฆฝํธ๊ฐ ์๋๋ผ ํฝ์ค์ฒ์๋ค.
|
|
150
|
+
git -C "$R" reset -q --hard HEAD
|
|
151
|
+
bash "$T" pin "$R" emptycommit >/dev/null
|
|
152
|
+
git -C "$R" commit --allow-empty -qm noop
|
|
153
|
+
run "A ๋น ์ปค๋ฐ(๊ฐ์ tree) โ MATCH (์คํ ์๋)" MATCH bash "$T" verify "$R" emptycommit
|
|
154
|
+
|
|
155
|
+
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
156
|
+
# 2๋ฒ์งธ ๊ณ์ด(agy, 2026-08-18)์ด **๋ค๋ฅธ ์ถ**์์ ๋ซ์ ๊ฒ โ codex ์ง์ ๋ชฉ๋ก์ ์ฃผ๊ณ ยซ๊ทธ ๋ฐยป์
|
|
157
|
+
# ์๊ตฌํ๋ค. ๊ณ์ด์ ๋๋ ๊ฒ์ด ๊ฐ์ ๋๋ค(๊ฐ์ ๊ณ์ด ๋์ด๋ฉด ๊ฐ์ ์ฌ๊ฐ์ด ๋จ๋๋ค).
|
|
158
|
+
# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
159
|
+
echo
|
|
160
|
+
echo "[target-freeze] 2๋ฒ์งธ ๊ณ์ด์ด ๋ซ์ ์ถ"
|
|
161
|
+
|
|
162
|
+
# โโ S: `GIT_DIR` ์ด `git -C` ๋ฅผ ์ด๊ธด๋ค โ ์๋ฑํ ๋ ํฌ๋ฅผ ์ฌ๊ณ ยซ๋๊ฒฐํ๋คยป ๊ณ ๋ณด๊ณ ํ๋ ๊ฒ โโ
|
|
163
|
+
OTHER="$WORK/other"; mkdir -p "$OTHER" && git init -q "$OTHER"
|
|
164
|
+
git -C "$OTHER" config user.email t@t; git -C "$OTHER" config user.name t
|
|
165
|
+
printf 'other\n' >"$OTHER/o.txt"; git -C "$OTHER" add -A; git -C "$OTHER" commit -qm other
|
|
166
|
+
git -C "$R" reset -q --hard HEAD
|
|
167
|
+
bash "$T" pin "$R" gitdir >/dev/null
|
|
168
|
+
printf 'moved\n' >"$R/a.txt"
|
|
169
|
+
# ํ๊ฒฝ๋ณ์๊ฐ ์ด์ ์์ผ๋ฉด $R ์ด ์๋๋ผ $OTHER ๋ฅผ ์ฌ์ ยซ๋ณํ ์์ยป(MATCH)์ด ๋์๋ค.
|
|
170
|
+
run "S GIT_DIR ์ค์ผ ์ํ์์๋ ๋์์ R โ WRONG" WRONG \
|
|
171
|
+
env GIT_DIR="$OTHER/.git" GIT_WORK_TREE="$OTHER" bash "$T" verify "$R" gitdir
|
|
172
|
+
git -C "$R" checkout -q -- a.txt
|
|
173
|
+
run "S ์ค์ผ ์ ๊ฑฐ ํ ๋ณต์ โ MATCH (ํ๋ณ๋ ฅ ์ปจํธ๋กค)" MATCH bash "$T" verify "$R" gitdir
|
|
174
|
+
|
|
175
|
+
# โโ S: `_sha` ๊ฐ `| awk` ๋ก rc ๋ฅผ ์๋ ๊ฒ โ ํด์ ์คํจ๊ฐ ยซ๋น ์ง๋ฌธยป ์ผ๋ก ์ ํ๋ฉด MATCH โโโโโโ
|
|
176
|
+
# ๐ฅ ์ด ๋ ์ธ์ **๋๋๋ฆผ ํ๋ก๋ธ๊ฐ ๋ง๋ค์๋ค**: `_sha` ์ rc ๊ฒ์ฌ๋ฅผ ๋๋๋ ธ๋๋ฐ 26 ๋ ์ธ์ด
|
|
177
|
+
# ์ ๋ถ ์ด๋ก์ด์๋ค = ๊ทธ ์๋ฆฌ๋ฅผ ๋ฎ๋ ์ต์ปค๊ฐ ํ๋๋ ์์๋ค(์ฅ์ ์ต์ปค). ๊ณ๊ธฐ๊ฐ ์ค์ค๋ก๋ฅผ
|
|
178
|
+
# ๋ชป ์ฌ๋ ์๋ฆฌ๋ฅผ ๋๋๋ฆผ์ด ์ง์ด๋ธ ๊ฒ์ด๋ค.
|
|
179
|
+
SHABIN="$WORK/shabin"; mkdir -p "$SHABIN"
|
|
180
|
+
REALSHA=$(command -v shasum || true)
|
|
181
|
+
if [ -n "$REALSHA" ]; then
|
|
182
|
+
printf '#!/usr/bin/env bash\ninput=$(cat)\ncase "$input" in boom*) exit 7 ;; esac\nprintf %%s "$input" | %q "$@"\n' "$REALSHA" >"$SHABIN/shasum"
|
|
183
|
+
chmod +x "$SHABIN/shasum"
|
|
184
|
+
git -C "$R" reset -q --hard HEAD
|
|
185
|
+
printf 'boom1\n' >"$R/u4.txt"
|
|
186
|
+
run "S ํด์ ๋๊ตฌ ์คํจ โ UNKNOWN (pin)" UNKNOWN env PATH="$SHABIN:$PATH" bash "$T" pin "$R" shafail
|
|
187
|
+
rm -f "$R/u4.txt"
|
|
188
|
+
run "S ์ ์ ๋๊ตฌ๋ก๋ pin ๋จ (ํ๋ณ๋ ฅ ์ปจํธ๋กค)" MATCH bash "$T" pin "$R" shafail
|
|
189
|
+
else
|
|
190
|
+
printf ' โ ๏ธ _sha ๋ ์ธ skip โ shasum ๋ถ์ฌ(๋ฏธ์ธก์ , ํต๊ณผ ์๋)\n'
|
|
191
|
+
fi
|
|
192
|
+
|
|
193
|
+
# โโ B: untracked ํ์ผ์ ์คํ ๋นํธ โ ์ด ๋ ํฌ๊ฐ ์ด๋ฏธ ๋ฐ์ธ ์ถ โโโโโโโโโโโโโโโโโโโโโโโโ
|
|
194
|
+
printf '#!/bin/sh\necho hi\n' >"$R/u3.sh"; chmod 644 "$R/u3.sh"
|
|
195
|
+
run "B ์คํ๋นํธ pin" MATCH bash "$T" pin "$R" execbit
|
|
196
|
+
chmod +x "$R/u3.sh"
|
|
197
|
+
run "B chmod +x โ WRONG (๋ด์ฉ์ ๊ทธ๋๋ก๋ค)" WRONG bash "$T" verify "$R" execbit
|
|
198
|
+
chmod 644 "$R/u3.sh"
|
|
199
|
+
run "B ๋นํธ ๋ณต์ โ MATCH (ํ๋ณ๋ ฅ ์ปจํธ๋กค)" MATCH bash "$T" verify "$R" execbit
|
|
200
|
+
rm -f "$R/u3.sh"
|
|
201
|
+
|
|
202
|
+
printf '\n[target-freeze] pass=%d fail=%d\n' "$pass" "$fail"
|
|
203
|
+
[ "$fail" -eq 0 ]
|