@chrono-meta/fh-gate 3.1.1 → 3.1.2

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.
@@ -11,19 +11,19 @@
11
11
  "plugins": [
12
12
  {
13
13
  "name": "fh-meta",
14
- "version": "3.1.1",
14
+ "version": "3.1.2",
15
15
  "description": "New in 2.2.0: BREAKING (gate): chamber step 6 now reads ACTUAL.md, not BUDGET.md — an in-flight chamber run whose actual cost sits in BUDGET.md blocks until the ACTUAL: line moves to tracks/_chamber/<slug>/ACTUAL.md (the runner prints the path). Why: BUDGET.md's pre-verdict hash IS the ordering witness, and step 6 hard-blocked until that same file changed, so every run that reached COMPLETE necessarily mutated a witnessed artifact and verify returned TAMPERED — the chamber's promotion condition was unsatisfiable by construction, not by strictness. Two roles (immutable witness / post-verdict calibration sink) had collided in one file; each was correct alone, so neither side's code showed the conflict. Also: ko-tech-writer Step 2/4-b scans are now calibration-backed (known-pair fixtures + reproducible command, shipped) — discrimination is proven, 'zero residue' is explicitly NOT; chamber lane suite 12 -> 33 including the runner x witness seam no test covered; chamber_run.sh now teaches the two-commit discipline (gate hashes and verdict hash must land in separate commits/PRs — it previously advised the opposite). New in 2.1.0: BREAKING (gate): `crossfamily: declined` in an Axes 2-3 marker now requires grounds naming a record path that RESOLVES on disk — bare `declined`, and `declined` justified by author judgment, are blocked at commit. Remedy: cite where the operator decision lives (e.g. `.. — operator declined sidecars, per knowledge/shared/rules/operational_adaptation.md`), or use `DEGRADED_PANEL_UNUSED` if a panel was reachable and you chose not to recruit it — which is what author judgment actually is. `declined` was the only enum value with no grounds requirement; a cross-family review then broke the first (vocabulary-grep) fix three ways — self-validating on the value's own token, vacuous keyword passes, and over-blocking real declinations in natural prose — so the check asserts a resolvable record instead of words. Also: standpoint axis gains `tier1b` (a STATIC read of a target repo, executed nothing) plus a decide-in-order procedure, after blind floor-tier sims graded pure cold-reads as `tier2` three rounds running; steel-quench Wave 1's sixth angle (gate-locality) gains the output-template row it never had, so a mandatory angle stops being structurally unreportable; verify-bidirectional gains category 5 (prescriptive doctrine statement); Sister Asset Protocol gains an active-adoption trigger; new resident doctrine — Mechanization Boundary, Local Execution First, Skeleton-not-Muscle, Expedition track, and this package's versioning policy. Hub meta-operations toolkit — 35 skills + 7 agents. New in 2.0.1: harness-doctor cadence hook, portability lint wired into pre-commit, branch_claim.sh claim-count-vs-tree-count warning, louder confidentiality-scan fail-open notice, fh-gate.sh missing-package.json survival, identity ① reclassified 🟢 (cross-harness adapters + relay argument channel). New in 1.4.53: `fh-codex-doctor` (npm bin) — Codex adapter drift scanner; reads the documented M1/M2/M3 skill tier map + skill/agent source and reports codex-native/adapter-required/claude-native/unclassified per unit, wired into `npm test`/`prepublishOnly` (fail-closed on unclassified Claude-native primitives). New in 1.4.49: steel-quench gains Step 0.6 Verdict-Invariance Probe (groundedness axis — a load-bearing judged gate's verdict must track behavior, not rubric phrasing; measured flip-count over cross-family paraphrases; arXiv:2605.06161 Policy Invariance anchor); multi_model_sidecar_strategy §Vendor-native harness (a model is strongest in its own vendor CLI — Claude/CC, GPT/codex, Gemini/Antigravity; a universal router degrades all of them, so it stays an autocomplete/QA sidecar, never orchestration); predelete_check.sh fail-closed rewrite; memory-hygiene A-TMA anchor. New in 1.4.48: phantom-quench + steel-quench gain external frontier anchors (arXiv:2607.02052 package-hallucination; arXiv:2607.02057 prompt-coverage-adequacy); README model-flat claim reframed from a per-release point-curve to structural invariants (operation flattens across tiers; depth tier-order fixed within a generation). New in 1.4.47: onboarding step ① surfaces the Mode D companion-store session-start load in the auto-read salience anchor (previously only in the local binding + rules, so a greeting could skip the load). New in 1.4.46: context-doctor command-output axis (route to rtk/proxy for verbose CLI stdout, complementing .claudeignore; risk-gated to token-scarce envs). New in 1.4.41: context-doctor 2026 trigger vocab (context engineering/rot/collapse) + phantom-citation hardening; hub measurement-integrity-checklist (cross-model measurement pre-flight: display-name pin/reps≥3/discriminating probe). New in 1.4.40: install-wizard queryable-wiki scaffold (INDEX + session-start read + R/W/C ingest). New in 1.4.39: auto-decorrelation (cross-family verifier sidecar recruitment) + video-ingest (capability-routed video ingestion). New in 1.4.x: verify-axis check-class taxonomy (mandatory-pass/measured/judged), no-reinvention Tier-0 inventory, 7-class failure taxonomy, Destructive-Op Gate, Wave-T (Temper), tier-floor governance, Mode D Model Notice, FC consent lane, default-Sonnet guidance. New in 1.3.0: public-surface-audit, field-harvest Mode B auto-trigger, 4-axis gate scope ext. Validated cross-CLI: Claude Code, Codex, Gemini.",
16
16
  "source": "./plugins/fh-meta"
17
17
  },
18
18
  {
19
19
  "name": "fh-commons",
20
- "version": "3.1.1",
20
+ "version": "3.1.2",
21
21
  "description": "Project-agnostic utility skills — 5 skills (convergence-loop · deliberation · mcp-circuit-breaker · token-budget-gate · ko-tech-writer) + 1 agent (quench-challenger). Domain-independent utilities transplantable into any project.",
22
22
  "source": "./plugins/fh-commons"
23
23
  },
24
24
  {
25
25
  "name": "fh-qp",
26
- "version": "3.1.1",
26
+ "version": "3.1.2",
27
27
  "description": "QP (Quality Platform) — the generic edition of a field QA harness's Prepare→Automation→Regression loop as an FH plugin: 4 skills (qp router · qp-plan · qp-run · qp-regress) + qp_tools.sh (target-class · adapter-probe · mask · surface-reach · mtm-check · run-verbs, typed exit codes) + a zero-domain-constant profile slot + 29 known-pair lanes. Drives web targets through the session's Playwright MCP and desktop targets through computer-use MCP (mobile deferred); calls a registered qasp typed capability when one exists (strictest-wins) — none is registered today, so the MCP fallback is the first edition. Verdict contract: a MACHINE closure requires a recorded assertion; a failed first step is attributed BLOCKED, not FAIL; surface_reach counts every TC in the denominator. Born as chamber run #18 (EMIT, 2026-09-05).",
28
28
  "source": "./plugins/fh-qp"
29
29
  }
package/README.ja.md CHANGED
@@ -58,7 +58,7 @@ brew tap chrono-meta/forge-harness && brew install forge-harness # あるい
58
58
  **GitHub Actions では** — 同じゲートを1つのステップとして、判定は型のあるまま:
59
59
 
60
60
  ```yaml
61
- - uses: chrono-meta/forge-harness@v3.1.1
61
+ - uses: chrono-meta/forge-harness@v3.1.2
62
62
  with:
63
63
  files: ${{ steps.changed.outputs.files }}
64
64
  env:
package/README.ko.md CHANGED
@@ -45,7 +45,7 @@ brew tap chrono-meta/forge-harness && brew install forge-harness # 또는 이
45
45
  **GitHub Actions 에서** — 같은 게이트를 스텝 하나로, 판정은 타입을 유지한 채:
46
46
 
47
47
  ```yaml
48
- - uses: chrono-meta/forge-harness@v3.1.1
48
+ - uses: chrono-meta/forge-harness@v3.1.2
49
49
  with:
50
50
  files: ${{ steps.changed.outputs.files }}
51
51
  env:
package/README.md CHANGED
@@ -47,7 +47,7 @@ brew tap chrono-meta/forge-harness && brew install forge-harness # or this
47
47
  **In GitHub Actions** — the same gate as a step, with the verdict kept typed:
48
48
 
49
49
  ```yaml
50
- - uses: chrono-meta/forge-harness@v3.1.1
50
+ - uses: chrono-meta/forge-harness@v3.1.2
51
51
  with:
52
52
  files: ${{ steps.changed.outputs.files }}
53
53
  env:
package/README.zh.md CHANGED
@@ -57,7 +57,7 @@ brew tap chrono-meta/forge-harness && brew install forge-harness # 或者用
57
57
  **在 GitHub Actions 里** —— 同一道门禁作为一个 step,判定依然是带类型的:
58
58
 
59
59
  ```yaml
60
- - uses: chrono-meta/forge-harness@v3.1.1
60
+ - uses: chrono-meta/forge-harness@v3.1.2
61
61
  with:
62
62
  files: ${{ steps.changed.outputs.files }}
63
63
  env:
@@ -3527,3 +3527,13 @@
3527
3527
  evidence: "릴리스 v3.1.0 npm 라이브(latest=3.1.0) + GitHub 릴리스 + PR #664 머지 · PR #665(verify 재시도) · gh-pages 랜딩 개편 발행(지도 91%→5.6%) · tt-a1i/archify#328 upstream 제출(스위트 1058/1030/0, zip 결정적 재빌드) · qasp PR #269 머지 · 논문 v1.0.1 수정본(인용 21/21 재검증, 원본 해시 불변). cross-family(codex) A급 1건 적발 — CHANGELOG L12 과대주장, 소스 재확인 후 수리, **자력 적발 0**"
3528
3528
  tokens_subagent: 2100000
3529
3529
  notes: "🟥 이 날의 최대 발견은 코드가 아니라 **논문**이다 — 반려된 v1.0 의 참고문헌 17건 중 11건이 어긋나 있었다(ID 는 실재, 제목·저자가 다른 논문 것, 한 건은 공간생물학). 그 논문 자신이 «존재 검사 → 출처 검사» 2단계를 방법론으로 제시하고 「허위율 0%」라 보고했다. **방법은 있었고 자기에게 안 돌렸다.** 대조군이 이례적으로 좋다: 같은 심사 창에서 제품명 0회인 자매 논문은 보류 해제. 🟥 부수 교훈 3건이 전부 계기 결함이다 — ① 내 인용 추출기가 References 대신 Changelog 를 긁었다 ② 레인 rc=1 인데 MV 줄만 필터해 보고 실패 3건을 놓쳤다 ③ archify 테스트를 잘못된 cwd 에서 돌려 rc=254 를 «실패»로 읽을 뻔했다. 셋 다 «출력을 좁혀 본 것»이 원인이다"
3530
+
3531
+ - date: 2026-09-07
3532
+ agent: general-purpose ×2 (논문 B 라운드 2 — 같은 에이전트 resume · qasp M①M③ 수리 완료분) + 자정 이전 세션에서 이어진 디스패치의 자정 이후 회신 처리
3533
+ invoked_by: FH governor session (Opus 5, 09-06 저녁부터 이어진 한 세션 — 운영자 «자율주행 이어가줘 · 승인 필요한 것만 아침에»)
3534
+ task: "논문 B 거버너 심사 M1~M3 반영(증거 출처 공개화 · 사후 택소노미 도출절 · 「few」 정량화) · qasp 엣지 TC 2막 도달 수리 PR"
3535
+ context_card: yes (심사 지적 셋 + 유지할 것 명시 + 산출 경로 고정)
3536
+ outcome: accepted
3537
+ evidence: "논문 B DRAFT2 — 사례표 `memory/` 인용 13행 → **0**(🟥 내가 센 11 이 아니라 13 이었다: `tracks/**` 도 gitignored 라는 걸 에이전트가 `git ls-files --error-unmatch` + known-pair 로 잡았다) · 「few」 → **4/24** · 내부 모순 2건 자체 적발·수리. qasp PR #270 머지(fe95282), CI 6/6 — 🟥 그중 2건은 그 PR 이 만든 결함이고 거버너가 잡아 고쳤다(사유 문구가 CI 가드의 grep 대상 · 자동 탐색이 음성 컨트롤 무력화)"
3538
+ tokens_subagent: 700000
3539
+ notes: "🟥 사고 하나 — 에이전트가 DRAFT 1 을 제자리 편집으로 덮었고 회수 불가(파일·스냅샷·git 전부 0). **원인은 내 쪽**이다: 「이전 판 남겨라」를 임무문에 산문으로만 적고 발주 전에 커밋하지 않았다. 메모리 `feedback_commit_the_artifact_before_the_next_round` 신설 + DRAFT2 즉시 커밋으로 적용. 🟥 그리고 사이드카 주장 하나(row 29)를 거버너가 재현 못 해 라운드 3 으로 되돌렸다 — 이 논문이 다루는 주제가 바로 그것이라 «그럴듯한데 원 출처에 없는 것」을 실으면 논문이 자기를 반증한다"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chrono-meta/fh-gate",
3
- "version": "3.1.1",
3
+ "version": "3.1.2",
4
4
  "description": "FH runtime adapters — run FH governance, skills, and agents via Claude or Codex with machine-parseable gates.",
5
5
  "homepage": "https://github.com/chrono-meta/forge-harness#readme",
6
6
  "bugs": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fh-commons",
3
- "version": "3.1.1",
3
+ "version": "3.1.2",
4
4
  "engines": {
5
5
  "claudeCode": ">=1.0.0"
6
6
  },
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fh-meta",
3
- "version": "3.1.1",
3
+ "version": "3.1.2",
4
4
  "engines": {
5
5
  "claudeCode": ">=1.0.0"
6
6
  },
@@ -1,5 +1,25 @@
1
1
  # forge-harness (fh-meta) Changelog
2
2
 
3
+ ### [3.1.2] — 2026-09-07 — Action 설명이 마켓플레이스 한도를 넘어 게시가 막혔다
4
+
5
+ 운영자가 마켓플레이스 개발자 약관에 동의해 게시 체크박스가 열리자, GitHub 의 리스팅 폼이
6
+ `action.yml` 을 검증하고 **거절**했다:
7
+
8
+ ✅ 이름 fh-gate — typed AI code-review verdict
9
+ ❌ 설명 Description must be less than 125 characters ← 155자였다
10
+ ✅ 아이콘 shield · ✅ 색상 purple · ✅ README 존재
11
+
12
+ **이 레포의 어떤 검사도 그 한도를 안 보고 있었다.** 그래서 태그와 릴리스가 이미 만들어진 뒤,
13
+ 게시 단계에서야 드러났다 — 배우기에 가장 비싼 자리다.
14
+
15
+ - 설명을 **121자**로(«안 돌았다 ≠ 통과」라는 이 액션의 구별점은 유지)
16
+ - **레인 D6** — `action.yml` 의 `description` 길이를 판정한다. 한도는 GitHub 것이라 여기서는
17
+ 상수일 수밖에 없고, 그 사실을 숨기지 않고 주석에 적었다. `D6` 은 읽기 실패도 잡는다(빈 값이면
18
+ 길이 검사가 공허 통과한다). fail-before: 옛 155자 설명으로 되돌리면 **정확히 D6 만** 적색
19
+ (34 passed · 1 failed), 복원하면 35/0.
20
+
21
+ ⚠️ `v3.1.0`·`v3.1.1` 태그는 안 움직인다. 마켓플레이스에 게시되는 것은 **3.1.2** 다.
22
+
3
23
  ### [3.1.1] — 2026-09-07 — fh-gate Action 의 기본 `level` 이 게이트가 안 받는 값이었다
4
24
 
5
25
  ### 🟥 무엇이 깨져 있었나
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fh-qp",
3
- "version": "3.1.1",
3
+ "version": "3.1.2",
4
4
  "engines": {
5
5
  "claudeCode": ">=1.0.0"
6
6
  },
@@ -90,6 +90,26 @@ else
90
90
  fi
91
91
  fi
92
92
 
93
+ # D6 — the Marketplace listing form caps `description` at under 125 characters and REFUSES to
94
+ # publish above it. Measured 2026-09-07 on the v3.1.1 release form: "Description must be less than
95
+ # 125 characters" at 155 chars. Nothing here checked it, so the limit surfaced only at the publish
96
+ # step — after the tag and the release already existed, which is the expensive place to learn it.
97
+ # The cap is GitHub's, not ours, so it is a constant here by necessity; that is named, not hidden.
98
+ _DESC="$(python3 - "$A" <<'PY' 2>/dev/null
99
+ import sys, yaml, io
100
+ print(yaml.safe_load(io.open(sys.argv[1], encoding="utf-8")).get("description", ""))
101
+ PY
102
+ )"
103
+ _DESC_LEN=${#_DESC}
104
+ if [ "$_DESC_LEN" -eq 0 ]; then
105
+ no "D6 could not read action.yml description (instrument dead — the length check below is vacuous)"
106
+ else
107
+ [ "$_DESC_LEN" -lt 125 ] \
108
+ && ok "D6 description is $_DESC_LEN chars (< 125, the Marketplace listing cap)" \
109
+ || no "D6 description is $_DESC_LEN chars — the Marketplace form refuses to publish at 125 or more"
110
+ fi
111
+
112
+
93
113
 
94
114
  [ -n "$MAP" ] || { echo "❌ HARNESS: could not extract the case block from action.yml"; exit 10; }
95
115
  printf '%s' "$MAP" | grep -q 'esac' || { echo "❌ HARNESS: extracted block has no esac (truncated)"; exit 10; }