|
|
@@ -5946,10 +5946,19 @@ def bundle_goals(ctx):
|
|
|
# Plan 15 C4: the completion-accept hard gate — the live probe
|
|
|
# flags still report repob's branch unpushed, so the operator's
|
|
|
# accept REFUSES with origin behind.
|
|
|
- act(auth, state["completion_pending_block"]["answer_action"],
|
|
|
- {"answer": "Review approved. Continue with the task."})
|
|
|
+ refusal = action_notify(act(auth, state["completion_pending_block"]["answer_action"],
|
|
|
+ {"answer": "Review approved. Continue with the task."}))
|
|
|
check(goal_state(goal1)["status"] == "completion_review",
|
|
|
"the accept REFUSES while origin is behind (hard gate, live flags)")
|
|
|
+ # One parser, one label: the gate's refusal names the SAME repo-
|
|
|
+ # qualified unpushed row the chips render — both surfaces read
|
|
|
+ # GoalService.parse_goal_branches (the gate-vs-chips divergence is
|
|
|
+ # structurally gone).
|
|
|
+ branches = {(b["branch"], b["pushed"]) for b in goal_state(goal1)["push_branches"]}
|
|
|
+ check("repob: goal/flange" in (refusal or "")
|
|
|
+ and ("repob: goal/flange", False) in branches
|
|
|
+ and ("repoa: goal/flange", True) in branches,
|
|
|
+ "the refusal and the chips read ONE parser (same labels, same flags)")
|
|
|
# Push the branch daemon-side and probe again — the flags flip
|
|
|
# live (no goal-row write), and the accept goes through.
|
|
|
fake.status_extra = {"goal_branches": [
|