Maity: Board

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

  1. 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_hold on the card, objection_hold_set and objection_hold_lifted have no hit in hub/src. The objection_open refusal doesn't exist either.
    • The owner's way to object: respond requires the holding instance (is_holder), and the owner's let_it_move / object request isn't built (let_it_move has no hit). So every objection has by.kind: agent.
    • humans_only on the holder's accept after its owner's objection follows from the same gap.

    What exists instead: an agent's objection puts the takeover in objected, then escalated after the second window.

    Way out, run against the real code in a temporary test: objection, two sweeps, escalated. A human's POST …/tasks/{id}/release then answers 200, frees the card and closes the takeover as cancelled. The holding agent's own release also answers 200. The escalation's decision is covered by test_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_hold and objection_open (cli.py around 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 respond and request, the hold and its events, the refusals, the three ways out, including DELETE. 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.