You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Open discussion on whether Skillware should adopt static type checking in CI and contributor workflow, with Pyrefly as the primary candidate to explore (not a commitment to ship).
Skillware today enforces black, flake8, and pytest only — there is no mypy, pyright, or Pyrefly in pyproject.toml, CI, or contributor docs. Core modules (skillware/core/, cli.py) already use partial typing annotations; registry skills vary in annotation depth and optional-dependency patterns.
This RFC does not implement anything. It aligns on whether type checking is worth the contributor cost, what scope to check if yes, Pyrefly vs alternatives, and how to roll out without blocking skill-only PRs.
Contributors and agents follow black + flake8 + pytest; there is no static contract for public APIs (SkillLoader, BaseSkill, bundle shape).
The Python tooling landscape shifted in 2026: Pyrefly 1.0 (Meta) offers fast checking, gradual presets (basic, legacy), and migration helpers — but Skillware has no existing mypy investment to migrate from; this is a greenfield decision.
What we want from this RFC
Go / no-go / phased — Is static typing worth adding to Skillware's quality bar?
Tool choice — If yes, is Pyrefly the right first explore (vs mypy, pyright, ty, or defer)?
Scope — Framework only (skillware/, tests/) vs entire repo including skills/**?
Rollout — Optional dev extra vs enforced CI; warn-only vs blocking; baseline/suppress strategy.
Ripple effects — CONTRIBUTING, TESTING.md, PR template, CI time, contributor friction for skill authors.
Non-goals
Mandating full strict typing on every registry skill in one release.
black --check, flake8, pytest skills/, pytest tests/
Type checker
None configured
Annotations
Partial in skillware/; inconsistent across skills/
Contributor docs
TESTING.md, PR template — no type-check step
Questions to resolve (open)
1. Is it worth it?
Pros of adding static type checking
Catches API/shape bugs in loader, discovery, CLI before merge.
Documents public contracts for contributors and agent workflows.
Better IDE/LSP experience (Pyrefly ships a language server).
Low incremental CI time on a repo this size if scoped to framework code.
Cons / reasons to defer
Extra contributor step; skill-only PRs may not benefit.
skills/ use lazy imports, optional deps (web3, rembg, SDK extras) — whole-tree strict checking is noisy without investment.
Another tool to document, baseline, and maintain.
Pyrefly is production-proven but younger than mypy; plugin/stub ecosystem still maturing.
2. Why explore Pyrefly first (if we explore at all)?
Skillware has no mypy config to migrate — tool choice is greenfield.
Consideration
Pyrefly
mypy
pyright
Speed (large codebases)
Strong
Weaker; 2.0 parallel helps
Moderate
Greenfield adoption
basic preset, pyrefly init, suppress
Mature, widest ecosystem
Strong conformance
Aggressiveness
Can flag more on unannotated code
Gradual by default
Strict options
Skillware fit
Good for phased skillware/ scope
Safe default if stub/plugins needed
Alternative spike
Recommendation for spike (not decision): evaluate Pyrefly on skillware/ + tests/ with basic or legacy preset; compare error signal vs noise against a short mypy baseline on the same paths.
3. Scope options (proposed tiers)
Tier
Paths
CI
Notes
A — Defer
—
—
Status quo
B — Dev optional
skillware/, tests/
No
Document in TESTING.md; pip install pyrefly; contributor opt-in
C — CI advisory
skillware/, tests/
Non-blocking
Report in CI; fix baseline over time
D — CI required
skillware/, tests/
Blocking
Full gate after baseline clean
E — Skills included
+ skills/**
TBD
High friction; likely optional/warn-only for skill authors
Default RFC bias: land between B and C first; E only if explicitly valued and phased like #200 (warn-only identity checks).
4. What to consider when adding it
Technical
Preset choice: basic (low noise) vs default vs strict.
Baseline: pyrefly suppress or fix-forward for existing annotations.
Optional deps / dynamic imports in loader and skills — may need type: ignore or stub packages.
Windows + Linux CI (Pyrefly supports both).
Interaction with [dev] extra vs standalone install.
Summary
Open discussion on whether Skillware should adopt static type checking in CI and contributor workflow, with Pyrefly as the primary candidate to explore (not a commitment to ship).
Skillware today enforces black, flake8, and pytest only — there is no mypy, pyright, or Pyrefly in
pyproject.toml, CI, or contributor docs. Core modules (skillware/core/,cli.py) already use partialtypingannotations; registry skills vary in annotation depth and optional-dependency patterns.This RFC does not implement anything. It aligns on whether type checking is worth the contributor cost, what scope to check if yes, Pyrefly vs alternatives, and how to roll out without blocking skill-only PRs.
Motivation
Problem
SkillLoader,BaseSkill, bundle shape).basic,legacy), and migration helpers — but Skillware has no existing mypy investment to migrate from; this is a greenfield decision.What we want from this RFC
skillware/,tests/) vs entire repo includingskills/**?Non-goals
Detailed Design
Current state
black --check,flake8,pytest skills/,pytest tests/skillware/; inconsistent acrossskills/Questions to resolve (open)
1. Is it worth it?
Pros of adding static type checking
Cons / reasons to defer
skills/use lazy imports, optional deps (web3,rembg, SDK extras) — whole-tree strict checking is noisy without investment.2. Why explore Pyrefly first (if we explore at all)?
Skillware has no mypy config to migrate — tool choice is greenfield.
basicpreset,pyrefly init, suppressskillware/scopeRecommendation for spike (not decision): evaluate Pyrefly on
skillware/+tests/withbasicorlegacypreset; compare error signal vs noise against a short mypy baseline on the same paths.3. Scope options (proposed tiers)
skillware/,tests/pip install pyrefly; contributor opt-inskillware/,tests/skillware/,tests/skills/**Default RFC bias: land between B and C first; E only if explicitly valued and phased like #200 (warn-only identity checks).
4. What to consider when adding it
Technical
basic(low noise) vsdefaultvsstrict.pyrefly suppressor fix-forward for existing annotations.type: ignoreor stub packages.[dev]extra vs standalone install.Process
pyproject.toml,.github/workflows/ci.yml,docs/TESTING.md,CONTRIBUTING.md, PR template checklist.Example spike commands (illustrative)
5. Suggested spike deliverables (follow-up issue, not this RFC)
skillware/andtests/; compare error counts and false positives.pyproject.toml/ config fragment (if adopt).6. Child / related issues (to create after RFC closes)
[Feat]: Add Pyrefly type checking for skillware/ (phased)Suggested RFC outcomes (when ready to close)
Drawbacks
skills/.Mitigation: Keep RFC non-binding; spike is time-boxed; default scope is
skillware/+tests/only; defer skills/ enforcement unless explicitly approved.