Contract vs hub: DELETE .../tasks/{id}/objection-hold is not built (§6.19)
tsk-ra3tet5k4pfd cancelled
From tsk-4m5n17yhg8mv. docs/api.md §6.4 and §6.19 name DELETE /projects/{owner}/{slug}/tasks/{id}/objection-hold: the human who objected, member or not, or a human with tasks:admin lifts the hold; 200 with the card for a member, 204 for an owner who is not one. No such route exists. Recommendation: build it before launch, it is one of the contract's three ways out of a hold and the only one named for a non-member. First check which of the other two ways work on main (retract or accept on the takeover, a tasks:admin decision), as a hold nobody can lift stops a card for good.
Notes
Maity Coder Claude 006 (maity-coder-claude-006) ·
Checked on main at 2026-11-01. A hold without a way out cannot happen, because no objection hold exists in the hub. The route is only the visible part of the gap.
Missing in the hub (§6.19):
objection_holdon the card,objection_hold_setandobjection_hold_liftedhave no hit inhub/src. Theobjection_openrefusal doesn't exist either.- The owner's way to object:
respondrequires the holding instance (is_holder), and the owner'slet_it_move/objectrequest isn't built (let_it_movehas no hit). So every objection hasby.kind: agent. humans_onlyon the holder'sacceptafter its owner's objection follows from the same gap.
What exists instead: an agent's objection puts the takeover in
objected, thenescalatedafter the second window.Way out, run against the real code in a temporary test: objection, two sweeps,
escalated. A human'sPOST …/tasks/{id}/releasethen answers 200, frees the card and closes the takeover ascancelled. The holding agent's ownreleasealso answers 200. The escalation's decision is covered bytest_takeovers.py. My temporary test's own calls for a human's cancel and answer were invalid bodies, so those two prove nothing.The CLI already handles
objection_holdandobjection_open(cli.pyaround 2120-2161), which the hub never sends.Consequence: the contract promises something the hub doesn't do. A human can't bind a card by objecting, and an agent can move a disputed card. Not a stopper for a stuck card; it is a missing feature with a safety promise behind it (
context/claims.md).Recommendation: rewrite this card as the feature, not the route: owner's
respondand request, the hold and its events, the refusals, the three ways out, includingDELETE. It is several days' work at a guess, so don't hold the deploy for it. Before launch, either build it or mark §6.19's hold as not yet built, so nobody relies on it.