stackvitals 0.1.3__tar.gz → 0.1.4__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- stackvitals-0.1.4/.github/ISSUE_TEMPLATE/bug.yml +56 -0
- stackvitals-0.1.4/.github/ISSUE_TEMPLATE/config.yml +8 -0
- stackvitals-0.1.4/.github/ISSUE_TEMPLATE/feature.yml +39 -0
- stackvitals-0.1.4/.github/pull_request_template.md +15 -0
- stackvitals-0.1.4/.github/workflows/pages.yml +44 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/CHANGELOG.md +16 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/PKG-INFO +1 -1
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/registry.json +28 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/docs/accuracy.md +1 -1
- {stackvitals-0.1.3 → stackvitals-0.1.4}/docs/limitations.md +4 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/docs/modules.md +3 -3
- {stackvitals-0.1.3 → stackvitals-0.1.4}/docs/rules.md +22 -0
- stackvitals-0.1.4/glama.json +4 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/pyproject.toml +1 -1
- {stackvitals-0.1.3 → stackvitals-0.1.4}/server.json +2 -2
- stackvitals-0.1.4/src/mergescout/__init__.py +1 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/__init__.py +1 -1
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/ci/action.py +2 -2
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/ci/analyze.py +16 -1
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/ci/feedback.py +94 -5
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/editors/vscode/package.json +1 -1
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/site.py +19 -2
- stackvitals-0.1.4/src/stackvitals/web/app/help/accuracy.json +1 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/help/index.json +1 -1
- stackvitals-0.1.4/src/stackvitals/web/app/help/modules.json +1 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/site/site.css +5 -3
- stackvitals-0.1.4/tests/local/test_ci_pr_only_flakes.py +201 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_site_build.py +32 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/uv.lock +1 -1
- stackvitals-0.1.3/src/mergescout/__init__.py +0 -1
- stackvitals-0.1.3/src/stackvitals/web/app/help/accuracy.json +0 -1
- stackvitals-0.1.3/src/stackvitals/web/app/help/modules.json +0 -1
- {stackvitals-0.1.3 → stackvitals-0.1.4}/.env.example +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/.gitattributes +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/.github/ISSUE_TEMPLATE/benchmark.yml +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/.github/build-constraints.txt +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/.github/workflows/daily.yml +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/.github/workflows/mcp-registry.yml +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/.github/workflows/prospective.yml +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/.github/workflows/release.yml +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/.github/workflows/tests.yml +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/.gitignore +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/CODE_OF_CONDUCT.md +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/CONTRIBUTING.md +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/GOVERNANCE.md +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/LICENSE +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/NOTICE +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/README.md +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/SECURITY.md +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/action.yml +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/LICENSE-DATA.md +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/adjudicate.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/adjudicator-crosscheck.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/adoption/README.md +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/adoption/manifest.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/adoption/preregistration.md +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/adoption/study.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/agents/README.md +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/agents/prepare.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/agents/prepare2.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/agents/prompts.md +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/agents/results.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/agents/results2.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/agents/score.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/agents/score2.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/agents/triage-results.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/agents/triage_check.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/ai/README.md +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/ai/adjudication-detection.csv +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/ai/adoption-results.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/ai/adoption.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/ai/agreement-gemini-detection.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/ai/codebook-detection.md +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/ai/detection-labels.csv +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/ai/detection-results.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/ai/detection.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/ai/labels-gemini-detection.csv +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/ai/preregistration.md +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/ai/replicate-results.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/ai/replicate.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/audit-results.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/audit.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/community/README.md +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/community/adjudication-main.csv +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/community/adjudication-validation.csv +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/community/affiliation-results.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/community/affiliation.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/community/agreement-gemini-main-v2.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/community/agreement-gemini-main.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/community/agreement-gemini-validation-v2.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/community/agreement-gemini-validation.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/community/channels-results.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/community/channels.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/community/codebook.md +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/community/labels-gemini-main-v2.csv +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/community/labels-gemini-main.csv +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/community/labels-gemini-validation-v2.csv +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/community/labels-gemini-validation.csv +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/community/labels-main.csv +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/community/labels-results.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/community/labels-validation.csv +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/community/responses-results.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/community/responses-validation-results.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/community/responses.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/community/score_labels.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/community/triage-results.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/community/triage.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/contribute/README.md +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/contribute/frozen-manifest.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/contribute/frozen.json.gz +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/contribute/preregistration.md +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/contribute/prospective.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/crosscheck.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/deps/README.md +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/deps/baseline-after-results.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/deps/baseline-results.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/deps/baseline.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/deps/coverage-results.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/deps/coverage.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/deps/exploits-results.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/deps/exploits.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/deps/incidents-results.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/deps/incidents.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/deps/lookalike-results.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/deps/lookalike.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/deps/release-signs-results.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/deps/release_signs.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/devlake/README.md +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/devlake/head-to-head-results.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/devlake/pick.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/devlake/preregistration.md +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/devlake/repos.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/devlake/run.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/devlake/score.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/dora/README.md +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/dora/adjudication-incidents.csv +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/dora/adjudication-sources-more.csv +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/dora/adjudication-sources.csv +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/dora/agreement-gemini-sources-more.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/dora/agreement-gemini-sources.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/dora/codebook.md +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/dora/devlake-configured-more-results.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/dora/devlake-configured-results.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/dora/devlake_configured.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/dora/environments-results.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/dora/environments.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/dora/incidents-codebook.md +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/dora/incidents-labels.csv +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/dora/incidents-results.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/dora/incidents.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/dora/labels-gemini-incidents.csv +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/dora/labels-gemini-sources-more.csv +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/dora/labels-gemini-sources.csv +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/dora/linkage-more-results.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/dora/linkage-results.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/dora/linkage.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/dora/sources-labels.csv +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/dora/sources-more-labels.csv +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/dora/sources-more-results.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/dora/sources-results.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/dora/sources.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/dora/spread-results.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/dora/spread.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/fair.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/features/README.md +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/features/api_use.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/features/branch_growth.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/features/catalog.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/features/reports.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/features/scorecard.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/features/scorecard.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/finalise.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/flaky/README.md +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/flaky/adjudication-flaky.csv +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/flaky/adjudication-fresh.csv +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/flaky/adjudication-heldout.csv +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/flaky/adjudication-masking.csv +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/flaky/agreement-gemini-flaky-v2.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/flaky/agreement-gemini-flaky.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/flaky/agreement-gemini-fresh.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/flaky/agreement-gemini-heldout.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/flaky/agreement-gemini-masking.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/flaky/already-results.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/flaky/already.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/flaky/began-results.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/flaky/began.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/flaky/card.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/flaky/codebook.md +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/flaky/heldout-labels.csv +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/flaky/heldout-results.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/flaky/heldout.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/flaky/items.csv +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/flaky/kinds-results.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/flaky/kinds.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/flaky/labels-gemini-flaky-v2.csv +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/flaky/labels-gemini-flaky.csv +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/flaky/labels-gemini-fresh.csv +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/flaky/labels-gemini-heldout.csv +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/flaky/labels-gemini-masking.csv +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/flaky/masking-labels.csv +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/flaky/masking-results.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/flaky/masking.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/flaky/maybe-results.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/flaky/maybe.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/flaky/natural-results.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/flaky/natural.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/flaky/outside-fresh-results.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/flaky/outside-results.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/flaky/outside.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/flaky/outside_fresh.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/flaky/pr-details-results.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/flaky/pr_details.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/flaky/safe-check-results.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/flaky/safe-rule-results.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/flaky/safe_check.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/flaky/safe_rule.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/flaky/sample.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/flaky/score.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/flaky/views.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/flaky/wide.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/impact/README.md +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/impact/collect_reports.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/impact/find_report_repos.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/impact/replay-results.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/impact/replay_tia.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/impact/search.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/impact/totals.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/label-sensitivity.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/labeller.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/middleware/README.md +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/middleware/preregistration.md +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/middleware/results.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/middleware/run.sh +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/middleware/score.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/panel-results.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/panel.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/platform/README.md +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/platform/busy-results.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/platform/busy.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/portal/README.md +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/portal/scale-results.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/portal/scale.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/portal/speed-after.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/portal/speed-before.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/portal/speed.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/replay/README.md +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/replay/adjudication-replay.csv +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/replay/agreement-gemini-replay.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/replay/labels-gemini-replay.csv +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/replay/replay-labels.csv +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/replay/replay-results.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/replay/replay.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/reproduce.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/scorecard/README.md +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/scorecard/results-before.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/scorecard/results.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/scorecard/run.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/sensitivity.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/summary.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/team/README.md +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/team/prospective-frozen.json.gz +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/team/prospective-manifest.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/team/prospective.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/team/reviewers-results.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/team/reviewers.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/uncertainty/README.md +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/uncertainty/nulls-2week-before-results.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/uncertainty/nulls-2week-results.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/uncertainty/nulls-before-results.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/uncertainty/nulls-results.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/uncertainty/nulls.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/uncertainty/shrinkage-groups-results.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/uncertainty/shrinkage-results.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/bench/accuracy/uncertainty/shrinkage.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/deploy/crawler/README.md +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/deploy/crawler/gitignore +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/deploy/crawler/workflows/bench.yml +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/deploy/crawler/workflows/check.yml +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/deploy/crawler/workflows/crawl.yml +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/deploy/crawler/workflows/discover.yml +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/deploy/crawler/workflows/keepalive.yml +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/docs/app.md +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/docs/architecture.md +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/docs/assets/architecture-detailed-dark.png +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/docs/assets/architecture-detailed-light.png +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/docs/assets/architecture-overview-dark.png +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/docs/assets/architecture-overview-light.png +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/docs/assets/divider-dark.png +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/docs/assets/divider-light.png +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/docs/assets/lockup-dark.png +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/docs/assets/lockup-light.png +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/docs/assets/stackvitals-video.avif +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/docs/assets/stackvitals-video.gif +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/docs/assets/stackvitals-video.mp4 +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/docs/chaoss.md +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/docs/connectors.md +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/docs/coverage.md +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/docs/dora-guide.md +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/docs/enterprise.md +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/docs/faq.md +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/docs/guides/maintainer.md +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/docs/guides/manager.md +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/docs/guides/platform.md +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/docs/install.md +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/docs/methods.md +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/docs/privacy.md +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/docs/quickstart.md +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/docs/release-checklist.md +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/docs/roadmap.md +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/docs/scaling.md +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/docs/settings.md +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/docs/threat-model.md +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/docs/triage.md +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/llms.txt +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/scripts/prelaunch.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/scripts/sync_crawler.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/skills/stackvitals-ci/SKILL.md +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/skills/stackvitals-community/SKILL.md +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/skills/stackvitals-contribute/SKILL.md +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/skills/stackvitals-delivery/SKILL.md +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/skills/stackvitals-deps/SKILL.md +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/skills/stackvitals-flow/SKILL.md +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/skills/stackvitals-portal/SKILL.md +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/archive/__init__.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/archive/__main__.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/archive/convert.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/archive/events.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/archive/manifest.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/archive/stream.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/bench/__init__.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/bench/__main__.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/bench/ci.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/bench/deploys.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/bench/matched.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/bench/prior.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/bench/report.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/bench/shared.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/bench/stars.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/cli.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/config.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/crawl/__init__.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/crawl/__main__.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/crawl/chain.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/crawl/fetch.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/crawl/outcomes.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/crawl/queries.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/crawl/runner.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/crawl/seed.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/crawl/state.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/crawl/writer.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/discover/__init__.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/discover/__main__.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/discover/sweep.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/github/__init__.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/github/graphql.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/github/identities.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/github/releases.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/labels.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/mcp_server.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/measure/__init__.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/measure/__main__.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/measure/api_cost.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/measure/count_repos.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/measure/jsonl.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/measure/report.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/measure/sample.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/owners.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/setup_check.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/signals/__init__.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/signals/__main__.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/signals/bump_ledger.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/signals/bumps.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/signals/check.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/signals/community_bench.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/signals/delivery_bench.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/signals/deps_map.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/signals/deps_trends.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/signals/evidence.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/signals/exploits.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/signals/flow_bench.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/signals/identity.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/signals/issues.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/signals/labels.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/signals/osv.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/signals/owners_watch.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/signals/repo_stats.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/signals/rules.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/signals/silver.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/signals/top_packages.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/signals/triage.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/signals/triage_math.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/signals/walls.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/snapshot/__init__.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/snapshot/__main__.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/snapshot/build.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/snapshot/publish.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/snapshot/schema.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/snapshot/score.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/store/__init__.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/store/__main__.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/store/sync.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/timeutil.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/tool/__init__.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/tool/action_pack.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/tool/live.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/tool/queries.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/tool/refs.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/tool/store.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/mergescout/tool/tracking.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/__main__.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/ci/__init__.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/ci/api.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/ci/automation.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/ci/bench.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/ci/burnin.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/ci/cli.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/ci/collect.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/ci/cost.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/ci/coverage.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/ci/fingerprint.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/ci/gitlab.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/ci/gitlab_action.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/ci/impact.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/ci/investigate.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/ci/kinds.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/ci/monitors.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/ci/owners.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/ci/quarantine_runtime.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/ci/report.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/ci/retry.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/ci/selfheal.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/ci/shards.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/ci/share.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/ci/store.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/ci/testreports.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/ci/tickets.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/ci/track_record.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/ci/triage.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/ci/triggers.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/ci/upload.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/ci/validate.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/cli.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/codeowners.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/community/__init__.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/community/action.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/community/affiliation.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/community/analyze.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/community/build.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/community/chaoss.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/community/cli.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/community/collect.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/community/context.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/community/report.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/connectors/__init__.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/connectors/ai_spend.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/connectors/base.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/connectors/check.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/connectors/copilot.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/connectors/discord.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/connectors/discourse.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/connectors/incident_io.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/connectors/jira.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/connectors/linear.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/connectors/pagerduty.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/connectors/slack.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/connectors/sonar.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/connectors/store.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/connectors/tracker.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/connectors/writeback.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/contribute/__init__.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/contribute/brief.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/contribute/cli.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/core/__init__.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/core/actors.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/core/agent_ledger.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/core/agreements.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/core/ai_outcomes.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/core/alerts.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/core/appdata.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/core/bucket.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/core/bugs.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/core/calendar.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/core/capex.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/core/change_risk.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/core/changes.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/core/chat.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/core/config.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/core/dataflow.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/core/decisions.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/core/delivery.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/core/delivery_peers.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/core/delivery_report.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/core/deliverycli.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/core/devlake_dora.sql +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/core/digest.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/core/explaincli.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/core/explore.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/core/export.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/core/exportcli.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/core/findings.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/core/health.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/core/identity.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/core/initcli.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/core/insights.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/core/insightscli.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/core/installdoc.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/core/investment.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/core/joins.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/core/llmsdoc.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/core/merge_queue.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/core/metrics.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/core/model.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/core/projectcli.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/core/propose.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/core/pulse.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/core/recorded.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/core/releases.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/core/requests.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/core/resync.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/core/schema.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/core/services.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/core/settings.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/core/sqlcli.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/core/stats.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/core/store.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/core/summary.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/core/time.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/core/tomledit.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/core/uicli.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/core/webapp.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/core/what_changed.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/core/workspace.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/deps/__init__.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/deps/action.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/deps/actions_vulns.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/deps/cli.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/deps/dossier.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/deps/evidence.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/deps/fixplan.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/deps/guarddog.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/deps/hygiene.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/deps/imports.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/deps/lockfiles.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/deps/lookalike.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/deps/reach.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/deps/release.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/deps/runtimes.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/deps/supply.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/deps/vulns.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/editors/__init__.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/editors/vscode/extension.js +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/editors/vscode/marks.js +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/flow/__init__.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/flow/action.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/flow/analyze.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/flow/automate.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/flow/build.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/flow/cli.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/flow/code_hosts.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/flow/collect.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/flow/gitlab_mr.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/flow/knowledge.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/flow/peers.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/flow/preflight.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/flow/report.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/flow/rules.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/flow/store.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/flow/survival.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/flow/triage.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/mcp_server.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/portal/__init__.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/portal/action.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/portal/batch.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/portal/campaigns.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/portal/catalog.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/portal/checks.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/portal/cli.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/portal/descriptor.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/portal/export.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/portal/github.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/portal/golden.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/portal/history.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/portal/inventory.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/portal/owners.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/portal/pages.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/portal/rollup.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/portal/scorecard.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/security/__init__.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/security/probes.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/security/repo_checks.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/security/workflows.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/shell.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/LICENSES.md +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/boot.js +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/brand/cube-128.png +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/brand/cube-256.png +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/brand/cube-64.png +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/chunks/AddRepo-KRPZXWCY.js +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/chunks/SetupRunning-XWFQAKRZ.js +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/chunks/accuracy-data-OQTDXI7Y.js +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/chunks/agents-data-BAL6QAOF.js +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/chunks/chunk-24LFKFZ6.js +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/chunks/chunk-3IXWEOIJ.js +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/chunks/chunk-3ROQFHPV.js +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/chunks/chunk-45PGAQRO.js +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/chunks/chunk-4H53OYLG.js +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/chunks/chunk-4LUI7O5P.js +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/chunks/chunk-4SQPQ5TB.js +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/chunks/chunk-4WKQTWUC.js +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/chunks/chunk-576YHDEK.js +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/chunks/chunk-5TSTECYX.js +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/chunks/chunk-6RLVD2DT.js +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/chunks/chunk-763NH7PP.js +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/chunks/chunk-76WAVKUG.js +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/chunks/chunk-7II2BD5F.js +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/chunks/chunk-7W2HH2SR.js +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/chunks/chunk-AEVB6UDN.js +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/chunks/chunk-ASYNLVOP.js +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/chunks/chunk-CTKDYZMG.js +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/chunks/chunk-CVB26NMC.js +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/chunks/chunk-DLORG2IY.js +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/chunks/chunk-FBGIG7YF.js +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/chunks/chunk-G7NGB5UX.js +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/chunks/chunk-GT4EAKAO.js +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/chunks/chunk-IYMBFPCV.js +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/chunks/chunk-LAAGCPU3.js +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/chunks/chunk-P5TXDD45.js +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/chunks/chunk-RPXHAG6F.js +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/chunks/chunk-S2ZBMEVA.js +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/chunks/chunk-S654BBEP.js +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/chunks/chunk-SACCDA46.js +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/chunks/chunk-T7QVTNXF.js +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/chunks/chunk-TCPSLBAB.js +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/chunks/chunk-TO4VVRZ7.js +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/chunks/chunk-UWMBZCCA.js +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/chunks/chunk-VQ5YXO54.js +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/chunks/chunk-VWKSMFWJ.js +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/chunks/chunk-W6N6P4C7.js +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/chunks/chunk-YTANGYYH.js +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/chunks/connect-KONYWYTT.js +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/chunks/connections-data-2DYS4UVW.js +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/chunks/more-EEGUDTVE.js +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/chunks/more-PC6FVS3P.js +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/chunks/more-RCIVCUDE.js +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/chunks/more-ZKKRY6NO.css +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/chunks/sealbox-35YL4EUH.js +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/chunks/session-DYYTOE2K.js +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/chunks/settingsApply-2HRJEZYM.js +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/chunks/settingsReview-GX2FZQ4M.js +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/chunks/uPlot.esm-OIWT3AHJ.js +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/demo/ci/impact.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/demo/ci/quarantine.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/demo/ci/tickets.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/demo/mobile/alerts.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/demo/mobile/app.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/demo/mobile/community.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/demo/mobile/connectors.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/demo/mobile/data.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/demo/mobile/decisions.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/demo/mobile/delivery.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/demo/mobile/deps.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/demo/mobile/flow.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/demo/mobile/health.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/demo/mobile/insights.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/demo/mobile/pulse.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/demo/mobile/security.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/demo/mobile/summary/ci_jobs.jsonl +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/demo/mobile/summary/devlake_project_pr_metrics.jsonl +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/demo/mobile/summary/devlake_pull_requests.jsonl +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/demo/mobile/summary/manifest.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/demo/mobile/summary/prs.jsonl +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/demo/mobile/summary/tests.jsonl +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/demo/mobile/supply.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/demo/mobile/vulns.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/demo/payments-api/alerts.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/demo/payments-api/app.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/demo/payments-api/community.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/demo/payments-api/connectors.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/demo/payments-api/data.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/demo/payments-api/decisions.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/demo/payments-api/delivery.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/demo/payments-api/deps.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/demo/payments-api/flow.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/demo/payments-api/health.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/demo/payments-api/insights.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/demo/payments-api/pulse.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/demo/payments-api/security.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/demo/payments-api/summary/ci_jobs.jsonl +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/demo/payments-api/summary/devlake_project_pr_metrics.jsonl +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/demo/payments-api/summary/devlake_pull_requests.jsonl +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/demo/payments-api/summary/manifest.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/demo/payments-api/summary/prs.jsonl +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/demo/payments-api/summary/tests.jsonl +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/demo/payments-api/supply.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/demo/payments-api/vulns.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/demo/portal.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/demo/settings.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/demo/web-app/alerts.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/demo/web-app/app.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/demo/web-app/community.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/demo/web-app/connectors.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/demo/web-app/data.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/demo/web-app/decisions.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/demo/web-app/delivery.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/demo/web-app/deps.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/demo/web-app/flow.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/demo/web-app/health.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/demo/web-app/insights.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/demo/web-app/pulse.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/demo/web-app/security.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/demo/web-app/summary/ci_jobs.jsonl +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/demo/web-app/summary/devlake_project_pr_metrics.jsonl +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/demo/web-app/summary/devlake_pull_requests.jsonl +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/demo/web-app/summary/manifest.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/demo/web-app/summary/prs.jsonl +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/demo/web-app/summary/tests.jsonl +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/demo/web-app/supply.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/demo/web-app/vulns.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/fonts/plex-mono-400.woff2 +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/fonts/plex-sans-400.woff2 +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/fonts/plex-sans-600.woff2 +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/fonts/plex-sans-condensed-700.woff2 +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/help/connectors.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/help/getting-started.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/help/privacy-and-security.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/help/reference.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/main.css +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/main.js +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/pages/about.css +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/pages/about.js +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/pages/activity.css +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/pages/activity.js +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/pages/agents.css +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/pages/agents.js +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/pages/ci.css +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/pages/ci.js +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/pages/community.css +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/pages/community.js +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/pages/connections.css +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/pages/connections.js +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/pages/delivery.css +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/pages/delivery.js +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/pages/deps.css +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/pages/deps.js +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/pages/explore.css +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/pages/explore.js +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/pages/health.css +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/pages/health.js +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/pages/help.css +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/pages/help.js +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/pages/insights.css +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/pages/insights.js +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/pages/investment.css +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/pages/investment.js +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/pages/overview.css +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/pages/overview.js +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/pages/portal.css +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/pages/portal.js +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/pages/prs.css +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/pages/prs.js +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/pages/settings.css +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/pages/settings.js +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/pages/setup.css +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/pages/setup.js +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/pages/standing.css +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/pages/standing.js +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/pages/welcome-sheet.js +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/pages/welcome.js +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/app/settings-workflow.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/index.html +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/site/index.html +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/site/integrations.html +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/src/stackvitals/web/site/setup.html +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/templates/gitlab/stackvitals.yml +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/ci_fake.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/conftest.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/fixtures/issue_page.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/fixtures/osv-scan.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/fixtures/pr_page.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/fixtures/repo_meta.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_actions_vulns.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_adjudicate.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_adoption_study.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_agent_leaderboard.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_agent_ledger.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_agreement_nudges.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_ai_markers.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_ai_matched.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_ai_outcomes.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_ai_spend.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_api_cost.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_app_review.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_archive_cli.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_audit_bench.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_audit_docs.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_audit_files.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_audit_guarddog.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_audit_mcp_messages.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_audit_requests.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_audit_sql.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_audit_uicli.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_audit_workflows.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_base_images.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_began_after.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_bench.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_bench_by_repo.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_bench_deploys.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_bench_report_delivery.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_bench_stars.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_branch_growth.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_bucket.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_bug_backlog.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_capex.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_catalog_descriptor.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_change_risk.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_changes_14d.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_chat.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_ci_action.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_ci_action_pr.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_ci_already_failing.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_ci_analyze.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_ci_analyze_tests.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_ci_artifacts.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_ci_automation.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_ci_began.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_ci_bench.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_ci_bench_wiring.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_ci_burnin.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_ci_cli.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_ci_collect.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_ci_comment_shape.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_ci_cost.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_ci_decisions.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_ci_depth.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_ci_evidence.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_ci_feedback.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_ci_feedback_all.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_ci_fingerprint.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_ci_gitlab.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_ci_groups.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_ci_impact.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_ci_issue_lifecycle.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_ci_kinds.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_ci_masking.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_ci_maybe_flaky.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_ci_mcp.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_ci_monitors.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_ci_outside.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_ci_outside_ci_edit.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_ci_pr_details.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_ci_push_evidence.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_ci_quarantine_mark.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_ci_report.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_ci_report_formats.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_ci_retry.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_ci_review_fixes.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_ci_safe_rule.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_ci_settings.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_ci_surfaces_m3.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_ci_test_verdict.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_ci_testreports.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_ci_triage.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_ci_triggers_script.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_ci_upload.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_ci_verdict_check.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_ci_webhook_formats.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_code_hosts.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_code_survival.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_community_action.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_community_affiliation.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_community_analyze.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_community_bench.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_community_cli.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_community_collect.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_community_context.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_community_dependency.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_community_discussions.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_community_fetch.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_community_report.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_community_stated.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_config.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_connector_checks.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_connector_framework.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_connector_review.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_connectors.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_connectors_chat.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_connectors_discourse.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_connectors_epics.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_connectors_writeback.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_contribute_brief.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_contribute_prospective.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_contribute_review.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_convert.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_core_actors.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_core_agreements.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_core_alerts.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_core_appdata.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_core_decisions.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_core_delivery.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_core_delivery_peers.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_core_delivery_surfaces.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_core_digest.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_core_digest_step.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_core_explore.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_core_export.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_core_findings.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_core_findings_ledger.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_core_insights.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_core_insights_surfaces.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_core_metrics.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_core_model.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_core_otel.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_core_propose.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_core_pulse.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_core_recovery.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_core_request_wiring.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_core_requests.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_core_requests_wording.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_core_roles_wiring.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_core_runner.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_core_schema.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_core_services.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_core_settings.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_core_sql_org.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_core_stats.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_core_store.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_core_summary.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_core_summary_churn.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_core_tomledit.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_core_ui.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_core_webapp.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_core_webapp_version.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_core_workspace.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_cost_guard.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_count_repos.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_coverage.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_crawl_cli.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_crawl_fetch.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_crawl_outcomes.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_crawl_queries.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_crawl_runner.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_crawl_seed.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_crawl_state.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_crawl_writer.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_delivery_bench.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_delivery_deploy_check.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_delivery_rules_m2.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_dep_bumps.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_dep_crawl.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_dep_exploits.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_dep_fixed_versions.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_dep_ledger.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_dep_map.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_dep_osv.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_dep_owners.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_dep_top.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_dep_trend_quiet.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_dep_trends.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_dep_watch.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_deploy_attempts.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_deploy_ranges.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_deployment_history.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_deployment_list.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_deps_action.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_deps_cli.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_deps_dossier.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_deps_hygiene.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_deps_imports.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_deps_lookalike.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_deps_paths.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_deps_policy.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_deps_reach.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_deps_release.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_deps_review_fixes.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_deps_runtimes.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_deps_vulns.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_devlake_cicd.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_dora_evidence.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_dora_proof.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_dora_rows.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_dora_weeks.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_editor_marks.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_enterprise_server.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_events.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_explain_cli.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_fair.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_fixplan.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_flake_code_kinds.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_flaky_natural.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_flaky_sample.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_flaky_score_fair.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_flaky_test_cost.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_flaky_tickets.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_flow_analyze.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_flow_automate.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_flow_bench_pipeline.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_flow_collect.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_flow_collect_delivery.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_flow_definitions.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_flow_m2.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_flow_peers.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_flow_preflight.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_flow_report.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_flow_round2.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_flow_round3.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_flow_triage.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_flow_windows.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_flow_wiring.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_fork_reports.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_gitlab_action.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_gitlab_delivery.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_graphql.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_health.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_identities.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_identity.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_identity_everywhere.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_identity_match.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_init_cli.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_insights_chains.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_investment.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_jira_fields.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_knowledge_names.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_labeller.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_llms_txt.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_local_run.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_m1_small_fixes.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_masking_card.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_mcp_core.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_mcp_provenance.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_merge_queue.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_mergescout_token.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_modular_install.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_nulls_power.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_numbers_review.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_odds_backtest.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_outside_fresh.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_owners.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_pagers_copilot.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_pages_deploy.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_parsing_review.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_peer_fit.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_polish_m1.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_polish_m2.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_polish_review.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_portal_app_facts.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_portal_campaigns.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_portal_catalog.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_portal_checks.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_portal_export.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_portal_golden.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_portal_handcheck.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_portal_history.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_portal_html.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_portal_m1.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_portal_nudges.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_portal_reviews.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_portal_rollup.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_portal_scorecard.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_pr_exclusions.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_pr_licences.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_pr_rules.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_prelaunch.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_production_branches.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_project_dora.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_pulse_trend.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_quarantine_expiry.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_quarantine_runners.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_quarantine_runtime.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_recorded.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_relay_and_polish.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_release_quality.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_releases.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_releases_ratelimit.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_report.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_report_validate.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_response_times.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_result_quality.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_resync.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_review_fixes.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_review_fixes_action.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_review_fixes_p3.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_review_fixes_requests.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_review_m3.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_sample.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_schema_sections.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_scorecard_agreement.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_security_checks.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_selfheal.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_services.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_setup_check.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_setup_template.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_shared_bench.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_shell_app_link.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_shrinkage_groups.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_signals_check.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_signals_cli.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_signals_identity.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_signals_issues.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_signals_labels.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_signals_repo_stats.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_signals_walls.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_snapshot_build.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_snapshot_publish.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_sonar.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_state_report.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_store.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_store_cli.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_stream.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_suite_packaging.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_supply.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_sweep.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_team_dora.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_test_variants.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_tool_action_pack.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_tool_live.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_tool_queries.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_tool_server.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_tool_speed.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_tool_store.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_tool_tracking.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_tracker.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_triage_math.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_triage_pipeline.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_uncertainty.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_verdict_feedback.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_verdict_strict.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_vulns_dev_only.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_vulns_ignores.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_vulns_inputs.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_web_build.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_web_next_setup.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_web_replay_parity.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_what_changed.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/local/test_work_calendar.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/signals_data.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/test_flow_accuracy.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/test_flow_bench.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/test_flow_ci.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/test_flow_community.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/test_flow_connectors.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/test_flow_contribute.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/test_flow_core.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/test_flow_crawl.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/test_flow_decisions.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/test_flow_delivery.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/test_flow_deps.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/test_flow_discover.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/test_flow_github.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/test_flow_insights.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/test_flow_portal.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/test_flow_signals.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/test_flow_snapshot.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/test_flow_store.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/test_flow_surfaces.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/test_flow_team.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/test_flow_tool.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/test_flow_web.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/tests/tool_data.py +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/README.md +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/brand/cube-128.png +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/brand/cube-256.png +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/brand/cube-64.png +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/build.mjs +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/demo/extra-ci.mjs +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/demo/extra-delivery.mjs +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/demo/extra-deps.mjs +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/demo/extra-people.mjs +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/demo/extra-portal.mjs +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/demo/settings.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/demo/source.mjs +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/e2e/defaults.spec.ts +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/e2e/fixtures.ts +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/e2e/flows.spec.ts +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/e2e/links.spec.ts +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/e2e/playwright.config.ts +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/e2e/serve.mjs +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/e2e/sweep.spec.ts +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/e2e/welcome.spec.ts +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/index.html +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/package-lock.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/package.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/scripts/docs.mjs +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/app/AddRepo.tsx +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/app/App.tsx +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/app/Brand.tsx +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/app/Profile.tsx +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/app/jump.ts +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/app/router.ts +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/app/routes.ts +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/boot.ts +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/brand/Logo.tsx +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/charts/BarChart.tsx +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/charts/MetricHero.tsx +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/charts/ScrubChart.tsx +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/charts/Sparkline.tsx +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/charts/metric.ts +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/data/files.ts +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/data/format.ts +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/data/repos.ts +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/data/requestIssue.ts +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/data/source.ts +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/data/store.ts +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/data/theme.ts +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/data/types.ts +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/data/write.ts +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/features/Decide.tsx +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/features/Evidence.tsx +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/features/Health.tsx +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/features/SetupRunning.tsx +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/features/agents-data.ts +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/features/brand-logos.ts +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/features/connect.css +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/features/connect.tsx +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/features/connectRepos.tsx +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/features/connections-data.ts +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/features/connstatus.ts +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/features/helpLink.ts +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/features/markdown.ts +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/features/sealbox.ts +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/features/sealedbox.d.ts +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/features/secrets.ts +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/features/settingsApply.ts +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/features/settingsModel.ts +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/features/settingsPending.ts +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/features/settingsReplay.ts +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/features/settingsReview.tsx +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/features/settingsToml.ts +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/features/text-css.d.ts +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/features/vitals.ts +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/github/caps.ts +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/github/client.ts +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/github/config.ts +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/github/detect.ts +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/github/diff.ts +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/github/links.ts +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/github/mine.ts +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/github/names.ts +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/github/oauth.ts +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/github/open.ts +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/github/session.ts +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/github/setup.ts +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/github/signout.ts +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/github/token.ts +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/github/watch.ts +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/github/workflow.ts +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/main.tsx +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/pages/about/parts.tsx +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/pages/about-accuracy.d.ts +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/pages/about.css +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/pages/about.tsx +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/pages/accuracy-data.js +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/pages/activity.css +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/pages/activity.tsx +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/pages/agents/parts.tsx +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/pages/agents.css +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/pages/agents.tsx +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/pages/ci/more.tsx +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/pages/ci/parts.tsx +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/pages/ci/setup.tsx +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/pages/ci/workflowgen.ts +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/pages/ci.css +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/pages/ci.tsx +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/pages/community/command.ts +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/pages/community/report.tsx +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/pages/community.css +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/pages/community.tsx +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/pages/connections.css +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/pages/connections.tsx +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/pages/delivery/blocks.css +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/pages/delivery/blocks.tsx +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/pages/delivery/more.tsx +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/pages/delivery/sources.tsx +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/pages/delivery.css +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/pages/delivery.tsx +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/pages/deps/blocks.css +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/pages/deps/blocks.tsx +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/pages/deps/lookup.ts +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/pages/deps/scanning.ts +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/pages/deps/security.tsx +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/pages/deps/tools.tsx +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/pages/deps.css +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/pages/deps.tsx +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/pages/explore/parts.tsx +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/pages/explore/query.ts +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/pages/explore.css +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/pages/explore.tsx +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/pages/health.css +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/pages/health.tsx +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/pages/help/commands.tsx +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/pages/help.css +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/pages/help.tsx +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/pages/insights/parts.tsx +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/pages/insights.css +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/pages/insights.tsx +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/pages/investment.css +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/pages/investment.tsx +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/pages/overview/parts.tsx +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/pages/overview.css +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/pages/overview.tsx +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/pages/portal/access.ts +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/pages/portal/panel.css +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/pages/portal/panel.tsx +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/pages/portal/parts.tsx +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/pages/portal/setup.ts +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/pages/portal/tools.tsx +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/pages/portal.css +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/pages/portal.tsx +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/pages/prs/more.tsx +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/pages/prs/parts.tsx +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/pages/prs/preflight.ts +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/pages/prs.css +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/pages/prs.tsx +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/pages/settings.css +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/pages/settings.tsx +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/pages/setup.css +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/pages/setup.tsx +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/pages/standing.css +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/pages/standing.tsx +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/pages/welcome-sheet.css +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/pages/welcome-sheet.tsx +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/pages/welcome.tsx +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/styles/base.css +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/styles/charts.css +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/styles/components.css +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/styles/index.css +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/styles/sheet.css +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/styles/shell.css +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/styles/tokens.css +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/ui/Button.tsx +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/ui/Page.tsx +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/ui/Popover.tsx +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/ui/Portal.tsx +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/ui/Sheet.tsx +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/ui/Table.tsx +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/ui/bits.tsx +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/ui/controls.tsx +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/ui/icons.tsx +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/ui/motion.ts +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/src/ui/prefill.tsx +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/test/ciworkflow.test.ts +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/test/client.test.ts +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/test/connstatus.test.ts +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/test/depstools.test.ts +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/test/explorequery.test.ts +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/test/fake.ts +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/test/links.test.ts +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/test/load.mjs +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/test/markdown.test.ts +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/test/portalsetup.test.ts +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/test/preflight.test.ts +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/test/run.mjs +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/test/safety.test.ts +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/test/secrets.test.ts +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/test/settings.test.ts +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/test/setup.test.ts +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/test/workflow.test.ts +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/web/tsconfig.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/worker/README.md +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/worker/package.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/worker/relay/README.md +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/worker/relay/package.json +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/worker/relay/src/index.js +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/worker/relay/test/index.test.mjs +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/worker/relay/wrangler.toml +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/worker/src/index.js +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/worker/test/index.test.mjs +0 -0
- {stackvitals-0.1.3 → stackvitals-0.1.4}/worker/wrangler.toml +0 -0
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
name: Bug report
|
|
2
|
+
description: Something in StackVitals is wrong or broken
|
|
3
|
+
labels: ["bug"]
|
|
4
|
+
body:
|
|
5
|
+
- type: markdown
|
|
6
|
+
attributes:
|
|
7
|
+
value: |
|
|
8
|
+
Thanks for reporting. A wrong verdict or number is a bug too, and the most useful kind.
|
|
9
|
+
For a security problem, don't open an issue: use the **Security** tab's private reporting instead.
|
|
10
|
+
- type: textarea
|
|
11
|
+
id: what
|
|
12
|
+
attributes:
|
|
13
|
+
label: What happened
|
|
14
|
+
description: What you did, what you expected, and what happened instead.
|
|
15
|
+
validations:
|
|
16
|
+
required: true
|
|
17
|
+
- type: dropdown
|
|
18
|
+
id: where
|
|
19
|
+
attributes:
|
|
20
|
+
label: Where
|
|
21
|
+
options:
|
|
22
|
+
- The Action (workflow run, PR comment, verdict check)
|
|
23
|
+
- The web app (dashboard)
|
|
24
|
+
- The command line (stackvitals ...)
|
|
25
|
+
- The MCP server (an AI agent)
|
|
26
|
+
- Setup (stackvitals init or the app's Setup page)
|
|
27
|
+
- The docs
|
|
28
|
+
validations:
|
|
29
|
+
required: true
|
|
30
|
+
- type: input
|
|
31
|
+
id: version
|
|
32
|
+
attributes:
|
|
33
|
+
label: StackVitals version
|
|
34
|
+
description: "`pip show stackvitals` shows it. For the Action, say if you use `@v0` or a pinned tag."
|
|
35
|
+
placeholder: "0.1.4"
|
|
36
|
+
validations:
|
|
37
|
+
required: true
|
|
38
|
+
- type: dropdown
|
|
39
|
+
id: visibility
|
|
40
|
+
attributes:
|
|
41
|
+
label: Repo
|
|
42
|
+
options:
|
|
43
|
+
- Public
|
|
44
|
+
- Private
|
|
45
|
+
- Not about a repo
|
|
46
|
+
- type: input
|
|
47
|
+
id: link
|
|
48
|
+
attributes:
|
|
49
|
+
label: A link we can look at
|
|
50
|
+
description: The workflow run, pull request or app page, if the repo is public. Leave out anything private.
|
|
51
|
+
- type: textarea
|
|
52
|
+
id: logs
|
|
53
|
+
attributes:
|
|
54
|
+
label: Job summary or error output
|
|
55
|
+
description: Paste the relevant part. Remove tokens, private names and anything you don't want public.
|
|
56
|
+
render: text
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
blank_issues_enabled: true
|
|
2
|
+
contact_links:
|
|
3
|
+
- name: Ask a question
|
|
4
|
+
url: https://github.com/stackvitals/stackvitals/discussions/categories/q-a
|
|
5
|
+
about: How to set something up or read a number. Discussions are the best place for questions.
|
|
6
|
+
- name: Report a security problem
|
|
7
|
+
url: https://github.com/stackvitals/stackvitals/security/advisories/new
|
|
8
|
+
about: Privately, through GitHub's reporting form. Please don't open a public issue.
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
name: Feature request
|
|
2
|
+
description: Something StackVitals should do, or do differently
|
|
3
|
+
labels: ["enhancement"]
|
|
4
|
+
body:
|
|
5
|
+
- type: textarea
|
|
6
|
+
id: problem
|
|
7
|
+
attributes:
|
|
8
|
+
label: The problem
|
|
9
|
+
description: What you're trying to find out or get done, and what makes it hard today.
|
|
10
|
+
validations:
|
|
11
|
+
required: true
|
|
12
|
+
- type: textarea
|
|
13
|
+
id: idea
|
|
14
|
+
attributes:
|
|
15
|
+
label: What would help
|
|
16
|
+
description: What you'd like StackVitals to show or do. A rough idea is fine.
|
|
17
|
+
validations:
|
|
18
|
+
required: true
|
|
19
|
+
- type: dropdown
|
|
20
|
+
id: module
|
|
21
|
+
attributes:
|
|
22
|
+
label: Area
|
|
23
|
+
options:
|
|
24
|
+
- CI Health
|
|
25
|
+
- Team Flow and Pull Requests
|
|
26
|
+
- Delivery and DORA
|
|
27
|
+
- Insights
|
|
28
|
+
- Dependencies
|
|
29
|
+
- Community
|
|
30
|
+
- Portal
|
|
31
|
+
- The web app
|
|
32
|
+
- The command line or MCP server
|
|
33
|
+
- Setup and integrations
|
|
34
|
+
- Something else
|
|
35
|
+
- type: textarea
|
|
36
|
+
id: else
|
|
37
|
+
attributes:
|
|
38
|
+
label: Anything else
|
|
39
|
+
description: Tools you use for this today, links, or examples.
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
## What this changes
|
|
2
|
+
|
|
3
|
+
<!-- What changes for someone using StackVitals, in a sentence or two. Link the issue if there is one. -->
|
|
4
|
+
|
|
5
|
+
## How it was checked
|
|
6
|
+
|
|
7
|
+
- [ ] Tests pass: `uv run --extra dev pytest tests -q`
|
|
8
|
+
- [ ] If the web app changed: `cd web && npm run build && npm test`, and the rebuilt `src/stackvitals/web/` is committed
|
|
9
|
+
- [ ] If a rule behind a verdict or number changed: its entry in `bench/accuracy/registry.json` and the regenerated
|
|
10
|
+
docs (`python bench/accuracy/summary.py`)
|
|
11
|
+
- [ ] If it reaches a new host or needs a new permission: said so below
|
|
12
|
+
|
|
13
|
+
## Anything reviewers should know
|
|
14
|
+
|
|
15
|
+
<!-- Trade-offs, follow-ups, or what you weren't sure about. -->
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
name: Demo site
|
|
2
|
+
# Publishes the landing page and the app's example-data demo to GitHub Pages. The site is static and demo-only: its
|
|
3
|
+
# pages may fetch nothing but their own files, so there is no API or backend behind it to call or overload.
|
|
4
|
+
on:
|
|
5
|
+
release:
|
|
6
|
+
types: [published]
|
|
7
|
+
push:
|
|
8
|
+
branches: [main]
|
|
9
|
+
paths: ["src/stackvitals/web/**", "src/stackvitals/site.py"]
|
|
10
|
+
workflow_dispatch:
|
|
11
|
+
permissions: {}
|
|
12
|
+
concurrency:
|
|
13
|
+
group: pages
|
|
14
|
+
cancel-in-progress: false
|
|
15
|
+
jobs:
|
|
16
|
+
build:
|
|
17
|
+
if: github.repository == 'stackvitals/stackvitals'
|
|
18
|
+
runs-on: ubuntu-latest
|
|
19
|
+
timeout-minutes: 10
|
|
20
|
+
permissions:
|
|
21
|
+
contents: read
|
|
22
|
+
steps:
|
|
23
|
+
- uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09 # v5.1.0
|
|
24
|
+
with:
|
|
25
|
+
persist-credentials: false
|
|
26
|
+
- uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0
|
|
27
|
+
- name: Build the demo-only site
|
|
28
|
+
run: uv run --no-dev stackvitals site build --out _site --demo-only
|
|
29
|
+
- uses: actions/upload-pages-artifact@fc324d3547104276b827a68afc52ff2a11cc49c9 # v5.0.0
|
|
30
|
+
with:
|
|
31
|
+
path: _site
|
|
32
|
+
deploy:
|
|
33
|
+
needs: build
|
|
34
|
+
runs-on: ubuntu-latest
|
|
35
|
+
timeout-minutes: 10
|
|
36
|
+
permissions:
|
|
37
|
+
pages: write
|
|
38
|
+
id-token: write # Pages checks the deployment with GitHub's OIDC token
|
|
39
|
+
environment:
|
|
40
|
+
name: github-pages
|
|
41
|
+
url: ${{ steps.deployment.outputs.page_url }}
|
|
42
|
+
steps:
|
|
43
|
+
- id: deployment
|
|
44
|
+
uses: actions/deploy-pages@368f82528645a54fb793d4d04e342629a3f51346 # v5.0.1
|
|
@@ -1,5 +1,21 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.1.4 (2026-10-31)
|
|
4
|
+
|
|
5
|
+
- PR verdicts catch more failures a change causes (from user feedback):
|
|
6
|
+
- a failure whose flakes in the last 30 days all came from this same pull request reads **New**, not likely flaky: a
|
|
7
|
+
race the change added fails now and then and passes on a re-run;
|
|
8
|
+
- a likely flake that fails on this pull request far more often than on the default branch (2 or more failures, under
|
|
9
|
+
a 5% chance at main's rate) reads **New**: the change made it worse;
|
|
10
|
+
- a likely flake shows its failure rate on the default branch; a first flaky-looking failure of a check that passed
|
|
11
|
+
every recent default-branch run says so;
|
|
12
|
+
- when a failure blamed on the change, or one of those checks, passes on a re-run of the same commit, the comment
|
|
13
|
+
says a green re-run doesn't clear it, instead of "CI is passing now".
|
|
14
|
+
These rules are new and not yet measured on labelled failures; [rules.md](docs/rules.md) says so.
|
|
15
|
+
- A public demo site, https://stackvitals.github.io/stackvitals/, built with `stackvitals site build --demo-only`: it
|
|
16
|
+
fetches nothing outside itself, and its setup links point at the README. The landing page uses the app's font.
|
|
17
|
+
- `glama.json`, so the Glama listing of the MCP server is maintained by the project.
|
|
18
|
+
|
|
3
19
|
## 0.1.3 (2026-10-31)
|
|
4
20
|
|
|
5
21
|
- The app's About page and the project site say Apache 2.0 (they said MIT); the site shows the cube logo and the
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: stackvitals
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.4
|
|
4
4
|
Summary: Free, open-source developer suite: CI health, team flow, dependencies, community, and MergeScout for contributors.
|
|
5
5
|
Project-URL: Homepage, https://github.com/stackvitals/stackvitals
|
|
6
6
|
Project-URL: Documentation, https://github.com/stackvitals/stackvitals/tree/main/docs
|
|
@@ -140,6 +140,34 @@
|
|
|
140
140
|
"strength": "early observation",
|
|
141
141
|
"strength_why": "2 held-out matches in 150 failures"
|
|
142
142
|
},
|
|
143
|
+
{
|
|
144
|
+
"id": "flaky.only_this_pr",
|
|
145
|
+
"card": "flaky",
|
|
146
|
+
"version": 1,
|
|
147
|
+
"rule": "A failure that would read likely flaky, flaked before or maybe flaky, whose flakes in the last 30 days all came from this same pull request (none on the default branch or other pull requests), reads new: a race or order dependence the change added fails now and then and passes on a re-run.",
|
|
148
|
+
"tuned_on": "none: a public suggestion (2026-10-31) with the failure it describes written as tests",
|
|
149
|
+
"held_out": "not yet replayed on the labelled pull-request failures",
|
|
150
|
+
"pass_bar": "none set yet; it only moves a call toward the change and never excuses a failure",
|
|
151
|
+
"bar_set": "2026-10-31",
|
|
152
|
+
"result": "untested on labels: the replay needs the held-out reads again",
|
|
153
|
+
"revisions": [],
|
|
154
|
+
"strength": "early observation",
|
|
155
|
+
"strength_why": "not yet measured on labelled failures"
|
|
156
|
+
},
|
|
157
|
+
{
|
|
158
|
+
"id": "flaky.worse_on_pr",
|
|
159
|
+
"card": "flaky",
|
|
160
|
+
"version": 1,
|
|
161
|
+
"rule": "A likely flake that failed 2 or more times on this pull request's runs, where that many failures would come from its default-branch rate (smoothed by one failure and one pass, over 10 or more runs) less than 5% of the time, reads new: the change made a flaky check fail more often.",
|
|
162
|
+
"tuned_on": "none: a public suggestion (2026-10-31) with the failure it describes written as tests",
|
|
163
|
+
"held_out": "not yet measured; the plan is regressions seeded into repos of the stackvitals organisation",
|
|
164
|
+
"pass_bar": "none set yet; it only moves a call toward the change and never excuses a failure",
|
|
165
|
+
"bar_set": "2026-10-31",
|
|
166
|
+
"result": "untested on labels",
|
|
167
|
+
"revisions": [],
|
|
168
|
+
"strength": "early observation",
|
|
169
|
+
"strength_why": "not yet measured on seeded or labelled failures"
|
|
170
|
+
},
|
|
143
171
|
{
|
|
144
172
|
"id": "flaky.pr_details",
|
|
145
173
|
"card": "flaky",
|
|
@@ -17,7 +17,7 @@ page is built from those cards' result files by `bench/accuracy/summary.py`; the
|
|
|
17
17
|
- No person has audited the labels yet.
|
|
18
18
|
|
|
19
19
|
**How sure.** A rule is an *early observation* when its check rests on few cases; its numbers are a direction,
|
|
20
|
-
not a settled rate: `flaky.already_failing` (1 of 6 held-out matches with the same error); `flaky.maybe_flaky` (2 held-out matches in 150 failures); `flaky.pr_details` (24 matches in 4 repos, one repo gave most); `dora.incident_link` (15 reports named the release that broke). A rule's *bar* is the accuracy it had to reach before it shipped; for the flaky-test rules it is that at most 5% of the failures it calls flaky were really caused by the change (*masking*: a real failure hidden as a flake). A rule whose bar *failed* is kept only where failing costs nothing it promised: `flaky.known_flaky` (too few calls to show 5%: the label says "likely", the advice says to check the error first, and the verdict check waits for a green re-run). The rest are validated: checked against their bar, on held-out data where the rule has one ([rules.md](rules.md) says which).
|
|
20
|
+
not a settled rate: `flaky.already_failing` (1 of 6 held-out matches with the same error); `flaky.maybe_flaky` (2 held-out matches in 150 failures); `flaky.only_this_pr` (not yet measured on labelled failures); `flaky.worse_on_pr` (not yet measured on seeded or labelled failures); `flaky.pr_details` (24 matches in 4 repos, one repo gave most); `dora.incident_link` (15 reports named the release that broke). A rule's *bar* is the accuracy it had to reach before it shipped; for the flaky-test rules it is that at most 5% of the failures it calls flaky were really caused by the change (*masking*: a real failure hidden as a flake). A rule whose bar *failed* is kept only where failing costs nothing it promised: `flaky.known_flaky` (too few calls to show 5%: the label says "likely", the advice says to check the error first, and the verdict check waits for a green re-run). The rest are validated: checked against their bar, on held-out data where the rule has one ([rules.md](rules.md) says which).
|
|
21
21
|
|
|
22
22
|
**Reproduce a number.** `python bench/accuracy/reproduce.py list` names the command behind every result file;
|
|
23
23
|
`reproduce.py check <card>` re-scores it and says whether the numbers match. Scoring reads the evidence each
|
|
@@ -29,6 +29,10 @@ Numbers come from the accuracy cards ([accuracy.md](accuracy.md)).
|
|
|
29
29
|
readable ones ([features card](../bench/accuracy/features/README.md)).
|
|
30
30
|
- Jobs with rare flakes look like "never flaked" in a short window. Status precision (re-running pinned commits) is
|
|
31
31
|
not measured.
|
|
32
|
+
- A change that makes an already-flaky test fail more often reads "new" once it has failed 2 or more times on the pull
|
|
33
|
+
request, far above its rate on the default branch. Its first failure still reads "likely flaky" (one run can't tell a
|
|
34
|
+
5% flake from a 40% one), and a re-run can pass; the row shows the rate on the default branch to compare against.
|
|
35
|
+
How often this happens isn't measured yet.
|
|
32
36
|
- No verdict lets a failure through, and none says "safe to re-run". Likely flaky, outside failure, already failing,
|
|
33
37
|
maybe flaky and PR details all still block the verdict check until CI is green. GitLab job logs aren't read, so
|
|
34
38
|
there a job that flaked before is never called a likely flake.
|
|
@@ -84,14 +84,14 @@ never = ["tests/test_billing.py::test_charge"]
|
|
|
84
84
|
|
|
85
85
|
| Verdict | When | What to do |
|
|
86
86
|
|---|---|---|
|
|
87
|
-
| Likely flaky | The job flaked 3 or more times lately, once in the step that failed now; that step's log shows a flake's sign (an outside service, the runner or a wait failing with no failing test) and names no file the pull request changed. The row shows that evidence. | Check the error, then re-run it. |
|
|
87
|
+
| Likely flaky | The job flaked 3 or more times lately, once in the step that failed now; that step's log shows a flake's sign (an outside service, the runner or a wait failing with no failing test) and names no file the pull request changed. The row shows that evidence, and how often it failed on the default branch: a change can make a flaky test fail far more often. | Check the error, then re-run it. |
|
|
88
88
|
| Maybe yours | The job flaked before, but its failing step names a file the pull request changed. | Look at your change first. |
|
|
89
89
|
| Outside service or runner | The failing step's log says an outside service or the runner failed. | Re-run it. |
|
|
90
90
|
| Flaked before, needs a look | The job flaked before, but too rarely, elsewhere or with no flake's sign to rule out the change. | Look before re-running. |
|
|
91
91
|
| Already failing on main | The default branch fails with the same error (checked in the log: the same step alone isn't enough, since on labelled data 4 of 20 such failures were the change's own). | Not caused by this pull request. |
|
|
92
|
-
| Maybe flaky | It never flaked, but failed the way flaky checks do (a wait running out, a benchmark gate, a live service). | Re-run it once to tell. |
|
|
92
|
+
| Maybe flaky | It never flaked, but failed the way flaky checks do (a wait running out, a benchmark gate, a live service). When it passed all of 20 or more recent default-branch runs, the row says so. | Re-run it once to tell. If the re-run passes, the comment still asks for a look before merging. |
|
|
93
93
|
| PR details | A check on the pull request itself (a changelog label, a description checkbox, a title prefix) in a workflow that runs again when the PR is edited; 23 of 24 labelled matches were this. | Fix the PR, not the code. |
|
|
94
|
-
| New | None of the above. | Likely from this change. |
|
|
94
|
+
| New | None of the above; or every flake in the last 30 days came from this same pull request (a race or order dependence it added fails now and then and passes on a re-run); or a likely flake failed on this pull request far more often than on the default branch (2 or more failures, under a 5% chance at main's rate). | Likely from this change. If a re-run of the same commit passes, the comment says a green re-run doesn't clear it. |
|
|
95
95
|
|
|
96
96
|
A flaky failure also says what kind it looks like: the environment (timing, network, infrastructure, concurrency) or, when none of those shows, the test's own code (a resource leak, an async wait, time and time zones, randomness, floating point, state shared between tests, files, ordering), and a flaky job or test says when it began: its first flake, how many runs before it were clean, whether that could be chance, and the commits that reached the default branch the day before, worded only as surely as the history allows. Those commits are context, not a culprit: on 5 clear starts in 45 public repos they touched tests or the workflow 9 of 12 times, about as often as random commits there (8 of 12).
|
|
97
97
|
|
|
@@ -68,6 +68,28 @@ A failure with no flake history whose failing step (or test message) shows a wai
|
|
|
68
68
|
- **How sure:** early observation (2 held-out matches in 150 failures)
|
|
69
69
|
- **Changed 2026-10-23:** was track record over all 24 signature matches; why: the product says maybe flaky only for never-flaked failures (a whole-release review); effect: the track record counts never-flaked matches: 1 of 6 (0 of 4 tuning, 1 of 2 held out)
|
|
70
70
|
|
|
71
|
+
## `flaky.only_this_pr` (version 1)
|
|
72
|
+
|
|
73
|
+
A failure that would read likely flaky, flaked before or maybe flaky, whose flakes in the last 30 days all came from this same pull request (none on the default branch or other pull requests), reads new: a race or order dependence the change added fails now and then and passes on a re-run.
|
|
74
|
+
|
|
75
|
+
- **Card:** [bench/accuracy/flaky](../bench/accuracy/flaky/README.md)
|
|
76
|
+
- **Tuned on:** none: a public suggestion (2026-10-31) with the failure it describes written as tests
|
|
77
|
+
- **Checked on:** not yet replayed on the labelled pull-request failures
|
|
78
|
+
- **Bar:** none set yet; it only moves a call toward the change and never excuses a failure (set 2026-10-31)
|
|
79
|
+
- **Result:** untested on labels: the replay needs the held-out reads again
|
|
80
|
+
- **How sure:** early observation (not yet measured on labelled failures)
|
|
81
|
+
|
|
82
|
+
## `flaky.worse_on_pr` (version 1)
|
|
83
|
+
|
|
84
|
+
A likely flake that failed 2 or more times on this pull request's runs, where that many failures would come from its default-branch rate (smoothed by one failure and one pass, over 10 or more runs) less than 5% of the time, reads new: the change made a flaky check fail more often.
|
|
85
|
+
|
|
86
|
+
- **Card:** [bench/accuracy/flaky](../bench/accuracy/flaky/README.md)
|
|
87
|
+
- **Tuned on:** none: a public suggestion (2026-10-31) with the failure it describes written as tests
|
|
88
|
+
- **Checked on:** not yet measured; the plan is regressions seeded into repos of the stackvitals organisation
|
|
89
|
+
- **Bar:** none set yet; it only moves a call toward the change and never excuses a failure (set 2026-10-31)
|
|
90
|
+
- **Result:** untested on labels
|
|
91
|
+
- **How sure:** early observation (not yet measured on seeded or labelled failures)
|
|
92
|
+
|
|
71
93
|
## `flaky.pr_details` (version 1)
|
|
72
94
|
|
|
73
95
|
A pull-request failure in a workflow that also runs when the PR's title, description or labels change, with no failing test in the step, whose error lines are about the PR (the pull request, a PR title or label, a label to add or missing, a checkbox, checklist or template left unchecked or incomplete), reads PR details: fix the PR, not the code; it still blocks.
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "stackvitals"
|
|
7
|
-
version = "0.1.
|
|
7
|
+
version = "0.1.4"
|
|
8
8
|
description = "Free, open-source developer suite: CI health, team flow, dependencies, community, and MergeScout for contributors."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.11"
|
|
@@ -3,12 +3,12 @@
|
|
|
3
3
|
"name": "io.github.stackvitals/stackvitals",
|
|
4
4
|
"title": "StackVitals",
|
|
5
5
|
"description": "Known flaky tests, failing and slow CI, review flow, delivery and dependency risk from kept history.",
|
|
6
|
-
"version": "0.1.
|
|
6
|
+
"version": "0.1.4",
|
|
7
7
|
"packages": [
|
|
8
8
|
{
|
|
9
9
|
"registryType": "pypi",
|
|
10
10
|
"identifier": "stackvitals",
|
|
11
|
-
"version": "0.1.
|
|
11
|
+
"version": "0.1.4",
|
|
12
12
|
"runtimeHint": "uvx",
|
|
13
13
|
"transport": {
|
|
14
14
|
"type": "stdio"
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "0.1.4"
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
"""StackVitals: a free, open-source developer suite. MergeScout (package `mergescout`) is its Contribute module."""
|
|
2
|
-
__version__ = "0.1.
|
|
2
|
+
__version__ = "0.1.4"
|
|
@@ -15,7 +15,7 @@ from stackvitals.ci.automation import (alert_message, apply_decisions, new_flake
|
|
|
15
15
|
should_rerun, sync_issues)
|
|
16
16
|
from stackvitals.ci.collect import PR_EVENTS, collect
|
|
17
17
|
from stackvitals.ci.feedback import (MARKER, classify, find_pr, our_comment, quarantine_note, quarantined_failures,
|
|
18
|
-
remembered, render_comment, upsert_comment, verdict_payload, blamed_sha)
|
|
18
|
+
remembered, render_comment, upsert_comment, verdict_payload, blamed_sha, green_note)
|
|
19
19
|
from stackvitals.ci.owners import attach_owners, read_codeowners, test_files
|
|
20
20
|
from stackvitals.ci.report import detail_name, render_detail, render_html, render_markdown
|
|
21
21
|
from stackvitals.ci.store import DataStore
|
|
@@ -339,7 +339,7 @@ def _pr_feedback(recent: list[dict], latest: dict, payload: dict | None, api, da
|
|
|
339
339
|
existing = [c for c in api._get(f"/repos/{repo}/issues/{pr}/comments", {"per_page": 100}) or []
|
|
340
340
|
if MARKER in (c.get("body") or "")]
|
|
341
341
|
if existing:
|
|
342
|
-
outcomes.append(upsert_comment(api, pr,
|
|
342
|
+
outcomes.append(upsert_comment(api, pr, green_note(existing[0].get("body"), newest), existing[0]))
|
|
343
343
|
if verdict:
|
|
344
344
|
# A merge queue tests its own commit, so a required verdict must be posted there too.
|
|
345
345
|
queued = {r["sha"] for r in recent if r.get("ev") == "merge_group" and r.get("sha")}
|
|
@@ -72,6 +72,13 @@ def _pushes(runs: dict, final_att: dict, default_branch: str | None) -> list:
|
|
|
72
72
|
and r.get("ev") == "push" and default_branch is not None and r.get("br") == default_branch)
|
|
73
73
|
|
|
74
74
|
|
|
75
|
+
def _only_pr(prs: list) -> int | None:
|
|
76
|
+
"""The one pull request every flake came from (each flake's pull request numbers), else None."""
|
|
77
|
+
found = {tuple(p) for p in prs}
|
|
78
|
+
only = found.pop() if len(found) == 1 else ()
|
|
79
|
+
return only[0] if len(only) == 1 else None
|
|
80
|
+
|
|
81
|
+
|
|
75
82
|
def _state(ev_all: list, ev_win: list, runs_since: int, broken: bool, now: datetime) -> str:
|
|
76
83
|
if broken:
|
|
77
84
|
return "broken"
|
|
@@ -177,7 +184,10 @@ def _tests(data: dict, runs: dict, final_att: dict, since: datetime, now: dateti
|
|
|
177
184
|
status = monitors.evaluate(ev_all, ev_win, hist, runs_since, now, cfg, (previous or {}).get(tid),
|
|
178
185
|
pass_ms.get(tid, ()), fail_ms.get(tid, ()), tid)
|
|
179
186
|
lo, hi = wilson(len(ev_win), len(win))
|
|
187
|
+
main_win = [r for r in default if when[id(r)] >= since]
|
|
180
188
|
out.append({"id": tid, "suite": name, "runs": len(win),
|
|
189
|
+
# Its record on the default branch, so a first failure on a pull request can be checked against it.
|
|
190
|
+
"main_runs": len(main_win), "main_failures": sum(tid in failed_ids[id(r)] for r in main_win),
|
|
181
191
|
"workflow": runs[(mine[-1]["run"], mine[-1]["att"])].get("path") if mine else None,
|
|
182
192
|
"failures": fail_win[tid],
|
|
183
193
|
"flake_events": len(ev_win), "flake_rate": round(len(ev_win) / len(win), 4) if win else 0.0,
|
|
@@ -190,6 +200,8 @@ def _tests(data: dict, runs: dict, final_att: dict, since: datetime, now: dateti
|
|
|
190
200
|
# What kind of flake its usual failure looks like (timing, network, ...), only once it has flaked.
|
|
191
201
|
"flake": kind_of(messages[tid].most_common(1)[0][0]) if messages[tid] and ev_all else None,
|
|
192
202
|
"prs_affected": sorted({p for e in ev_win for p in e[2]}),
|
|
203
|
+
# Flakes from one pull request alone are that change's (a race it added), not a known flake.
|
|
204
|
+
"only_pr": _only_pr([e[2] for e in ev_win]),
|
|
193
205
|
# Which report (an OS or version in a matrix) the window's flakes came from.
|
|
194
206
|
"variants": dict(Counter(e[3].get("variant") for e in ev_win if e[3].get("variant")).most_common(5)),
|
|
195
207
|
# The newest runs that prove it, so anyone can open them.
|
|
@@ -474,15 +486,18 @@ def analyze(data: dict, now: datetime, window_days: int = 30, default_branch: st
|
|
|
474
486
|
slower = {"before_s": a, "after_s": b, "pct": round((b / a - 1) * 100)}
|
|
475
487
|
lo, hi = wilson(len(ev_win), len(in_window))
|
|
476
488
|
steps = Counter(e[2] for e in ev_win)
|
|
489
|
+
main_win = [j for r, j in in_window if default_branch is None or r.get("br") == default_branch]
|
|
477
490
|
out_jobs.append({
|
|
478
491
|
"workflow": path, "job": name, "runs": len(in_window),
|
|
492
|
+
"main_runs": len(main_win), "main_failures": sum(j["c"] in FAIL for j in main_win),
|
|
479
493
|
"failures": sum(1 for _, j in in_window if j["c"] in FAIL),
|
|
480
494
|
"flake_events": len(ev_win), "flake_rate": round(len(ev_win) / len(in_window), 4) if in_window else 0.0,
|
|
481
495
|
"rate_low": round(lo, 4), "rate_high": round(hi, 4), "state": state,
|
|
482
496
|
"last_flake": last_event.strftime("%Y-%m-%dT%H:%M:%SZ") if last_event else None,
|
|
483
497
|
"top_step": steps.most_common(1)[0][0] if steps else None, "flake_steps": sorted(steps),
|
|
484
498
|
"retry_minutes": round(sum(e[3] for e in ev_win), 1),
|
|
485
|
-
"prs_affected": sorted({p for e in ev_win for p in e[4]}), "
|
|
499
|
+
"prs_affected": sorted({p for e in ev_win for p in e[4]}), "only_pr": _only_pr([e[4] for e in ev_win]),
|
|
500
|
+
"evidence": [e[5] for e in ev_all[-5:]],
|
|
486
501
|
"median_s": _median([s for _, s in durations]), "p95_s": _pct([s for _, s in durations], 0.95),
|
|
487
502
|
"slower": slower, "trend": _trend((_t(r["cr"]), s) for r, s in durations),
|
|
488
503
|
# Each flake is placed at its run's start, so the run that flaked first counts after it, not before.
|
|
@@ -2,6 +2,7 @@ import json
|
|
|
2
2
|
import re
|
|
3
3
|
from collections import defaultdict
|
|
4
4
|
from importlib import resources
|
|
5
|
+
from math import comb
|
|
5
6
|
from datetime import timedelta
|
|
6
7
|
|
|
7
8
|
from stackvitals.ci.analyze import FAIL, _downstream, _failed_step
|
|
@@ -157,6 +158,11 @@ class Index:
|
|
|
157
158
|
self.jobs[(j["run"], j["att"])].append(j)
|
|
158
159
|
for t in data.get("tests") or []:
|
|
159
160
|
self.reports[(t["run"], t["att"])].append(t)
|
|
161
|
+
# Every attempt of each pull request's runs, to compare how often a check fails there with its rate on main.
|
|
162
|
+
self.runs, self.pr_attempts = runs, defaultdict(set)
|
|
163
|
+
for key, r in runs.items():
|
|
164
|
+
for p in r.get("pr") or ():
|
|
165
|
+
self.pr_attempts[p].add(key)
|
|
160
166
|
on_main = lambda r: r is not None and r.get("ev") == "push" and default_branch and r.get("br") == default_branch # noqa: E731
|
|
161
167
|
self.main_jobs, self.main_tests = defaultdict(list), defaultdict(list)
|
|
162
168
|
for (rid, att), js in self.jobs.items():
|
|
@@ -304,6 +310,71 @@ def _sharpen(verdict: str, text: str | None, changed: list | None, name: str = "
|
|
|
304
310
|
return verdict, sign, []
|
|
305
311
|
|
|
306
312
|
|
|
313
|
+
def _only_here(entry: dict | None, run: dict, verdict: str) -> str | None:
|
|
314
|
+
"""A flaky-looking verdict whose flakes all came from this pull request: the change's own (a race it added), so it
|
|
315
|
+
reads "new". Returns the detail then, else None."""
|
|
316
|
+
if verdict not in ("known flaky", "flaked before", "maybe flaky") or not entry or not entry.get("flake_events"):
|
|
317
|
+
return None
|
|
318
|
+
if entry.get("only_pr") is None or entry["only_pr"] not in (run.get("pr") or ()):
|
|
319
|
+
return None
|
|
320
|
+
times = "once" if entry["flake_events"] == 1 else f"{entry['flake_events']} times"
|
|
321
|
+
return (f"flaked {times} in the last 30 days, all of them only on this pull request and nowhere else: likely a race "
|
|
322
|
+
"or order dependence this change added; look at the change before re-running")
|
|
323
|
+
|
|
324
|
+
|
|
325
|
+
# Main runs a check must have passed, all of them, for a first flaky-looking failure on a pull request to be worth a look.
|
|
326
|
+
STABLE_MAIN = 20
|
|
327
|
+
# A likely flake reads new when this pull request's failures would come from its main rate less than 5% of the time,
|
|
328
|
+
# with at least 2 failures and 10 main runs to judge by (one failure can't tell a 5% flake from a 40% one).
|
|
329
|
+
WORSE_P, WORSE_MIN_FAILS, WORSE_MIN_MAIN = 0.05, 2, 10
|
|
330
|
+
|
|
331
|
+
|
|
332
|
+
def _pr_record(index: Index, run: dict, path: str | None = None, job: str | None = None, suite: str | None = None,
|
|
333
|
+
test: str | None = None) -> tuple[int, int]:
|
|
334
|
+
"""(failed, ran): how many attempts of this pull request's runs failed this job or test, out of those that ran it."""
|
|
335
|
+
keys = set().union(*(index.pr_attempts.get(p, set()) for p in run.get("pr") or ()))
|
|
336
|
+
failed = ran = 0
|
|
337
|
+
for key in keys:
|
|
338
|
+
if test:
|
|
339
|
+
reps = [r for r in index.reports.get(key, ()) if r["name"] == suite]
|
|
340
|
+
if reps:
|
|
341
|
+
ran += 1
|
|
342
|
+
failed += any(f[0] == test for r in reps for f in r["failed"])
|
|
343
|
+
elif index.runs[key].get("path") == path:
|
|
344
|
+
js = [j for j in index.jobs.get(key, ()) if j["n"] == job and (j["c"] in FAIL or j["c"] == "success")]
|
|
345
|
+
if js:
|
|
346
|
+
ran += 1
|
|
347
|
+
failed += any(j["c"] in FAIL for j in js)
|
|
348
|
+
return failed, ran
|
|
349
|
+
|
|
350
|
+
|
|
351
|
+
def _tail(k: int, n: int, p: float) -> float:
|
|
352
|
+
"""The chance of k or more failures in n runs at failure rate p."""
|
|
353
|
+
return sum(comb(n, i) * p ** i * (1 - p) ** (n - i) for i in range(k, n + 1))
|
|
354
|
+
|
|
355
|
+
|
|
356
|
+
def _main_record(item: dict, entry: dict | None, here: tuple[int, int] | None = None) -> dict:
|
|
357
|
+
"""The check's record on the default branch beside a flaky-looking verdict: a likely flake shows how often it fails
|
|
358
|
+
there; a "maybe flaky" check that passed every recent run there says so (still maybe flaky: never-flaked timeouts were
|
|
359
|
+
mostly real flakes on the labels), and a green re-run of it is flagged later."""
|
|
360
|
+
n = (entry or {}).get("main_runs") or 0
|
|
361
|
+
if item["verdict"] == "known flaky" and n:
|
|
362
|
+
# A change can make a flaky check fail far more often: its rate on main lets a reviewer compare.
|
|
363
|
+
bad = (entry or {}).get("main_failures") or 0
|
|
364
|
+
k, ran = here or (0, 0)
|
|
365
|
+
# The main rate is smoothed (one failure and one pass added) so a clean main never makes one failure damning.
|
|
366
|
+
if k >= WORSE_MIN_FAILS and n >= WORSE_MIN_MAIN and _tail(k, ran, (bad + 1) / (n + 2)) < WORSE_P:
|
|
367
|
+
return item | {"verdict": "new", "detail": f"flaky, but it failed {k} of {ran} runs on this pull request against "
|
|
368
|
+
f"{bad} of {n} ({bad / n:.0%}) on the default branch in the last 30 days: this change likely "
|
|
369
|
+
"made it fail more often; look at the change before re-running"}
|
|
370
|
+
return item | {"detail": item["detail"] + f"; on the default branch it failed {bad} of {n} runs ({bad / n:.0%}) "
|
|
371
|
+
"in the last 30 days: if it fails here more often than that, this change may have made it worse"}
|
|
372
|
+
if item["verdict"] != "maybe flaky" or n < STABLE_MAIN or (entry or {}).get("main_failures"):
|
|
373
|
+
return item
|
|
374
|
+
return item | {"stable_on_main": n, "detail": item["detail"] + f"; it passed all {n} runs on the default branch in the "
|
|
375
|
+
"last 30 days, so if a re-run passes, look for a race this change added"}
|
|
376
|
+
|
|
377
|
+
|
|
307
378
|
def _detail(entry: dict | None, verdict: str, message: str | None = None, step: str | None = None,
|
|
308
379
|
kind: str = "job", hint: str | None = None, sign: str | None = None, named: list | None = None,
|
|
309
380
|
changed: list | None = None) -> str:
|
|
@@ -371,9 +442,13 @@ def classify_run(data: dict, result: dict, run_id: int, logs: dict | None = None
|
|
|
371
442
|
verdict, sign, named = _sharpen(_test_verdict(entry), msg, changed, name=tid)
|
|
372
443
|
hint = flaky_signature(msg) if verdict == "new" else None
|
|
373
444
|
verdict = "maybe flaky" if hint else verdict
|
|
445
|
+
here = _only_here(entry, run, verdict)
|
|
446
|
+
verdict = "new" if here else verdict
|
|
374
447
|
item = _with_kind({"kind": "test", "name": tid, "verdict": verdict,
|
|
375
|
-
"detail": _detail(entry, verdict, msg, kind="test", hint=hint, sign=sign, named=named,
|
|
376
|
-
|
|
448
|
+
"detail": here or _detail(entry, verdict, msg, kind="test", hint=hint, sign=sign, named=named,
|
|
449
|
+
changed=changed)}, msg)
|
|
450
|
+
item = _main_record(item, entry, _pr_record(index, run, suite=(entry or {}).get("suite"), test=tid)
|
|
451
|
+
if item["verdict"] == "known flaky" else None)
|
|
377
452
|
before = on_main.get(tid) if verdict in ("new", "flaked before", "maybe flaky", "maybe yours") else None
|
|
378
453
|
if before and _same_test_failure(f, before):
|
|
379
454
|
item |= {"verdict": "already failing", "detail": f"failed the same way on the default branch {before['ago']} "
|
|
@@ -425,8 +500,12 @@ def classify_run(data: dict, result: dict, run_id: int, logs: dict | None = None
|
|
|
425
500
|
continue
|
|
426
501
|
hint = flaky_signature(mine) if verdict == "new" else None
|
|
427
502
|
verdict = "maybe flaky" if hint else verdict
|
|
428
|
-
|
|
429
|
-
|
|
503
|
+
here = _only_here(entry, run, verdict)
|
|
504
|
+
verdict = "new" if here else verdict
|
|
505
|
+
item = _with_kind({**base, "verdict": verdict, "detail": here or _detail(entry, verdict, step=failing_step, hint=hint,
|
|
506
|
+
sign=sign, named=named, changed=changed)}, mine)
|
|
507
|
+
item = _main_record(item, entry, _pr_record(index, run, path=run.get("path"), job=j["n"])
|
|
508
|
+
if item["verdict"] == "known flaky" else None)
|
|
430
509
|
if before:
|
|
431
510
|
item["detail"] += (f"; the default branch failed in this step {before['ago']} before this (run {before['run']})"
|
|
432
511
|
+ (", with a different error" if mine and theirs else ""))
|
|
@@ -527,6 +606,16 @@ def blamed_sha(body: str | None) -> str | None:
|
|
|
527
606
|
return m[1] if m else None
|
|
528
607
|
|
|
529
608
|
|
|
609
|
+
def green_note(body: str | None, sha: str) -> str:
|
|
610
|
+
"""Our comment once CI turns green: a warning, without blocking, when the failure it replaces on this same commit
|
|
611
|
+
looked like the change's own or failed a check main always passes (a race a change adds passes on a re-run)."""
|
|
612
|
+
if blamed_sha(body) != sha:
|
|
613
|
+
return f"{MARKER}\n### StackVitals: CI is passing now\nThe latest run passed."
|
|
614
|
+
return (f"{MARKER}\n### StackVitals: a re-run turned this green\nA failure on this commit looked like the change's own, or "
|
|
615
|
+
"failed a check that passes on the default branch every time, and passed when run again. That is how a race or "
|
|
616
|
+
"order dependence a change adds usually shows up: look at it before merging.\n<!-- stackvitals:blamed " + sha + " -->")
|
|
617
|
+
|
|
618
|
+
|
|
530
619
|
def render_comment(items: list[dict], repo: str, sha: str | None = None) -> str:
|
|
531
620
|
known = sum(i["verdict"] == "known flaky" for i in items)
|
|
532
621
|
outside = sum(i["verdict"] == "outside failure" for i in items)
|
|
@@ -557,7 +646,7 @@ def render_comment(items: list[dict], repo: str, sha: str | None = None) -> str:
|
|
|
557
646
|
if views:
|
|
558
647
|
# A dash only ever sits inside a JSON string here, so escaping it keeps any "-->" from closing the note.
|
|
559
648
|
folded.append("<!-- stackvitals:triage " + json.dumps(views, ensure_ascii=True).replace("-", "\\u002d") + " -->")
|
|
560
|
-
if sha and re.fullmatch(r"[0-9a-f]{7,40}", sha) and any(i["verdict"] in BLAMED for i in items):
|
|
649
|
+
if sha and re.fullmatch(r"[0-9a-f]{7,40}", sha) and any(i["verdict"] in BLAMED or i.get("stable_on_main") for i in items):
|
|
561
650
|
folded.append(f"<!-- stackvitals:blamed {sha} -->")
|
|
562
651
|
return "\n".join([MARKER, "### StackVitals: about this CI failure", head, "",
|
|
563
652
|
"| Verdict | What failed | Why |", "|---|---|---|", *rows, *more, "", *folded,
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "stackvitals-flaky-tests",
|
|
3
3
|
"displayName": "StackVitals flaky tests",
|
|
4
4
|
"description": "Marks the tests your CI history shows are flaky or broken, read from the repo's stackvitals-data branch.",
|
|
5
|
-
"version": "0.1.
|
|
5
|
+
"version": "0.1.4",
|
|
6
6
|
"publisher": "stackvitals",
|
|
7
7
|
"license": "Apache-2.0",
|
|
8
8
|
"engines": { "vscode": "^1.80.0" },
|