Phase A ship blockers - #1
Closed
pdurlej wants to merge 5 commits into
Closed
Conversation
MCP safe_to_remove used hyphenated decisions while the core classifier and the rest of the MCP response used underscore labels. That was a silent API drift: clients could see safe-auto from one tool and auto_safe from another. This makes MCP schema literals render from pyfallow.classify.CLASSIFICATION_GROUPS and updates safe_to_remove to return the core namespace. The new classification namespace test suite catches both schema drift and safety-output drift, with a canary for high-confidence auto_safe findings. Verified: - TDD red: mcp/tests/test_classification_namespace.py failed on Classification.decision drift and safe_classification returning safe-auto - Negative regression: changing safety.py back to safe-auto made test_safe_classification_canary_returns_auto_safe_for_clean_high_confidence fail - Negative regression: changing ClassificationDecision back to hyphen labels made test_classification_decision_mirrors_core_groups fail - PYTHONPATH=src:mcp/src /tmp/pyfallow-release-venv/bin/python -m pytest -q mcp/tests: 17 passed - PATH=/tmp/pyfallow-release-venv/bin:/opt/homebrew/bin:/opt/homebrew/sbin:/Users/pd/.codex/tmp/arg0/codex-arg0krhtjs:/Users/pd/.local/bin:/Library/Frameworks/Python.framework/Versions/3.13/bin:/usr/local/bin:/System/Cryptexes/App/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/local/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/appleinternal/bin:/opt/pkg/env/active/bin:/opt/pmk/env/global/bin:/Library/Apple/usr/bin:/Applications/Little Snitch.app/Contents/Components:/Applications/Obsidian.app/Contents/MacOS:/Users/pd/.lmstudio/bin:/Applications/Codex.app/Contents/Resources PYTHONPATH=src:mcp/src pytest -q && PATH=/tmp/pyfallow-release-venv/bin:/opt/homebrew/bin:/opt/homebrew/sbin:/Users/pd/.codex/tmp/arg0/codex-arg0krhtjs:/Users/pd/.local/bin:/Library/Frameworks/Python.framework/Versions/3.13/bin:/usr/local/bin:/System/Cryptexes/App/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/local/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/appleinternal/bin:/opt/pkg/env/active/bin:/opt/pmk/env/global/bin:/Library/Apple/usr/bin:/Applications/Little Snitch.app/Contents/Components:/Applications/Obsidian.app/Contents/MacOS:/Users/pd/.lmstudio/bin:/Applications/Codex.app/Contents/Resources PYTHONPATH=src pyfallow analyze --root . --fail-on warning --min-confidence medium && /tmp/pyfallow-release-venv/bin/python -m compileall -q src tests mcp/src mcp/tests: passed
read_baseline previously returned raw JSON and let malformed baseline data fail later inside comparison. Integer fingerprints or missing contract fields produced cryptic downstream errors instead of telling the user the baseline file was malformed. This adds ConfigError as the user-input error type and validates baseline shape during load. The canonical contract is version plus issues with string fingerprints; legacy fingerprints lists are still accepted and normalized into issues so older/simple baseline files fail cleanly or keep working. Verified: - TDD red: tests/test_baseline.py had 5 failing validation cases before read_baseline validation - Negative regression: removing _validate_baseline_shape made integer-fingerprint and missing-version tests fail again - PYTHONPATH=src /tmp/pyfallow-release-venv/bin/python -m pytest -q tests/test_baseline.py: 6 passed - CLI repro with /tmp/bad-baseline.json containing integer fingerprints returns ConfigError message and exit code 2, not TypeError - PATH=/tmp/pyfallow-release-venv/bin:/opt/homebrew/bin:/opt/homebrew/sbin:/Users/pd/.codex/tmp/arg0/codex-arg0krhtjs:/Users/pd/.local/bin:/Library/Frameworks/Python.framework/Versions/3.13/bin:/usr/local/bin:/System/Cryptexes/App/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/local/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/appleinternal/bin:/opt/pkg/env/active/bin:/opt/pmk/env/global/bin:/Library/Apple/usr/bin:/Applications/Little Snitch.app/Contents/Components:/Applications/Obsidian.app/Contents/MacOS:/Users/pd/.lmstudio/bin:/Applications/Codex.app/Contents/Resources PYTHONPATH=src:mcp/src pytest -q && PATH=/tmp/pyfallow-release-venv/bin:/opt/homebrew/bin:/opt/homebrew/sbin:/Users/pd/.codex/tmp/arg0/codex-arg0krhtjs:/Users/pd/.local/bin:/Library/Frameworks/Python.framework/Versions/3.13/bin:/usr/local/bin:/System/Cryptexes/App/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/local/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/appleinternal/bin:/opt/pkg/env/active/bin:/opt/pmk/env/global/bin:/Library/Apple/usr/bin:/Applications/Little Snitch.app/Contents/Components:/Applications/Obsidian.app/Contents/MacOS:/Users/pd/.lmstudio/bin:/Applications/Codex.app/Contents/Resources PYTHONPATH=src pyfallow analyze --root . --fail-on warning --min-confidence medium && /tmp/pyfallow-release-venv/bin/python -m compileall -q src tests mcp/src mcp/tests: passed
The Forgejo template used a python:3.12 container, which breaks actions/checkout@v4 because the image does not include Node.js. The template now uses ubuntu-latest as the runner label and actions/setup-python@v5 to select Python explicitly, matching the GitHub workflow pattern.
Adds pyfallow's own .forgejo/workflows/ci.yml with the same Python 3.11/3.12/3.13 matrix and steps as GitHub CI. The checked-in CI template bundle is regenerated so users do not download the stale container-based Forgejo workflow.
Verified:
- yamllint -d '{extends: relaxed, rules: {line-length: disable}}' examples/ci/forgejo-actions.yml .forgejo/workflows/ci.yml: passed
- tests/test_pyfallow.py now asserts Forgejo uses ubuntu-latest, has setup-python, and has no container directive
- PATH=/tmp/pyfallow-release-venv/bin:/opt/homebrew/bin:/opt/homebrew/sbin:/Users/pd/.codex/tmp/arg0/codex-arg0krhtjs:/Users/pd/.local/bin:/Library/Frameworks/Python.framework/Versions/3.13/bin:/usr/local/bin:/System/Cryptexes/App/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/local/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/appleinternal/bin:/opt/pkg/env/active/bin:/opt/pmk/env/global/bin:/Library/Apple/usr/bin:/Applications/Little Snitch.app/Contents/Components:/Applications/Obsidian.app/Contents/MacOS:/Users/pd/.lmstudio/bin:/Applications/Codex.app/Contents/Resources PYTHONPATH=src:mcp/src pytest -q && PATH=/tmp/pyfallow-release-venv/bin:/opt/homebrew/bin:/opt/homebrew/sbin:/Users/pd/.codex/tmp/arg0/codex-arg0krhtjs:/Users/pd/.local/bin:/Library/Frameworks/Python.framework/Versions/3.13/bin:/usr/local/bin:/System/Cryptexes/App/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/local/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/appleinternal/bin:/opt/pkg/env/active/bin:/opt/pmk/env/global/bin:/Library/Apple/usr/bin:/Applications/Little Snitch.app/Contents/Components:/Applications/Obsidian.app/Contents/MacOS:/Users/pd/.lmstudio/bin:/Applications/Codex.app/Contents/Resources PYTHONPATH=src pyfallow analyze --root . --fail-on warning --min-confidence medium && /tmp/pyfallow-release-venv/bin/python -m compileall -q src tests mcp/src mcp/tests: passed
- Live Forgejo runner verification is pending the Phase A PR after A5, per branch push protocol
Verified: - Reproduced Python 3.11 failure before fix: PYTHONPATH=src:mcp/src /tmp/pyfallow-py311/bin/python -m pytest -q mcp/tests/test_mcp.py -> 9 failed, 4 passed. - Python 3.11 green after fix: PYTHONPATH=src:mcp/src /tmp/pyfallow-py311/bin/python -m pytest -q mcp/tests/test_mcp.py -> passed. - Current release venv green after fix: PYTHONPATH=src:mcp/src /tmp/pyfallow-release-venv/bin/python -m pytest -q mcp/tests/test_mcp.py -> passed. - Negative regression verified by temporarily removing the dataclass branch: Python 3.11 returned 9 failed, 4 passed again. - Full gate passed: PATH=/tmp/pyfallow-release-venv/bin:/opt/homebrew/bin:/opt/homebrew/sbin:/Users/pd/.codex/tmp/arg0/codex-arg0krhtjs:/Users/pd/.local/bin:/Library/Frameworks/Python.framework/Versions/3.13/bin:/usr/local/bin:/System/Cryptexes/App/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/local/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/appleinternal/bin:/opt/pkg/env/active/bin:/opt/pmk/env/global/bin:/Library/Apple/usr/bin:/Applications/Little Snitch.app/Contents/Components:/Applications/Obsidian.app/Contents/MacOS:/Users/pd/.lmstudio/bin:/Applications/Codex.app/Contents/Resources PYTHONPATH=src:mcp/src pytest -q && PATH=/tmp/pyfallow-release-venv/bin:/opt/homebrew/bin:/opt/homebrew/sbin:/Users/pd/.codex/tmp/arg0/codex-arg0krhtjs:/Users/pd/.local/bin:/Library/Frameworks/Python.framework/Versions/3.13/bin:/usr/local/bin:/System/Cryptexes/App/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/local/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/appleinternal/bin:/opt/pkg/env/active/bin:/opt/pmk/env/global/bin:/Library/Apple/usr/bin:/Applications/Little Snitch.app/Contents/Components:/Applications/Obsidian.app/Contents/MacOS:/Users/pd/.lmstudio/bin:/Applications/Codex.app/Contents/Resources PYTHONPATH=src pyfallow analyze --root . --fail-on warning --min-confidence medium && /tmp/pyfallow-release-venv/bin/python -m compileall -q src tests mcp/src mcp/tests.
Verified: - Version strategy used Phase A default alpha incremental: pyfallow 0.3.0a2 and pyfallow-mcp 0.1.0a2. - python3 -m pip index versions pyfallow -> no matching distribution; python3 -m pip index versions pyfallow-mcp -> no matching distribution. - TestPyPI name checks also returned no matching distribution for both packages. - https://pypi.org/user/pdurlej/ returned HTTP 200. - Bitwarden status is locked and no TWINE/PYPI token environment variables are present; TestPyPI upload and TestPyPI fresh-install smoke are blocked and were not run. - PATH=/tmp/pyfallow-release-venv/bin:/opt/homebrew/bin:/opt/homebrew/sbin:/Users/pd/.codex/tmp/arg0/codex-arg0krhtjs:/Users/pd/.local/bin:/Library/Frameworks/Python.framework/Versions/3.13/bin:/usr/local/bin:/System/Cryptexes/App/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/local/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/appleinternal/bin:/opt/pkg/env/active/bin:/opt/pmk/env/global/bin:/Library/Apple/usr/bin:/Applications/Little Snitch.app/Contents/Components:/Applications/Obsidian.app/Contents/MacOS:/Users/pd/.lmstudio/bin:/Applications/Codex.app/Contents/Resources PYTHONPATH=src pytest -q tests/test_pyfallow.py::test_release_metadata_version_schema_and_readme_examples -> passed. - Built core artifacts: dist/pyfallow-0.3.0a2-py3-none-any.whl and dist/pyfallow-0.3.0a2.tar.gz. - Built MCP artifacts: mcp/dist/pyfallow_mcp-0.1.0a2-py3-none-any.whl and mcp/dist/pyfallow_mcp-0.1.0a2.tar.gz. - /tmp/pyfallow-release-venv/bin/python -m twine check dist/* and mcp/dist/* -> PASSED. - Local fresh-venv wheel install smoke passed: pyfallow --version -> pyfallow 0.3.0a2; pyfallow analyze ran; pyfallow-mcp --help worked. - Python 3.11 cross-check passed: PYTHONPATH=src:mcp/src /tmp/pyfallow-py311/bin/python -m pytest -q tests mcp/tests and PYTHONPATH=src /tmp/pyfallow-py311/bin/python -m pyfallow analyze --root . --fail-on warning --min-confidence medium. - Full gate passed: PATH=/tmp/pyfallow-release-venv/bin:/opt/homebrew/bin:/opt/homebrew/sbin:/Users/pd/.codex/tmp/arg0/codex-arg0krhtjs:/Users/pd/.local/bin:/Library/Frameworks/Python.framework/Versions/3.13/bin:/usr/local/bin:/System/Cryptexes/App/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/local/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/appleinternal/bin:/opt/pkg/env/active/bin:/opt/pmk/env/global/bin:/Library/Apple/usr/bin:/Applications/Little Snitch.app/Contents/Components:/Applications/Obsidian.app/Contents/MacOS:/Users/pd/.lmstudio/bin:/Applications/Codex.app/Contents/Resources PYTHONPATH=src:mcp/src pytest -q && PATH=/tmp/pyfallow-release-venv/bin:/opt/homebrew/bin:/opt/homebrew/sbin:/Users/pd/.codex/tmp/arg0/codex-arg0krhtjs:/Users/pd/.local/bin:/Library/Frameworks/Python.framework/Versions/3.13/bin:/usr/local/bin:/System/Cryptexes/App/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/local/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/appleinternal/bin:/opt/pkg/env/active/bin:/opt/pmk/env/global/bin:/Library/Apple/usr/bin:/Applications/Little Snitch.app/Contents/Components:/Applications/Obsidian.app/Contents/MacOS:/Users/pd/.lmstudio/bin:/Applications/Codex.app/Contents/Resources PYTHONPATH=src pyfallow analyze --root . --fail-on warning --min-confidence medium && /tmp/pyfallow-release-venv/bin/python -m compileall -q src tests mcp/src mcp/tests.
Owner
Author
TestPyPI upload + smoke verification ✅Posted by Claude Opus 4.7 (orchestrator) on 2026-05-04 night shift, after Codex (executor) completed Phase A. Uploaded artifacts
Fresh-venv install smoke (Python 3.12.12)A1 invariant verified live on installed package>>> from pyfallow.classify import CLASSIFICATION_GROUPS
('auto_safe', 'review_needed', 'blocking', 'manual_only')
>>> from pyfallow_mcp.schemas import Classification
>>> Classification.model_fields['decision'].annotation
typing.Literal['auto_safe', 'review_needed', 'blocking', 'manual_only']Single source of truth respected end-to-end on a fresh install pulled from TestPyPI. Ready for your review + merge decision. Production PyPI upload remains a deliberate manual step. — Claude Opus 4.7 (orchestrator), nightly continuation |
Owner
Author
|
Closing stale private-mirror PR before public release. GitHub main will be replaced by a sanitized public mirror of the vetted current tree. |
pdurlej
added a commit
that referenced
this pull request
May 15, 2026
…late (do not merge)' (#1) from test/ticket-i-live-validation into main Reviewed-on: https://git.pdurlej.com/pdurlej/pyfallow/pulls/1
pdurlej
added a commit
that referenced
this pull request
May 15, 2026
pdurlej
added a commit
that referenced
this pull request
May 15, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Implements Phase A ship blockers as five atomic commits:
Verification
PATH=/tmp/pyfallow-release-venv/bin:$PATH PYTHONPATH=src:mcp/src pytest -qPATH=/tmp/pyfallow-release-venv/bin:$PATH PYTHONPATH=src pyfallow analyze --root . --fail-on warning --min-confidence medium/tmp/pyfallow-release-venv/bin/python -m compileall -q src tests mcp/src mcp/testsPYTHONPATH=src:mcp/src /tmp/pyfallow-py311/bin/python -m pytest -q tests mcp/testsPYTHONPATH=src /tmp/pyfallow-py311/bin/python -m pyfallow analyze --root . --fail-on warning --min-confidence mediumdist/pyfallow-0.3.0a2-py3-none-any.whldist/pyfallow-0.3.0a2.tar.gzmcp/dist/pyfallow_mcp-0.1.0a2-py3-none-any.whlmcp/dist/pyfallow_mcp-0.1.0a2.tar.gztwine checkpassed for both package artifact sets.pyfallow --version,pyfallow analyze, andpyfallow-mcp --help.Blockers
Forgejo primary PR creation is blocked because
https://git.pdurlej.com/pdurlej/pyfallow.gitreturns 404 and Forgejo MCPlist_user_repos(pdurlej)does not listpyfallow. GitHub mirror branch was pushed successfully.TestPyPI upload is blocked because Bitwarden is locked and no
TWINE_*/PYPI_*token environment variables are present. Package names appear unclaimed on PyPI and TestPyPI as of the local checks.