@chrono-meta/fh-gate 1.4.23 → 1.4.24

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chrono-meta/fh-gate",
3
- "version": "1.4.23",
3
+ "version": "1.4.24",
4
4
  "description": "FH runtime adapters — run FH governance, skills, and agents via Claude or Codex with machine-parseable gates.",
5
5
  "license": "MIT",
6
6
  "keywords": [
@@ -298,3 +298,14 @@ Phase 1: token-budget-gate verdict output + mode resolved (core default, or pro/
298
298
  ```
299
299
 
300
300
  Verdict: PASS (CLEAN verification) | CONDITIONAL_PASS (PENDING verification) | FAIL (BLOCKED verification) | ESCALATE (user decision required on partial completion)
301
+
302
+ **Completion-claim discipline (Ralph — no silent partial completion):** a PASS/CONDITIONAL_PASS
303
+ verdict must **enumerate, not assert** — (a) **evidence artifact**: the pipeline-conductor verification
304
+ verdict + the calibration record path; (b) **failed/skipped checks by name** (which pipeline axes /
305
+ sidecars FAILED or were skipped). This list is **not self-asserted** — reconcile it against the resolved
306
+ mode's in-scope axis/sidecar set: a list shorter than (in-scope − passed) is incomplete, not PASS (an
307
+ empty list is valid only when every in-scope check passed). This is the mechanical anchor that keeps the
308
+ clause off a judge-only path; (c) **explicit residual risk beyond what the mode-qualifier already states**
309
+ (e.g. an axis that ran but on degraded input). A verdict that omits any of the three is **incomplete, not
310
+ PASS**. (Convergent sister evidence: oh-my-claudecode Ralph "refuses silent partial completion"; Hermes
311
+ Agent `/goal` per-turn completion judge.)
@@ -121,6 +121,16 @@ echo "---\ndate: $(date +%Y-%m-%d)\nentries_checked: N\nupdated: N\ndrifted: N\n
121
121
  ## Constraints
122
122
 
123
123
  - **No auto-deletion**: Archive candidates are proposed, not deleted. Human confirmation required.
124
+ - **Snapshot before archive (Destructive-Op Gate for memory)**: before applying any confirmed
125
+ archive/removal in Step 4, snapshot **every memory root the entry could live in** first — tar **all**
126
+ roots Step 1 enumerated (`~/.claude/projects/*/memory/` AND hub-local `memory/`), not just one:
127
+ `tar czf tracks/_meta/memory_snapshot_$(date +%Y%m%d-%H%M%S).tgz <each Step-1 root that exists>` — so
128
+ a wrong archive in any scanned root is one-command recoverable (a single-root snapshot can pass while
129
+ the archived entry lived in the other root — bind the scope to the entry, not to "a tarball exists").
130
+ Archive moves entries to a `.archive/` sibling, never hard-deletes (mirrors the Curator's
131
+ tar-before-pass + rollback discipline; the Step 2 staleness thresholds are already the mechanical
132
+ no-LLM pre-pass that the judged Step 3 re-verify sits on top of — order preserved: mechanical roster
133
+ first, judged re-verify second).
124
134
  - **Feedback type**: Never auto-modify feedback rules — flag only.
125
135
  - **Simplification guard**: If 0 stale entries found, output one line "memory-hygiene: all fresh" and exit.
126
136
  - **FH online advantage**: Unlike offline harnesses, FH can re-verify external references live.
@@ -130,9 +140,10 @@ echo "---\ndate: $(date +%Y-%m-%d)\nentries_checked: N\nupdated: N\ndrifted: N\n
130
140
 
131
141
  ```
132
142
  Step 1~5 complete
133
- + Staleness roster output
143
+ + Staleness roster output (Step 2 = mechanical no-LLM pre-pass)
134
144
  + Re-verification run for all STALE entries
135
145
  + User gate presented and responded to (y/N per item)
146
+ + If any archive confirmed: snapshot covering the archived entry's root written before the move (tracks/_meta/memory_snapshot_*.tgz, spanning all existing Step-1 roots) — check class: mandatory-pass (snapshot covers the entry's dir, not merely "a tarball exists")
136
147
  + Hygiene log written to tracks/_meta/memory_hygiene_{date}.md
137
148
  ```
138
149
 
@@ -268,3 +268,14 @@ Step 0 scope confirmed and scope translation table applied
268
268
  Verdict: PASS (all conditions met, sweep complete) | CONDITIONAL_PASS (sweep complete, pending items captured) | FAIL (chain halted, blocking items remain) | ESCALATE (chain paused, human decision required)
269
269
 
270
270
  A sweep is not done until the Step 5 report is output. Emitting per-step verdicts without the aggregated report is incomplete.
271
+
272
+ **Completion-claim discipline (Ralph — no silent partial completion):** the Step 5 report's overall
273
+ verdict must **enumerate, not assert** — (a) **evidence artifact**: the per-step verdict source (report
274
+ path + the verdict lines it aggregates); (b) **failed + skipped checks listed by name** (degraded /
275
+ skipped / `--quick`-omitted steps included). This list is **not self-asserted** — reconcile it against
276
+ the Step 0 in-scope step set: a list shorter than (in-scope − passed) is incomplete (an empty list is
277
+ valid only when every in-scope step passed). This is the mechanical anchor that keeps the clause off a
278
+ judge-only path; (c) **explicit residual risk beyond what the mode-qualifier states** (e.g. a single-skill
279
+ scope is not a full-harness claim). A CLEAN verdict that omits any of the three is **incomplete**.
280
+ (Convergent sister evidence: oh-my-claudecode Ralph "refuses silent partial completion"; Hermes Agent
281
+ `/goal` per-turn completion judge.)