Skip to content

ci(sonar): declare the qualified 3.13 and 3.14 interpreters to the analyzer - #1160

Open
doublewhy wants to merge 8 commits into
devfrom
fix/sonar-python-versions
Open

ci(sonar): declare the qualified 3.13 and 3.14 interpreters to the analyzer#1160
doublewhy wants to merge 8 commits into
devfrom
fix/sonar-python-versions

Conversation

@doublewhy

@doublewhy doublewhy commented Aug 14, 2026

Copy link
Copy Markdown

Plain-language summary

  • Context: CI qualifies CPython 3.11 through 3.14, while Sonar declared only 3.11 and 3.12.
  • Problem: The analyzer configuration did not reflect the supported interpreter matrix.
  • Fix: Declare Python 3.11 through 3.14 and update the governed identity digest for the resulting properties file.

Issue tracking

No issue: this is a narrow analyzer-configuration alignment.

Verification

  • Identity-cutover policy: passed.
  • Repository policy: passed.
  • Requirement governance: passed.
  • Targeted identity-policy tests: 46 passed.

Notes for review

The next dev branch analysis may report version-sensitive findings on existing code.

doublewhy and others added 7 commits August 14, 2026 14:25
The dev branch sonar job has been red since tools/ became a Sonar source
root (#54) under the raes-strict gate (#527): branch analysis reports 215
new-code violations while PR analysis only scans changed lines. This slice
removes every mechanical violation in tools/ and exempts the three false
positives driving the security rating.

Code fixes, all behavior-preserving (each checker emits identical output
and exit status on this repo before and after):

- parameterize bare generic annotations (S6543/S6538/S6540/S6542),
  using dict[str, object] for parsed JSON/YAML payloads
- extract duplicated string literals into module constants (S1192),
  following the existing _SEMANTIC/_DANGLING idiom in the parity checker
- drop exception classes already covered by a caught base class (S5713):
  HTTPError/URLError/TimeoutError under OSError, JSONDecodeError under
  ValueError
- classify markdown link targets by scheme prefix (http:) instead of
  protocol literal (S5332), and collapse chained startswith calls (S8513)
- make _is_sequence a TypeGuard so flow analysis understands the
  iteration that follows it (S5864)
- restructure nested conditional expressions (S3358), remove a dead
  if/pass wrapper (S108), drop an unused unpack target (S1481) and an
  unused parameter (S1172), move trailing comments (S139), use a dict
  literal (S7498), fix noqa comment syntax (S7632), and wrap two
  overlong lines

sonar-project.properties exemptions, each with recorded justification:

- e6: S5443 on tools/isabelle_tool.py - the /tmp literal is a private
  bubblewrap tmpfs target inside the proof sandbox
- e7: S1309 - the repo lint contract requires justified noqa
  suppressions, so tracking each as a violation conflicts with policy
- e8: S1313 on tools/real-daemon/ - authored RFC-1918 lab addresses in
  the hardware smoke scenario

Closes #1152

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The first commit's cosmetic edits to tools/isabelle_tool.py invalidated the
participant-opacity proof evidence manifest, which digest-pins that file's
exact bytes, and the sonar-project.properties edit invalidated the
identity-cutover registry's classified content digest.

- revert tools/isabelle_tool.py to its pinned bytes and exempt its two
  residual style findings in sonar-project.properties instead (e9: S5713,
  e10: S7632), with the pin recorded as justification
- reclassify sonar-project.properties in
  tools/policy/historical_identity_records.json with its new content
  digest; the retained retired-identity occurrence count is unchanged

Verification: nox -s tests green (includes the opacity-proof and
identity-cutover policy suites), tools/check_repo_policy.py pass.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… packages

The three checkers that predate the 500-line policy carried the remaining
structural Sonar violations on dev (S104 file length, S138 function
length, cyclomatic/cognitive complexity up to 70/66, S1142 return counts,
S107 parameter counts). Each is now an import-stable entry point over a
support package of focused modules, all under the 500-line cap:

- tools/check_sdl_catalog_parity.py (2,039 lines) ->
  tools/sdl_catalog_parity/ (paths, expectation registry split at section
  boundaries with a merged-registry overlap guard, table rows, expected
  classifications, typed-model traversal, checks)
- tools/check_specification_coverage.py (1,640 lines) ->
  tools/specification_coverage/ (keys, primitives, protocol, concepts,
  artifacts, snapshot, analysis)
- tools/check_formal_semantic_validation.py (3,121 lines) ->
  tools/formal_semantic_validation/ (types, shape, replay, claims,
  protocol, corpus, snapshot, analysis, loading, releases, baseline,
  retest, production, satisfiability, supplement loading)

Mega-functions are decomposed into single-responsibility helpers under
the thresholds (complexity <= 10, <= 100 lines, <= 3 returns, <= 7
parameters); the two 8-parameter snapshot validators now take frozen
scope dataclasses. Pure restructuring: no validation rule changes.

Test updates: the three monkeypatch sites that patched replay_case,
load_bounded_json_object, and subprocess.run through the old monolithic
module now patch the consumer modules, preserving what each test proves
(the no-replay-of-historical-evidence guarantee now pins both consumer
modules).

Verification: each checker produces identical output and exit status on
this repo before and after (the formal checker's full offline integrity
and replay pass included); nox -s tests green (7,005+ tests incl. the
80-test formal-validation suite and 25-test parity suite); ruff format
and lint clean; tools/check_repo_policy.py pass.

Closes #1154

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
tools/real-daemon/ scripts run only against a real libvirtd/QEMU host,
so the hermetic CI coverage report can never execute their lines; the
mechanical type-hint edits there were dragging new-code coverage below
the 80% gate. Exclude the directory from coverage measurement only (it
stays fully analyzed for issues) and reclassify the properties file's
identity digest.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The PR quality-gate scan counted 22 residual findings on the new
support-package code (Sonar's complexity counter is stricter than the
hand-estimates, moved-but-unchanged functions count as new code, and
its flow analysis does not honor TypeGuard narrowing):

- inline the sequence isinstance-narrowing where iteration follows a
  guard (S5864), and annotate Sequence parameters where callers
  already guarantee it
- decompose the remaining over-threshold functions: markdown table
  parsing, internal-link scanning, model-field alias walking, field
  classification, source/request/concept entry checks, stage outcome
  vs classification coupling, occurrence entries, corpus polarity
  coverage, the retest observation sweep, and the satisfiability head
- parameterize the last bare list annotations (S6543) and reduce
  _pointer_step to three exits (S1142)
- split prose-level checks out of sdl_catalog_parity._checks to stay
  under the 500-line cap

All three checkers still emit byte-identical output on this repo;
nox -s tests and check_repo_policy pass; ruff clean.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sonar counts the eight-term snapshot-binding or-chain and the
concept-results sweep loop above the complexity threshold; hoist the
binding predicate and the sweep into named helpers. Checker output
remains byte-identical; tests and policy pass.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…alyzer

sonar.python.version still said 3.11-3.12 after CI qualified CPython
3.13 and 3.14 (#1134), so the strictest gate analyzed the code with
3.12-era rules. Declare the full supported range; the 3.11 floor keeps
newer-syntax suggestions gated on the lint contract. The properties
file's identity digest is reclassified accordingly.

Note for the merge: the next dev branch scan may surface findings the
newer-interpreter rules detect on existing code; they would appear on
the dev analysis, not on this PR's changed-line scan.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Base automatically changed from 1152-sonar-mechanical-exemptions to dev August 19, 2026 16:08
# Conflicts:
#	tools/policy/historical_identity_records.json
@Brad-Edwards

Copy link
Copy Markdown
Collaborator

Merged current dev, preserved its Sonar coverage configuration, and updated the identity-policy digest for the resulting sonar-project.properties. This keeps the PR scoped to the Python 3.11–3.14 analyzer declaration. Identity-cutover and repository-policy checks pass; the targeted identity-policy suite reports 46 passed.

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants