@chrono-meta/fh-gate 2.1.0 → 2.3.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.
@@ -168,6 +168,25 @@ controls: n/a — 측정 없음
168
168
  standpoint: tier1b(qasp)')
169
169
  check "$S7c" PASS "★컨트롤: 포인터에 대상이 붙어도 standpoint: 줄이 있으면 통과 (과차단 방지)"
170
170
 
171
+ # ── ⓓ3자대면 자기 필드 `thirdparty:` (2026-08-17 신설) ─────────────────────────
172
+ # ⓑ 와 같은 형태이므로 **ⓑ가 실측으로 겪은 fail-open 을 미리 막았는지**를 같이 고정한다.
173
+ S7d=$(mk "$D_SIX" 'axes-run: ⓐ=none ⓑ=none ⓒ=none ⓓ=→thirdparty ⓔ=none ⓕ=none
174
+ controls: n/a — 측정 없음')
175
+ check "$S7d" BLOCK "★ⓓ=→thirdparty 인데 thirdparty: 줄이 없음 → 차단 (죽은 포인터)"
176
+
177
+ S7e=$(mk "$D_SIX" 'axes-run: ⓐ=none ⓑ=none ⓒ=none ⓓ=thirdparty ⓔ=none ⓕ=none
178
+ controls: n/a — 측정 없음')
179
+ check "$S7e" BLOCK "★화살표 없는 ⓓ=thirdparty 도 차단 (ⓑ가 뚫렸던 그 표기 fail-open)"
180
+
181
+ S7f=$(mk "$D_SIX" 'axes-run: ⓐ=none ⓑ=none ⓒ=none ⓓ=→thirdparty(promptfoo·DeepEval) ⓔ=none ⓕ=none
182
+ controls: n/a — 측정 없음
183
+ thirdparty: none-found(promptfoo·DeepEval·mutation testing 훑음)')
184
+ check "$S7f" PASS "★컨트롤: 포인터에 대상이 붙어도 thirdparty: 줄이 있으면 통과 (과차단 방지)"
185
+
186
+ S7g=$(mk "$D_SIX" 'axes-run: ⓐ=none ⓑ=none ⓒ=none ⓓ=none ⓔ=none ⓕ=none
187
+ controls: n/a — 측정 없음')
188
+ check "$S7g" PASS "★컨트롤: ⓓ=none 이면 thirdparty: 줄이 없어도 통과 (포인터를 안 쓴 경우)"
189
+
171
190
  S8=$(mk "$D_SIX" 'axes-run: ⓐ=codex ⓑ=→standpoint ⓒ=none ⓓ=none ⓔ=실사용 ⓕ=되돌림
172
191
  axes-run: ⓐ=거짓말 ⓑ=x ⓒ=x ⓓ=x ⓔ=x ⓕ=x
173
192
  controls: alive — ok
@@ -866,6 +866,26 @@ validate_marker_axes_run() { # $1 = marker path
866
866
  echo " standpoint: not-applicable"
867
867
  return 1
868
868
  fi
869
+
870
+ # ⓓ3자대면도 같은 형태 — 값은 `thirdparty:` 자기 필드가 나른다 (2026-08-17 신설).
871
+ # 🟥 왜 자기 필드가 필요한가: `axes-run` 한 칸은 **토큰**만 담는다. ⓓ가 실제로 내는 것은
872
+ # «무엇을 검색해서 무엇을 찾았나» 라 한 토큰에 안 들어간다. 자리가 없으면 안 적히고,
873
+ # 안 적히면 다음 세션이 «이 축을 돌렸나»를 물을 수도 확인할 수도 없다.
874
+ # 실측(2026-08-17): 이 축을 처음 제대로 돌린 세션에서 발표 주장 **6건**이 선행자산에
875
+ # 걸렸는데, 그 결과를 기록할 필드가 없었다.
876
+ # ⚠️ ⓑ 와 **똑같은 fail-open 을 반복하지 않는다** — 화살표를 필수로 보지 않고
877
+ # «ⓓ 값이 thirdparty 를 참조하는가» 로 넓힌다(ⓑ가 그렇게 뚫렸던 실측이 바로 위에 있다).
878
+ # 같은 명시 잔여도 그대로 상속한다: 참조어가 다른 토큰에 있으면 안 잡힌다.
879
+ if echo "$line" | grep -qE "(^|[[:space:]])ⓓ=[^[:space:]]*thirdparty" \
880
+ && ! grep -qE '^[[:space:]]*thirdparty:[[:space:]]*[^[:space:]]' "$m" 2>/dev/null; then
881
+ echo " ❌ MARKER — 'ⓓ=→thirdparty' 라고 적었는데 'thirdparty:' 줄이 없다"
882
+ echo " 포인터가 가리키는 곳이 비어 있으면 그건 기록이 아니라 죽은 포인터다."
883
+ echo " thirdparty: checked(promptfoo·DeepEval 훑음 — 겹침 없음)"
884
+ echo " thirdparty: none-found(<무엇을 검색했나>) ← 찾았는데 없음. «안 봤다»와 다르다"
885
+ echo " thirdparty: UNKNOWN ← 안 봤다"
886
+ echo " thirdparty: not-applicable"
887
+ return 1
888
+ fi
869
889
  fi
870
890
 
871
891
  line=$(grep -m1 -E '^[[:space:]]*controls:' "$m" 2>/dev/null \