[Phase 16] S5 — Verification truth: three states, not a success bit
Nobody has claimed this yet.
Assessment
- Difficulty
- 5/5
- Estimated time
- Over a week
- Newbie friendliness
- 12/100
Research direction
Start with the planned section at docs/roadmap/phase-16-trust-surface-hardening.md lines 416-447, then read verify_annex_iv_artifact and verify_integrity and how _io_safety._read_capped_json is used. The work adds checks['strong_layer_ran'], an opt-in --require-strong-layer flag, and a .sha256 sidecar written by forgelm export. Done means the five exit criteria hold, including the exit-6 tamper round trip, with a reproducer that fails before the fix.
Written by the indexing model from the issue text.
Description
Roadmap · Phase 16, step S5 · size L · 3 unit(s) · planned in
docs/roadmap/phase-16-trust-surface-hardening.md:416-447
Summary
Three verifiers project a three-valued reality (verified / unverified / invalid) onto a two-valued valid plus an exit code, so "no strong layer ran" shares a success bit with "every strong layer passed". The exporter never writes a .sha256 sidecar for GGUF and gguf is in no dependency group, so a magic-only valid=true is the default outcome for ForgeLM's own artefacts. The writer half (CLI-03): export records its hash under exported_artifacts, a key the verifier never reads — it fails closed, a round-trip-integrity defect rather than a false pass.
Units
| Unit | Tracked by (October 2026 review) |
|---|---|
F-W20260729-TRUST-04 |
#83 · #84 · #85 · #446 · #566 · #573 · #598 · #599 |
F-W20260729-TRUST-05 |
#164 · #328 · #364 · #558 · #658 |
F-W20260729-CLI-03 |
#84 · #86 · #567 · #621 · #652 · #766 |
Decisions this step executes
- C-3 —
verify-ggufmagic-only verdict: opt-in--require-strong-layer; the default flip waits for the next MAJOR (tracked as a deferred issue). - C-4 —
forgelm exportwrites the.sha256sidecar its docs already claim.
Plan
- Add
checks['strong_layer_ran']and the opt-in--require-strong-layerflag. - Make
forgelm exportwrite the GGUF sidecar, so the strong layer is present by default. - Also owned by this step (deferral row
F-W20260729-VERIFY-UNCAPPED-READ): route the two unboundedjson.loadreads inverify_annex_iv_artifactandverify_integritythrough_io_safety._read_capped_json, so a deeply nested payload cannot end inRecursionError.
Exit criteria
- A 4-byte
b"GGUF"file with no parser and no sidecar does not report an unqualified success. - Hash-less Annex IV and pipeline roots do not return exit 0 by default, while any legacy override still reports
verified: false. - An export → tamper → verify round trip exits 6 on a flipped byte.
- The existing 1-vs-6 split is preserved exactly and stays structural (typed fields, never
reasonprose); the per-stageUNVERIFIEDbehaviour is asserted unchanged. - Both verifiers parse operator-supplied JSON through the capped reader.
How to deliver
- One root-cause family, committed on its own; then an Opus review round and a Sonnet review round, each with verified findings fixed and committed before the next step begins.
- A reproducer that is red before the fix and green after; the full gauntlet from
CLAUDE.mdpasses under./.venv/bin/python. - Every English documentation edit ships with its Turkish mirror in the same commit; a new or renamed audit event gets its EN and TR catalog rows in the same PR.
- A step that grows a deferred module carries its
budget_historyjustification in the same diff; a widened guard rolls out non-strict first, then flips. - Commit bodies cite
Absorbs F-W20260729-…; the CHANGELOG[Unreleased]section gets an entry only for a change a user or library consumer can observe (decision C-20).
Planned in docs/roadmap/phase-16-trust-surface-hardening.md (read at f94595f). Unit IDs (F-W20260729-…) come from the 2026-07-29/30 full-project review; the issue numbers next to them are the October 2026 review's records of the same defects.
- Dominant language
- Python
- Stars
- 9
- Forks
- 1
- Avg merge
- 8h 10m
- Merged PRs (30d)
- 5
Getting set up
- Ships a Dockerfile or Docker Compose file
- Has a pull request template
- Read the contributing guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from HodeTech/ForgeLM
-
area: dev-tooling bug severity: low source: roadmap wave: 4
Difficulty 2/5 1-3 hours Newbie friendliness 70/100
-
Site: the theme-locked --code-comment grey (#6a6f80) on the dark code surface is 3.8:1, below WCAG AA, in both themes (F-W1-SITE-06)Possibly taken @vortsghost2025 claimed this today. Openarea: site bug good first issue severity: low source: review-2026-09 wave: 4
Difficulty 2/5 1-3 hours Newbie friendliness 66/100
-
documentation good first issue severity: medium source: review-2026-09 wave: 3
Difficulty 2/5 1-3 hours Newbie friendliness 75/100
-
documentation good first issue severity: low source: review-2026-09 wave: 4
Difficulty 1/5 1-3 hours Newbie friendliness 80/100
-
documentation severity: medium source: review-2026-09 wave: 3
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
All issues in HodeTech/ForgeLM
Similar issues
-
Atomic append fails to create a missing filePossibly taken @harbinresearcher claimed this today. Open
Difficulty 2/5 1-3 hours Newbie friendliness 70/100
fabiocaccamo/python-fsutil#201 ·
-
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
Maintainers usually reply within 1 day
-
task
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
danparshall/claude_researcher#87 ·
Maintainers usually reply within 1 day
-
bug
Difficulty 2/5 1-3 hours Newbie friendliness 62/100
GhostManager/Ghostwriter#998 · 1 comment ·
Maintainers usually reply within 1 day
-
bug
Difficulty 2/5 1-3 hours Newbie friendliness 85/100
datajoint/datajoint-python#1586 ·
Maintainers usually reply within 1 day