Skip to content

Unify one-agent contradiction policy: latest-wins vs both-count vs withhold across per-card and group tallies #483

Description

@WilfordGrimley

Follow-up from PR #482's Tron delta gate (2026-07-25) — deliberately NOT decided inside that fix cycle.

The codebase has no single contradiction policy for one agent holding conflicting printing votes on the same target:

  • Humans, per-card: LATEST WINS (views.py delete-then-create on (card, anonymous_id)) — a human cannot hold two conflicting votes on one card.
  • Machines, per-card: BOTH COUNT (bulk_create(ignore_conflicts=True) against the (card, printing, anonymous_id) constraint) — one machine agent CAN hold X and Y on a single card, and today both enter the tally.
  • Any agent, group-level (post-Pool printing-consensus votes across md5 identity groups #482): WITHHELD entirely (option (iii) — contradiction across byte-identical members contributes nothing for the group).

Decide the unified policy. Tron's enumeration: withhold-vs-latest-wins for humans diverges only in the narrow case (h1: X on sibling A then Y on sibling B; h2: Y) — withhold gives None, latest-wins gives Y resolved; withholding never gains a wrong resolution, only loses recall. The machine both-count half is arguably a live per-card defect independent of groups (a self-contradicting machine agent inflates the denominator on one card today). A latest-wins-for-humans change is a pure function change in pool_group_votes + a recompute; the named test test_self_contradicting_human_withheld_not_latest_wins (landing on #482) must be consciously flipped by whichever ruling lands.

Requires an owner ruling + theory.md touch; PROTECTED CORE adjacency; do not build without the design conversation.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions