v6.8 Part 2: gate precision — honest-reject floor bypass + bullet not_applicable evidence (#74, #75) - #17
Merged
Conversation
…pplicable evidence Bundles two precision fixes for the v6.7 completion gates surfaced by the 2026-06-10 validation chain on hermes-dashboard. Both touch ``kanban_completion_gates.py``. Closes hermes-jarvis#74 (honest-reject floor bypass) Closes hermes-jarvis#75 (bullet not_applicable for evidence) ## NousResearch#74 — honest-reject floor bypass The 90s reviewer runtime floor was designed against rubber-stamp APPROVES. The validation chain showed it also blocked accurate rejects: Tony correctly identified 3 real bugs in 20-38 seconds, verdict: reject with substantive evidence, but the gate rejected the completion 6+ times. Penalizing accurate fast rejects creates pressure to either fake-pad time or rubber-stamp-approve. Neither is good. Fix: ``verify_runtime_floor`` gains an ``is_honest_reject`` kwarg. When True AND the worker is in REVIEW_ROLES (tony/tchalla/vision/ reviewer), the floor is bypassed. Build/orchestration roles are unaffected — a friday 60-second "implementation" that ends in reject still warrants the floor (could be bailing on work, not a real fast reject). The verdict is parsed once at the top of ``_v6_7_run_completion_gates`` via the existing ``_v6_7_parse_verdict`` and passed through. Also hoisted ``REVIEW_ROLES`` / ``ORCHESTRATION_ROLES`` constants above their first use (they were used at line 92 but defined at line 144 — Python tolerates the forward ref but it's fragile). ## NousResearch#75 — bullet `not_applicable: <reason>` for evidence The 2026-06-10 Tony case: he wrote ``evidence:\n - not_applicable: no tests directory or *.test.* files reference swarm status`` — honestly declaring there are no tests. The previous regex only accepted inline ``evidence: none`` (or ``[]`` / ``n/a``), not the bullet form. So Tony's verbose-but- correct verdict was rejected for missing test_quality.evidence. Fix: ``_field_present`` for test_quality.evidence now accepts a ``- not_applicable: <reason>`` bullet item with reason ≥8 chars, mirroring the existing imports_match_deliverable_entrypoints rule. The same ``code_change_context`` rule applies — code-touching reviews must still produce real citations, not honest-empty escapes. ## Tests 13 new tests covering both fixes: **TestRuntimeFloor (6 new):** - honest reject bypasses floor for tony / tchalla / vision - approve under floor still rejects (rubber-stamp protection) - honest reject does NOT bypass for build roles (friday still 5min) - honest reject + unknown role is a pass (existing behavior) **TestBulletNotApplicableEvidence (7):** - bullet not_applicable accepted on docs review - bullet not_applicable blocked on code review (code_change_context) - bullet not_applicable with <8-char reason rejected - bullet not_applicable with empty reason rejected - real citations still pass - inline ``evidence: none`` still works (backwards-compat) - mixing real bullets with not_applicable doesn't regress **TestHonestRejectIntegration (2):** - tony fast reject in 20s passes complete_task end-to-end - tony fast approve in 20s still blocked (regression guard) 105/105 in test_kanban_completion_gates.py pass. 191/191 across full v6.7/v6.8 + adjacent regression set — zero failures. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
… document edit-result caveat Independent review of v6.8 Part 2 flagged 3 polish items. All addressed. ## Regex tightening (NousResearch#75 follow-up) The bullet-not-applicable regex `\S.{6,}` was accepting reasons of 7 chars (1 + 6) but the docstring and tests asserted ≥8 chars to match the `imports_match_deliverable_entrypoints` invariant. Tightened to `\S.{7,}` so 1 + 7 = 8 chars minimum. Same as the imports_match length check, no off-by-one. ## Integration test gaps (NousResearch#74 follow-up) Reviewer flagged two missing integration cases: - Bare `verdict: reject` with no test_quality fields: floor bypasses (because verdict IS reject) but reviewer-fields gate catches the missing discipline. New test asserts the gate that catches it is MissingReviewerFieldViolation, NOT RuntimeFloorViolation. This proves the bypass doesn't accidentally green-light no-evidence rejects. - No verdict at all: parsed_verdict is None, is_honest_reject is False, floor fires normally. New test asserts a result like "Just my thoughts, no verdict line." doesn't silently bypass the floor. ## edit_completed_task_result documentation The reviewer noted this function exists at kanban_db.py:4180 to back- fill results on done tasks (via `hermes kanban edit`). It bypasses EVERY v6.7/v6.8 gate. If a future maintainer wires it into a worker tool surface, every gate becomes bypassable: complete with low- discipline, edit to high-discipline, or flip approve↔reject after the gate already ran. Added a multi-line .warning:: docstring listing every gate it bypasses and the specific attacks a worker-accessible wiring would enable. No code change — this is a comment-level guard for human ops. 107/107 in test_kanban_completion_gates.py pass (105 + 2 new). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…nban_tools The previous self-review commit accidentally included 4 lines from an uncommitted local edit (likely from an unrelated v6.7 swarm session — comment said "Wave A NousResearch#28 hygiene gate (dispatcher enforcement)"). Those lines called ``_enforce_kanban_complete_hygiene``, a function that doesn't exist anywhere in the codebase — it would NameError on every kanban_complete tool call. Caught by diff review before squash-merge. Removed. 137/137 tests still pass after removal. tools.kanban_tools imports cleanly. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Two precision fixes for the v6.7 completion gates surfaced by the 2026-06-10 validation chain on hermes-dashboard. Both touch `kanban_completion_gates.py` and ship together.
Closes hermes-jarvis#74 (honest-reject floor bypass)
Closes hermes-jarvis#75 (bullet not_applicable for evidence)
NousResearch#74 — honest-reject floor bypass
The 90s reviewer runtime floor was designed against rubber-stamp APPROVES. Validation chain showed it also blocked accurate fast rejects: Tony correctly identified 3 real bugs in 20-38 seconds with substantive verdict, gate rejected 6+ times.
Fix: `verify_runtime_floor` gains `is_honest_reject` kwarg. When True AND worker is in REVIEW_ROLES, floor bypassed. Build/orchestration roles unaffected — a friday 60-second "implementation" that ends in reject still warrants the 5-min floor (could be bailing on work, not real fast reject).
Verdict parsed once at top of `_v6_7_run_completion_gates` via existing `_v6_7_parse_verdict` and passed through.
NousResearch#75 — bullet `not_applicable: ` for evidence
Tony's 2026-06-10 verdict had `evidence:\n - not_applicable: no tests directory...` — honestly declaring no tests exist. Previous regex only accepted inline `evidence: none`; bullet form was rejected.
Fix: `_field_present` for test_quality.evidence accepts `- not_applicable: ` bullet with reason ≥8 chars. Same `code_change_context` rule — code-touching reviews still require real citations.
Test plan
Validation after merge
Tony's exact 2026-06-10 verdict shape will pass the gate on the first attempt. Rubber-stamp approve protection unchanged. Build-role floor unchanged.
🤖 Generated with Claude Code