okstra 0.165.1 → 0.165.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "okstra",
3
- "version": "0.165.1",
3
+ "version": "0.165.2",
4
4
  "description": "Host-aware multi-provider cross-verification orchestrator runtime and agent skills.",
5
5
  "license": "MIT",
6
6
  "author": "devonshin",
@@ -1,5 +1,5 @@
1
1
  {
2
- "package": "0.165.1",
3
- "builtAt": "2026-08-11T05:10:33.192Z",
2
+ "package": "0.165.2",
3
+ "builtAt": "2026-08-11T05:13:20.960Z",
4
4
  "repoRoot": "/home/runner/work/okstra/okstra"
5
5
  }
@@ -3983,6 +3983,29 @@ def _validate_gate_blocked_by(data: dict, failures: list[str]) -> None:
3983
3983
  )
3984
3984
  return
3985
3985
 
3986
+ if not actual_causes and _PLAN_GATE_RANK.get(declared_gate) == 0:
3987
+ # A blocking value with nothing left blocking it. The two checks around
3988
+ # this one both walk from a recorded cause outward, so a gate that
3989
+ # simply stopped being updated fell between them: a self-fix loop
3990
+ # resolved every majority-disagree item, `gateBlockedBy` emptied
3991
+ # correctly, and the gate token stayed at its round-1 value. The plan
3992
+ # was approvable and nothing said so — run-prep refused the approval,
3993
+ # and the refusal propagated far enough to take the run wizard down
3994
+ # with it, so no run could be started in that project at all. Rescoring
3995
+ # with `okstra plan-verify` and recording what it returns is the fix;
3996
+ # the round is not complete until that call agrees with the report.
3997
+ failures.append(
3998
+ "final-report data.json: implementationPlanning.planBodyVerification "
3999
+ f"`gateResult` is `{declared_gate}` but nothing blocks approval — "
4000
+ "no plan item is `majority-disagree`, no dispatch was a non-result, "
4001
+ "and no Requirement Coverage row blocks independently. A gate that "
4002
+ "withholds approval with no recorded cause is almost always a value "
4003
+ "left behind by an earlier round: rescore with `okstra plan-verify` "
4004
+ "and record its `gate.recomputed` "
4005
+ '(plan-body-verification.md §"Round protocol" step 5).'
4006
+ )
4007
+ return
4008
+
3986
4009
  if declared_causes != actual_causes:
3987
4010
  failures.append(
3988
4011
  "final-report data.json: implementationPlanning.planBodyVerification "