Pre-release alpha — v3.1.1a1
Early testing release for #529: metadata state type hardening.
What's in this release
Typed WPMetadata Pydantic model (src/specify_cli/status/wp_metadata.py)
Immutable, validated value object replacing all raw frontmatter.get() dict access. The lane field is now Lane | None — invalid lane values are rejected at parse time. The legacy "doing" alias normalises to in_progress automatically.
9-lane Lane enum state machine (src/specify_cli/status/models.py, wp_state.py)
in_review promoted from alias to first-class lane with its own InReviewState. 27 valid transition pairs enforced at the type level. display_category() for in_review intentionally folds into the "In Progress" kanban column (no new column).
RE2 regex engine (src/kernel/_safe_re.py)
google-re2 >= 1.1 added as a core runtime dependency (pre-built wheels for Windows, Linux, macOS). The shim is a hard RE2 dependency — no silent fallback to stdlib re. Patterns using PCRE-only syntax (lookahead/lookbehind) raise re.error immediately. Use stdlib re directly for those patterns.
Typed dashboard API contracts (src/specify_cli/dashboard/api_types.py)
26 TypedDict response shapes replacing untyped dicts; test_api_contract.py added.
CI — new fast-tests-status and integration-tests-status jobs; coverage from src/specify_cli/status/ and src/kernel/ now feeds the diff-coverage gate.
Fixes applied in this alpha (not in the base PR)
WPMetadata.lanetyped asLane | None(wasstr | None) — invalid values now rejected_safe_re.pyImportError fallback removed; PCRE patterns raisere.errorinstead of silently using stdlibmission.pylookahead patterns rewritten to RE2-compatible alternationtask_metadata_validation.pystale 4-lane list replaced withget_all_lane_values()WPMetadatamissing fields (mission_number,mission_slug,status) added
Upgrading
pip install "spec-kitty-cli==3.1.1a1"
Alpha software. Not recommended for production use. Report issues at https://github.com/Priivacy-ai/spec-kitty/issues