Skip to content

Mechanized meta-verification layer — every verifier negative-controlled + type-safe#115

Merged
neuron7xLab merged 23 commits into
mainfrom
harden/meta-verification-layer
Jul 1, 2026
Merged

Mechanized meta-verification layer — every verifier negative-controlled + type-safe#115
neuron7xLab merged 23 commits into
mainfrom
harden/meta-verification-layer

Conversation

@neuron7xLab

@neuron7xLab neuron7xLab commented Jul 1, 2026

Copy link
Copy Markdown
Owner

Thesis

The instrument audit found a gate-heavy substrate whose gates' own soundness was unproven (2 facades). This PR mechanizes who verifies the verifiers? and closes it: every discoverable gate is a proven instrument, and type-safety is now actually enforced (merged from the strict-type work). Full row-by-row map: docs/VERIFICATION_MATRIX.md.

Status (a consequence of falsification, not decoration)

  • gate_soundness: 46 / 46 proven / 0 unproven. Every gate ships an executable negative control — a test that feeds it a known-bad input and asserts it FAILS. "Proven" = the control resolves to a top-level pytest function AND its file references the gate module (static linkage); behavioral proof runs in test-py*.
  • Type-safety enforced: [tool.mypy] strict over src/bsff (0 errors); the quality dashboard runs with mypy (composite PASS, not PASS_INCOMPLETE), and skipping it is surfaced as SKIPPED, never a silent green.
  • Evidence upload fail-closed (if-no-files-found: error).
  • claim↔evidence complete (unbacked = hard FAIL; evidence must be a non-empty file).

Gate dimensions

gate_soundness · lint_fail_open (fail-closed, incl. src) · claim_coverage · determinism_probe (env-isolated, source-pure only) · complexity_gate (closures scored, stale/inflated allowlist fail) · intent_contract (chaos→definition edge) · quality_dashboard (composite) — each negative-controlled; the 30 legacy gates negative-controlled in tests/test_gate_negatives_*.py.

Adversarial hardening

An internal red-team fleet attacked every gate and found zero fabrication but ~15 real under-scoping holes (closure complexity, EXIT_SUCCESS fail-open, phantom evidence, env-dependent determinism, decorative nodeids). All fixed with negative controls; undecidable residuals documented in Known limitations (no overclaim).

Built as red-team → fix → debt-reduction agent fleets + integration. All CI green (matrix, hermetic/offline, release-dry-run, adversarial, mutation-kill, security).

🤖 Generated with Claude Code

neuron7xLab and others added 4 commits July 1, 2026 13:30
…> 0)

The repo had NO mypy gate at all (no config, not in CI) — so 97 strict-mode
type errors across 21 files had never been caught. This adds the gate and
brings src/bsff to zero.

- pyproject.toml: [tool.mypy] strict=true, files=src/bsff, with per-module
  ignore_missing_imports for genuinely stubless third-party libs (moabb, scipy,
  sklearn, statsmodels, pingouin, pandas_flavor, mne) — a library gap, silenced
  per-module, not globally.
- .github/workflows/ci.yml: `python -m mypy` added to the lint job, so the type
  gate is enforced on every PR, not a one-off cleanup.
- 19 src files: real type annotations only. Untyped functions typed; bare
  generics filled (dict -> dict[str,X]); no-any-return fixed with concrete
  return types; object->concrete narrowing done via TypedDicts + a single
  boundary cast per call site (the repo's own idiom), never per-use casts.
  Numpy arrays typed NDArray[np.float64]. Literal mismatches narrowed properly.

Discipline: ZERO new `# type: ignore`, no Any-widening where a concrete type
fits. Annotations/typing only — no runtime-behavior change. Full fast test
suite green (0 failures), ruff check + format clean, mypy --strict: 0 issues
across 50 files.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
CI lint runner (Python 3.12 + latest numpy) ships stubs using `type X = ...`
(PEP 695), which mypy rejects under python_version=3.10. Pinned to 3.12 to match
the lint runner; runtime floor stays 3.10 via ruff target-version + the
3.10-3.13 test matrix. Reproduced locally with numpy 2.4.3: mypy 0/50.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…yaml stubs in CI

CI (py3.12 + latest numpy) surfaced 3 mypy errors local did not: datasets.py
no-any-return (numpy typed the returned array as Any under the CI dep set — fixed
with an explicit FloatArray return bind, deterministic across environments), and
two Library-stubs-not-installed for jsonschema/yaml (added types-jsonschema +
types-PyYAML to the CI mypy install; real stubs, not ignore).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…the verifiers

Systems-through-computation answer to the audit's core finding: the project is a
gate-heavy verification substrate whose gates' own soundness was unproven (2
facades + recurring fail-open patterns were found). This adds a layer that proves
structural integrity by computation, not self-assertion.

1. gate_soundness.py — every gate must have a registered negative control proving
   it FAILS on bad input. Finding: of 34 gate tools, only 9 are proven; 25 are
   honest frozen debt (ratchet: new gates must ship a negative control).
2. lint_fail_open.py — AST detector for fail-OPEN gate code (except->return PASS,
   unfailable gates). 6 findings, all genuine regenerators, allowlisted; src clean.
3. claim_coverage.py — claim<->evidence bipartite completeness: 4 claims, 7 bound
   artifacts, 0 orphans, 0 dangling ids, 0 missing evidence files.
4. determinism_probe.py — proves 7 artifacts byte-reproducible (run-twice
   identical); restores the tree, never dirties it.
5. complexity_gate.py — CC<=15 ratchet; decomposed proof_gate.evaluate 39->5
   (grade E->A) as a pure refactor (report byte-identical, all tests pass).
6. ingest.py security — defusedxml (XXE) + https-only URL allowlist (SSRF):
   bandit 2 MEDIUM -> 0 on that file.
7. quality_dashboard.py — one canonical verdict aggregating all dimensions via
   each gate's authoritative --check; composite PASS only if every dimension PASS.

All 7 wired into CI. +53 tests (749->802), each gate negative-controlled. Full
fast suite 0 failures, ruff check+format clean, tree byte-stable.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: e15d51b7b6

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread tools/gate_soundness.py Outdated
Comment thread tools/quality_dashboard.py Outdated
Comment thread tools/complexity_gate.py
neuron7xLab and others added 8 commits July 1, 2026 15:17
Adding defusedxml (runtime, XXE fix) and radon (dev, complexity gate) to
pyproject broke the hash-pinned hermetic/offline/wheel jobs (ModuleNotFoundError:
defusedxml — not in requirements/*.lock) and the SBOM/artifact-hash jobs
(generate_sbom PackageNotFoundError — defusedxml declared but absent from the
installed closure the SBOM enumerates).

- Relocked all four requirements/*.lock via the sanctioned pip-compile recipe
  (existing pins preserved; only the new deps + transitives added, +75/-5).
  Verified every pinned package carries hashes (--require-hashes safe).
- Regenerated the committed SBOM after refreshing bsff's editable metadata so
  defusedxml enters the runtime closure: 9 -> 10 components, --check PASS.

Root reproduced locally (stale editable metadata masked it): reinstall -e . made
the SBOM enumerate defusedxml exactly as CI does.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
release-gate-dry-run runs uv with --locked, which rejected the stale uv.lock
after defusedxml/radon entered pyproject. Ran uv lock: +defusedxml, +radon,
+mando (radon's dep). The one other red (test-py3.12) was cancelled, not failed
— collateral of the release-gate failure; a fresh run re-runs it green.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… timeout)

The 6 structural/meta gates added to the per-version test matrix pushed
test-py3.12 to 10m16s > the 10-minute budget -> canceled (not a code failure;
quality_dashboard was the final step, all gates PASS). They are
Python-version-independent, so they now run once in a dedicated meta-verification
job (12-min budget) instead of x4 in the matrix, which restores the test legs
well under budget.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…face

Regeneration fixpoint flagged adversarial_validation STALE: the 7 new
meta-verification tools + tests changed the certificate_root hash over the
tool/test surface. Regenerated to fixpoint (1 pass) — legitimate, not drift.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…age error

Dogfood catch: the quality dashboard reported type_safety=PASS vacuously. mypy
with no [tool.mypy] config (as on this branch) exits 2 with 'Missing target'
on STDERR; _mypy_dimension counted only STDOUT error lines -> 0 -> fabricated
PASS. This is exactly the fail-open the whole layer exists to hunt — in our own
monitor. Now PASS requires mypy returncode 0 (it actually ran clean); a
usage/config/fatal exit is FAIL. Added a negative-control test. On this branch
type_safety now honestly reads FAIL (the mypy config lands with the strict-type
PR); CI runs --no-mypy so the 5 structural dimensions still gate green.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…controlled

Review follow-up on the meta-verification layer:

1. gate_soundness discovery now includes the meta-verification layer itself
   (_gate/_probe suffixes + lint_fail_open/claim_coverage/quality_dashboard), so
   its own gates sit INSIDE the soundness surface instead of auditing from
   outside it. Surface grew 34->43 gates; the 5 new meta-gates are registered
   proven (real negative-control nodeids), and 4 newly-surfaced pre-existing
   gates (decision_gate, mutation_kill_gate, mutation_probe, run_replayability)
   are frozen as honest debt: 14 proven / 29 unproven — a truer map than 9/25.
2. claim_coverage: unbacked_claims is now a hard FAIL, not advisory — an
   asserted claim with no manifest-bound artifact is a hole in the bipartite
   graph, closed like dangling/missing/orphan.
3. complexity_gate: stale-allowlist expiry — an allowlisted target that dropped
   to/below the ceiling (or was deleted) now FAILs, forcing cleanup so the
   ratchet cannot rot. Print made resilient to entries without a live CC.
4. ingest SSRF: host allowlist (export.arxiv.org/arxiv.org) on top of https —
   https alone still permitted internal endpoints (169.254.169.254, intranet).

Each new hard-fail ships a negative control: test_unbacked_asserted_claim_fails,
test_stale_allowlist_entry_fails, test_non_arxiv_host_rejected. All gates green,
fixpoint reached, ruff clean. 802->806.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The gate_soundness/claim/complexity edits changed the tool surface -> the
adversarial_validation + decision certificate_root updated. Committing so the
regeneration fixpoint gate sees committed == regenerated (prior push left
decision.json stale on the fixpoint surface).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…t a bug)

test-py3.12 ran 10m05s and was canceled at the 10-minute limit — the unit suite
plus the full post-test validator battery plus coverage is intrinsically ~10min
on the slowest interpreter, and the +4 hardening tests tipped it over. The
meta-gates already moved to their own job, so this is a genuine budget shortfall,
not a code failure. 15 min gives headroom; slow-tests already uses 20.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

@neuron7xLab neuron7xLab left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Curator review: the PR is stronger after the latest commits, but it is not yet fully verified against its own specification.

  1. PR body drift: it still claims 34/9/25 gates, while the implementation/review notes now describe 43/14/29.
  2. The dashboard is called canonical, but CI runs it with --no-mypy, so type-safety is excluded from the CI composite.
  3. lint_fail_open.py supports --include-src, but CI does not use it while the PR claims src clean.
  4. gate_soundness discovery is still heuristic/manual; CI-declared gate parity should be enforced.
  5. _is_proven() checks that a test file exists, not that the full pytest nodeid exists/runs or is truly negative-controlled.
  6. determinism_probe.py records committed_match but does not fail on stale deterministic committed artifacts.
  7. The PR lacks a final verification matrix mapping dimension -> spec claim -> tool -> negative control -> CI job -> artifact/report -> failure mode.

Required before merge: update the PR body to current facts, enforce CI/gate parity, run or clearly scope the full dashboard, decide committed-byte drift policy, and add the verification matrix.

…ft, src-enforced, matrix

Deep-verification follow-up (spec↔enforcement drift):

5. gate_soundness: "proven" now requires the negative-control nodeid to resolve
   to an actually-DEFINED test function (AST), not merely an existing file — a
   decorative nodeid naming a ghost function no longer counts. Negative control:
   test_registry_entry_with_missing_function_is_not_proven.
6. determinism_probe: committed↔regenerated mismatch is now a hard FAIL (new
   `stale` list), not advisory. A byte-reproducible-but-stale artifact is a
   broken proof for artifact-bound verification. Negative control:
   test_stale_committed_artifact_is_flagged.
4. CI now runs lint_fail_open with --include-src, so "src is fail-closed" is a
   CI-ENFORCED fact (src has zero findings; the 6 allowlisted are tools/
   regenerators), not a manual claim.
7. docs/VERIFICATION_MATRIX.md: one row per dimension (spec claim -> surface ->
   gate -> negative-control nodeid -> CI job -> report -> failure mode) with an
   explicit scope-boundaries section, so a reader trusts the gate, not the prose.

All gates green, fixpoint reached, ruff clean. 806->808.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@neuron7xLab neuron7xLab changed the title Mechanized meta-verification layer — 7 gates that verify the verifiers Mechanized meta-verification layer — gates that verify the verifiers Jul 1, 2026
neuron7xLab and others added 8 commits July 1, 2026 19:44
The meta-verification layer proved implementation↔spec. Nothing verified
intent↔spec: the human→spec translation was a fluent, unverified guess, so the
gates could faithfully verify a correctly-built WRONG thing. This closes that
first edge.

- tools/intent_contract.py: every asserted verification intent must be
  FALSIFIABLE (bound to a gate + a negative-control nodeid that resolves to a
  real AST-defined test), RATIFIED (explicit ratified_by + status=ratified), and
  BOUND (the gate file exists). Unratified/unbound/ghost-control intents fail
  closed. This transfers the trust point from the tool's fluency to the
  operator's ratification.
- intents/registry.json: 8 ratified intent contracts, one per verification
  dimension incl. INTENT-MEANING-CLOSURE (the gate dogfoods itself).
- Wired: gate_soundness surface (44 gates / 15 proven), quality_dashboard
  dimension (intent_closure), CI meta-verification job, VERIFICATION_MATRIX row 0.
- 6 tests incl. negative controls (unratified / ghost-control / missing-gate /
  empty-registry all FAIL). 808→814. All gates green, ruff clean.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… root

An internal red-team fleet attacked every gate. Zero fabrication (no gate fakes
a PASS), but real under-scoping/overclaim. Definitive fixes + honest scoping:

- CI ROOT (was red): determinism_probe registered generate_sbom + a numeric null
  whose output is ENVIRONMENT-dependent (installed dep closure / numpy float
  version), so committed != regenerated in CI -> stale FAIL, which cascaded to
  test-py/hermetic/release/adversarial (all fail the same non-slow pytest).
  Registry is now SOURCE-PURE only (manifest, proof-report, schemas, scorecard,
  redteam); env-dependent artifacts keep their own same-env --check gates. The
  whole-tree hermeticity test is @slow. determinism_probe.py --check: PASS.
- lint_fail_open: Bug7 (exit(1)==True), except sys.exit(0), dead-decoy hatches,
  return EXIT_SUCCESS constant now flagged; undecidable shapes documented.
- complexity_gate: nested-closure complexity now scored (ratchet bypass closed);
  inflated allowlist entries fail.
- claim_coverage: asserted-status predicate inverted (fail-closed on unknown);
  evidence + manifest backing must be existing NON-EMPTY files.
- determinism_probe: undeclared sibling writes detected + restored (hermeticity).
- gate_soundness + intent_contract: nodeid resolves TOP-LEVEL only (no nested
  def) + test must reference the gate module (linkage); CI-enforcing gates added
  to the audited surface (46 gates / 15 proven / 31 unproven).
- docs/VERIFICATION_MATRIX.md: KNOWN LIMITATIONS section — undecidable/heuristic
  blind spots documented, not overclaimed.

Every new hard-fail ships a negative control. 814->833. All gates green, full
fast suite 0 failures, ruff clean.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ne red)

Root of the hermetic-offline failure: generate_redteam_matrix imports numpy +
bsff.pipeline, so its committed bytes drift under the hermetic lock's dependency
versions (float/pipeline output is env-dependent) -> stale -> determinism FAIL,
which failed test_dashboard_composite_passes_on_real_repo under --disable-network.

Environment isolation is now the hard invariant: a registered generator's output
must be a pure function of the COMMITTED SOURCE BYTES, independent of any
installed library version. Registry reduced to the provably env-invariant,
stdlib/hash-pure set (generate_manifest, statistical_proof_gate, export_schemas,
compute_scorecard) — zero numpy/scipy/pipeline. SBOM (dep closure) and numeric
nulls (numpy floats) stay excluded with their own same-env --check gates.

determinism_probe.py --check PASS; determinism + dashboard tests green.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…sed evidence upload

Per elite-review order:
- quality_dashboard: --no-mypy no longer reads as a clean PASS. The type_safety
  dimension is surfaced as SKIPPED, the composite becomes PASS_INCOMPLETE, and the
  CLI prints 'NOT a clean PASS — skipped (ungated) dimensions'. A new --strict
  makes PASS_INCOMPLETE exit 1 (blocking) for callers that require full coverage.
  (Full mypy enforcement on this branch needs the strict-type PR's config; until
  then the skip is honest and visible, not silent green.)
- ci.yml: evidence artifact upload is if-no-files-found: error (fail-closed) —
  a missing evidence artifact fails the job instead of a warning.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…bt 31 -> 1

Directly answers the "31 unproven gate debt" blocker. A 4-agent fleet wrote an
executable negative control for every discoverable gate: a test that feeds the
gate a KNOWN-BAD input and asserts it FAILS (non-zero / status FAIL). Registered
30 as proven (gate_soundness: 15 -> 45 proven of 46); the ratchet gate PASSes.

Coverage by batch (each nodeid resolves top-level + statically references its
gate module, per gate_soundness's linkage check):
- statistics (8): power_profile, statistical_claims, statistical_proof_gate,
  surrogate_fidelity, cluster_robust_specificity, analytic_uniformity_null,
  null_registry, threshold_registry.
- contracts (8): architecture_contract, forbidden_claims, r6_contracts,
  openai_2026_eval_contract, check_contracts, validation_corpus,
  mutation_report, decision_gate.
- provenance (7): ip_provenance, provenance, lockfiles, release_notes,
  open_source_readiness, tisean_reference, github_actions_policy.
- verify/mutation (7): mutation_kill_gate, mutation_probe, run_replayability_gate,
  verify_all, verify_controls, verify_honesty, verify_branch_protection.

The one remaining unproven gate — validate_wheel_runtime — is RESISTANT offline
(builds a real wheel + pip-installs from an index; no smallest-known-bad input
fails it without faking the run) and is documented with an explicit rationale,
its behavioral proof delegated to the build-package CI job. Honest debt, not
faked proof. 834 -> 864.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…test gate)

test_suite_integrity forbids skip/xfail on core tests (good discipline). The
provenance batch left a @pytest.mark.skip stub for the RESISTANT
validate_wheel_runtime gate, tripping that gate in hermetic/offline/py313.
Removed the stub entirely — wheel_runtime stays honest unproven debt in
gate_soundness_registry.json (with rationale), behavioral proof delegated to the
build-package CI job. No skipped tests remain in the negative-control suite.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The last unproven gate now has an executable negative control: stubbing the
build subprocess so no wheel is produced, the gate must detect the missing
wheel and return 1 (its PASS/FAIL decision-logic under test; the real-build
behavioral proof stays the build-package CI job). gate_soundness: 46/46 proven,
ZERO unproven. Every discoverable gate is now a proven instrument.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…den/meta-verification-layer

# Conflicts:
#	src/bsff/adjudication/ingest.py
#	src/bsff/statistics/proof_gate.py
@neuron7xLab neuron7xLab changed the title Mechanized meta-verification layer — gates that verify the verifiers Mechanized meta-verification layer — every verifier negative-controlled + type-safe Jul 1, 2026
…rd PASS, not INCOMPLETE

Closes the type-safety blockers by actually introducing mypy, not deferring it:
- Merged the strict-type branch: [tool.mypy] strict over src/bsff, python_version
  3.12, stubless-lib overrides (+defusedxml). The lint job runs `python -m mypy`.
- Resolved the merge: kept the decomposed proof_gate.evaluate (CC 39->5) and
  re-typed it to mypy --strict 0 (pure typing, report byte-identical, tests
  green); combined the SSRF nosec guard with the typed urlopen return in ingest.
- src/bsff: mypy --strict Success, 0 errors / 50 files.
- meta-verification job installs mypy and runs `quality_dashboard.py --check`
  WITHOUT --no-mypy, so the type_safety dimension is real and the composite is
  PASS (not PASS_INCOMPLETE). --no-mypy stays for fast local runs and honestly
  reports SKIPPED, never silent green.
- VERIFICATION_MATRIX: row 9 type-safety now CI-enforced.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Comment thread src/bsff/pipeline.py Fixed

Copy link
Copy Markdown
Owner Author

Інтерпретація технічної архітектури через призму психоаналізу є категоріальною помилкою. Питання екзистенційної свободи автора не мають жодного відношення до прагматичної верифікації коду. Впровадження політики fail-closed у DCD Gate Audit зумовлене суто об'єктивною асиметрією критичних операційних ризиків у бізнесі. Стійкість перед prompt injection чи витоком даних визначається детермінованим алгоритмом, а не людською мотивацією. Інженерія функціонує незалежно від гуманітарного контексту. Процес або повністю проходить встановлені гейти безпеки, або блокується. Будь-які інші філософські трактування є нефальсифікованим й абсолютно зайвим інформаційним шумом.

Copy link
Copy Markdown
Owner Author
GitHub check Status
PR #115 open
mergeable
latest head b9e94d5c93af60d87141dd7d5dee71e4e9b13adf
title updated
PR body updated ✅ claims 46/46 proven / 0 unproven
commits 17
changed files 45
additions/deletions +4885 / −99
CI Observability ✅ success
Architecture Contract ✅ success
Degradation + Statistics ✅ success
IP Provenance ✅ success
Provenance + SBOM ✅ success
Security ✅ success
Mutation Kill ✅ success
CI ⏳ in_progress
Hermetic CI ⏳ in_progress
Release Dry Run ⏳ in_progress
Adversarial Validation ⏳ in_progress
OpenAI-2026 Validation Grid ⏳ in_progress
final merge gate ❌ not yet

Verdict:wait for remaining workflows. Current PR metadata is much stronger, but final merge-grade status is not proven until all head workflows complete success.

…me cast

CodeQL flagged 'PipelineStage' as an unused import in pipeline.py: it was
referenced only inside the string forward-ref cast('list[PipelineStage]', ...),
so the runtime name was dead while mypy still needed it. Dropping the quotes
(cast(list[PipelineStage], ...)) evaluates the generic alias at runtime, so the
import is a genuine runtime use — CodeQL clean AND mypy --strict still 0/50.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@neuron7xLab neuron7xLab merged commit 10bad88 into main Jul 1, 2026
50 checks passed
@neuron7xLab neuron7xLab deleted the harden/meta-verification-layer branch July 1, 2026 20:17
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