Auditing special-case workarounds
Audience: maintainers and implementers who are about to add a branch that makes a wrong input, a missing seam or a test double "just work".
A special-case workaround is a branch that tolerates something the code should have fixed or refused. It buys a green test and costs a second authority: the tolerated case behaves differently from the canonical path, the two drift, and the next change has to keep both working. Issue #6745 is the standing ticket for finding them; this page is the method it uses and the ledger it produced, so the next audit starts from a table instead of a keyword grep.
Is it a workaround? Ask the input question first
Before adding a branch, ask: is the input wrong, or is the code wrong?
| If… | Then the answer is | Not |
|---|---|---|
| the value cannot legitimately occur | refuse it where it enters, with a structured error | a warning plus "keep as given" |
| the caller cannot reach a private helper | publish the seam | a duplicated copy of the helper |
| only a test double needs the tolerance | fix the double | getattr(..., default) in production |
| the cause was fixed in a later mission | delete the compensation | keep it "just in case" |
| two modules must agree on one decision | call the one authority | a hand-synced second copy |
A tolerance that survives this table needs a comment naming the cause it tolerates and the issue that removes it.
The method
Six greppable heuristics, then classification. Time-box one pass per subsystem you are already touching (roughly twenty minutes each); this is a sweep, not a line-by-line review.
- Names and comments:
compensat,tolerat,workaround,fallback,legacy, "for now", "best-effort", "kept as written", "defensive", "belt and braces", "does not depend on a private". - Broad
exceptthat yields an empty value or a default instead of surfacing (in this repo:except Exception # noqa: BLE001). - A second construction of an object another module already builds — a copy kept alive because the original builder is private.
- Production code shaped by a test double:
getattr(..., default), duck-typedlen/in,try/except TypeErroraround a read. - Shrink-only allowlists and baselines still carrying entries whose cause is gone (see ADR 2026-09-30-1).
- Docstrings describing "residuals", "carve-outs" or a validator "elsewhere" that does not exist.
Then classify each finding — exactly one of:
| Classification | The fix | The tell |
|---|---|---|
| genuine constraint | keep it, and say in the comment what it protects | removing it breaks a documented contract or a real user's data |
| workaround for bad data | refuse or report the input where it enters | the tolerated value has no legitimate producer |
| workaround for a missing seam | add the seam, delete the branch or copy | the comment says the original is private |
| dead compensation | delete it | the cause it compensates for was removed in a merged mission |
The ledger from #6745 (2026-10-31)
S<n> ids are stable for follow-ups. Evidence paths are path:line at
origin/main dfe9efb0e8; the full write-up is the mission's research.md
§4.
| Id | Site | Classification | Disposition |
|---|---|---|---|
| S1 | src/charter/activation/resolver.py:216-224 (_gated) |
workaround for bad data | Left. An unknown activation token is logged and kept best-effort, then silently dropped by the filter. Refusing it is reachable from real org-pack content, so it needs an operator decision: #6527 (open, claimed). |
| S2 | src/charter/activation/org_charter.py:333-341 (_best_effort_offering_root) |
genuine constraint (weak) | Left. resolve_offering_root() owns its own fallback chain and returns a Path; the wrapper's swallow is the documented best-effort contract of three writers. Tightening it is a refusal change, tracked with S1. |
| S3 | src/specify_cli/lanes/worktree_allocator.py:1135-1142 |
genuine constraint (stale comment) | Left. Legacy missions without coordination_branch still exist in user repositories and need the mission_branch fallback; only the "WP08 will harden it" comment is stale. |
| S4 | src/charter/offering/drg/org_pack_config.py:649-651 (ensure_pack_identity) |
workaround for missing data | Left. The planned pack_id backfill owns it; the docstring at :196-206 says loading without a pack_id raises only once the pack_id-keyed readers land. |
| S5 | src/specify_cli/lanes/implement_support.py:602 (reenter_lane_self_heal) |
workaround for a missing seam | Left here (needs an allocator refactor, not a P0-audit PR): #6898. |
| S6 | 327 except Exception # noqa: BLE001 in src/ |
mixed — sampled, not reviewed | Sampled. The nine in src/charter/activation/context_renderers/ are genuine constraints: doctrine rendering degrades to a diagnostic instead of crashing a prompt build. The rest of the 327 are unreviewed and this audit does not claim them. |
| S7 | src/specify_cli/mission_loader/command.py:206-235 |
workaround for a missing seam | Removed in this PR. The loader kept a byte-identical copy of the runtime's DiscoveryContext builder because it was private (its own docstring said so), and mission up-org-template-fsm-01M06F9K then had to wire the org tier into both copies. One public builder now: runtime.next.runtime_bridge_io.build_discovery_context; a patch-point test proves mission run observes it. |
| S8 | src/runtime/next/runtime_bridge_composition.py:615-645 |
production shaped by a test double | Removed in this PR. getattr(result, "invocation_ids", ()), a len() except TypeError and getattr(result, "steps", ()) existed "so test mocks (MagicMock) and real instances both flow through cleanly"; the executor's result type always carries both. The read is direct, the tolerance-pinning test became a contract test, and a non-sized value now raises instead of logging emitted 0 invocation(s). |
| S9 | src/specify_cli/ownership/validation.py:150 |
workaround for bad data (phantom authority) | Left. continue # defensive: ignore cycles (validated elsewhere) names a validator that does not exist; the guard bounds the recursion, so the clean fix is to refuse a cyclic depends-on graph where it enters: #6899. |
| S10 | src/specify_cli/upgrade/autocommit.py:221-245 |
not a second authority | Left. should_auto_commit_for_worktree is a documented twin (D-10) of should_auto_commit; both are two-line wrappers over one get_auto_commit_default decision. Collapsing them is taste, not debt. |
The issue's worked example (the activation "keep the id as given, with a
warning" family, mission activate-output-and-identity-01M5ZA9X) is not in
the table because it already landed: PR #6748 made
IdentityIndex.stored_spelling the one spelling authority and removed the
hand-rolled variants. Do not re-litigate it.
What this audit did not cover
- The 318 unsampled
BLE001sites. S6 is a sample of one subsystem. A second pass should take one package per session and record a row per hit. - Refusal changes. S1, S2 and S9 all convert a silent tolerance into a refusal, which is a behaviour change for existing pack and mission content. They are child issues, not this PR.
- The process guard. The proposal — a reviewer checklist line, a "workaround"
lens for the adversarial squad, and a naming rule for tolerated paths — is
#6900, filed for the
operator to accept or reject. It is deliberately not in
packs/built-in/: that pack ships to every consumer, and this is in-house review practice.
Related
- Issue: #6745
- Child issues: #6527, #6898, #6899, #6900
- Review gates: pre-PR / pre-review checklist
- Quality & Tech-Debt Standing Orders