Skip to content

Umbrella: canonical-source duplication — concepts with no single definition, where the copies have already drifted #13916

Description

@mrveiss

Summary

Five findings that share one cause: a concept has no single authoritative definition, so subsystems each
keep their own copy, and the copies drift.
Every one was discovered the same way — someone needed a list
that already existed elsewhere and had nothing telling them so.

This is not a tidiness umbrella. Each item has already produced a production defect or made one
undiagnosable.

The pattern, stated once

A canonical source exists (or should), a second copy is written in good faith, nothing compares them, and
the divergence surfaces months later as a bug in an unrelated subsystem. #13512 is the worked example: the
audio-extension allowlist existed in three modules, one of them a security boundary, and the copies had
already drifted apart before anyone looked.

Task tree

Wave 1 — copies that already disagree (a live divergence, not a latent one)

Wave 2 — canonical source exists and is not used

Wave 3 — no canonical source has been chosen yet

Reference — the worked example

Acceptance criteria

The umbrella closes when every child closes and these hold — none is owned by an individual child:

  1. Every consolidation lands with a guard test, in the shape of audio_extension_allowlist_test.py:
    a test that fails when a new duplicate of the canonical definition appears. Without it the count regrows —
    refactor(types): consolidate 15+ Severity/RiskLevel/Level enums onto constants/status_enums.py:Severity #6689 consolidated 15+ severity enums and 15 more exist today, which is the proof.
  2. Deliberate exceptions are recorded, not omitted. Where a copy is kept on purpose (a domain-specific
    scale, a genuinely distinct concept sharing a noun), the guard test names it and says why. Capability
    is defined in four places with different members and should stay that way; that belongs written down.
  3. No consolidation silently changes behaviour. Where copies differ (security(media): audio-extension allowlist has already drifted — knowledge ingestion accepts .mkv the upload boundary rejects, audio connector omits .mp4/.webm #13615), reconciling them alters
    what the system accepts or rejects — that is an owner decision recorded on the issue before the change,
    not a side effect of a refactor.
  4. The canonical source is discoverable from the copy site. A developer who needs the list must be able
    to find it without knowing it exists — the reason every one of these was written twice.

Deliberately excluded

Why grouped

Individually each reads as tech debt and gets deprioritised. Together they are one structural gap with a
measurable cost already paid: a security boundary that drifted (#13512/#13615), a week of stale workers
(#13539 via #13915), and a severity consolidation that regrew to 15 duplicates after being "finished"
(#6689 → #13597).

Activity

  1. mrveiss commented on Aug 12, 2026

    @mrveiss
    OwnerAuthor

    New child finding: #14194 — the agent roster is hardcoded in both .claude/agents/*.md and AGENT_TIER_MAP in autobot-backend/agent_tier_classifier.py, drifted 3 agents one way and 9 the other. Fits this umbrella's pattern exactly, including the guard-test requirement (#6689 regrew to 15 without one).

  2. mrveiss commented on Aug 18, 2026

    @mrveiss
    OwnerAuthor

    Filed #14584: the health_collector_state_change_test.py / ansible-mirror pair drifted silently (caught by accident in PR #14576, closing #14535/#14538) and has no guard test — same shape as this umbrella's wave items. Not added as a formal child task here since it's a single small file pair, but linking for visibility.

  3. mrveiss commented on Aug 19, 2026

    @mrveiss
    OwnerAuthor

    Another instance of this pattern, found while closing #14586: four hand-maintained lists of "every MCP bridge" that can drift independently — #14631.

  4. added
    area: canonical-enumsWave 2 · cluster T — Canonical enums & duplication
    umbrellaEpic/umbrella tracking issue grouping member issues
    on Sep 1, 2026
  5. 19 remaining items

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions